#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)