Как прочитать пузырьковый лист с помощью CV2 на python? Я сталкиваюсь с некоторыми проблемами при чтении контуров с использованием cv2

#python #cv2

#python #cv2

Вопрос:

введите описание изображения здесьЯ хочу прочитать пузырьковый лист на python с помощью cv2. Но мой код не дает мне точных контуров или точного количества кругов. Я

Комментарии:

1. Что вы уже пробовали? Мы не собираемся писать ваш код за вас!

Ответ №1:

 def normalize(im):
return cv2.normalize(im, np.zeros(im.shape), 0, 255,norm_type=cv2.NORM_MINMAX)

# load the image and show it  
image = cv2.imread("/home/junaid/PycharmProjects/omr/img/scan_score.jpg")

cropped_1 = image[1278:2082, 517:1006].copy()
cv2.imshow("cropped", cropped_1)

edges = cv2.Canny(cropped_1, 100, 200)

blurred = cv2.GaussianBlur(cropped_1, (11, 11), 10)

im = normalize(cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY))

ret, im = cv2.threshold(im, 160, 255, cv2.THRESH_BINARY)

thresh = cv2.threshold(im, 0, 255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


cnts = imutils.grab_contours(cnts)

# print(cnts)

questionCnts = []

for c in cnts:
  ar = cv2.contourArea(c)
  cv2.drawContours(thresh, c, -1,(255,0,0),3)
  if ar>=2800 and ar<= 2900:
     questionCnts.append(c)
     # if h >= 42 or h <= 44 and w>=56 or w <= 59 and ar>=1.4 and ar<=1.5:
     #     questionCnts.append(c)

  # print(len(cnts))
  print(len(questionCnts))

  questionCnts = contours.sort_contours(questionCnts, method="top-to-bottom") 
  [0]
  # print(questionCnts)

  correct = 0

  for (q,i) in enumerate(np.arange(0, len(questionCnts), 4)):
     cnts = contours.sort_contours(questionCnts[i:i   4])[0]
     bubbled = None
     # print(cnts)

     for (j, c) in enumerate(cnts):
        mask = np.zeros(thresh.shape, dtype="uint8")
        print(mask)
        cv2.drawContours(mask, [c], -1, (255,0,0), 1)

         mask = cv2.bitwise_and(thresh, thresh, mask=mask)
          total = cv2.countNonZero(mask)

         if bubbled is None or total > bubbled[0]:
             bubbled = (total, j)

         color = (0, 0, 255)
         k = 0

         if k == bubbled[1]:
            color = (0, 255, 0)
            correct  = 1
            print("correct", correct)

        cv2.drawContours(im, [cnts[k]], -1, color, 3)


  # grab the test taker
  score = (correct / 13.0) * 100
   print("[INFO] score: {:.2f}%".format(score))
   cv2.putText(im, "{:.2f}%".format(score), (10, 30), 
        cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
   # cv2.imshow("Original", image)
   cv2.imshow("Exam", im)

   cv2.waitKey(0)