Bubble sheet multiple choice scan

asked 2017-04-22 11:06:18 -0600

SUPPER ANT gravatar image

This is the code I rewritten under the py but to this I do not understand how to do. please help me. or tell me how to do it. I do not understand py variable questionCnts add to what to do. When switching to java, what function to replace the contours.sort_contours function, I looked for java but did not find any function equivalent to this function.

code python

enter code here from imutils.perspective import four_point_transform
from imutils import contours
import numpy as np
import argparse
 import imutils
 import cv2

# construct the argument parse and parse the arguments
 ap = argparse.ArgumentParser()
 ap.add_argument("-i", "--image", required=True,
help="path to the input image")
 args = vars(ap.parse_args())

 # define the answer key which maps the question number
 # to the correct answer
 ANSWER_KEY = {0: 1, 1: 4, 2: 0, 3: 3, 4: 1}

 # load the image, convert it to grayscale, blur it
# slightly, then find edges
image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  blurred = cv2.GaussianBlur(gray, (5, 5), 0)
       edged = cv2.Canny(blurred, 75, 200)

 # find contours in the edge map, then initialize
        # the contour that corresponds to the document
      cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
       cnts = cnts[0] if imutils.is_cv2() else cnts[1]
        docCnt = None

        # ensure that at least one contour was found
         if len(cnts) > 0:
# sort the contours according to their size in
# descending order
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)

# loop over the sorted contours
for c in cnts:
    # approximate the contour
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)

    # if our approximated contour has four points,
    # then we can assume we have found the paper
    if len(approx) == 4:
        docCnt = approx
        break

      # apply a four point perspective transform to both the
            # original image and grayscale image to obtain a top-down
        # birds eye view of the paper
    paper = four_point_transform(image, docCnt.reshape(4, 2))
        warped = four_point_transform(gray, docCnt.reshape(4, 2))

       # apply Otsu's thresholding method to binarize the warped
         # piece of paper
          thresh = cv2.threshold(warped, 0, 255,
cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

         # find contours in the thresholded image, then initialize
         # the list of contours that correspond to questions
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
       cnts = cnts[0] if imutils.is_cv2() else cnts[1]
          questionCnts = []

               # loop over the contours
        for c in cnts:
# compute the bounding box of the contour, then use the
# bounding box to derive the aspect ratio
(x, y, w, h) = cv2.boundingRect(c)
ar = w / float(h)

# in order to label the contour as a question, region
# should be sufficiently wide, sufficiently tall, and
# have an aspect ratio approximately equal to 1
if w >= 20 and h >= 20 and ar >= 0.9 and ar <= 1.1:
    questionCnts.append(c)  // HERE I DON'T KNOWN HOW DO
                                                 // I DO NOT UNDERSTAND questionCnts.append(c) CONVERT TO JAVA 

            # sort the question contours top-to-bottom, then initialize
          # the total number of correct answers
           questionCnts = contours.sort_contours(questionCnts ...
(more)
edit retag flag offensive close merge delete

Comments

This is the code I rewritten under the py but to this I do not understand how to do. please help me. or tell me how to do it. so what is your issue?

StevenPuttemans gravatar imageStevenPuttemans ( 2017-04-24 09:00:34 -0600 )edit

My problem is that in python questionCnts = [] for c in cnts: questionCnts.append (c) in android, is there any function equivalent to questionCnts.append (c), thanks a lot

SUPPER ANT gravatar imageSUPPER ANT ( 2017-04-24 22:58:17 -0600 )edit

Well, in python it is saying, you have an empty array questionCnts, and for each value in cnts variable, push the data to the back of the array. In C++ this can be done with vectors, in Java/Android I guess with a similar structure. Take a look at this tutorial for array usage in Java.

StevenPuttemans gravatar imageStevenPuttemans ( 2017-04-25 02:33:39 -0600 )edit

ok thanks a lot

SUPPER ANT gravatar imageSUPPER ANT ( 2017-04-25 10:41:33 -0600 )edit