1 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
找到并畫出答題卡中的所有輪廓。
申請
HoughCircles
步驟#1:我們可以從找到給定答卷中的所有輪廓開始。
contourIdx=-1
意思是畫出所有的輪廓。
import cv2
import numpy as np
image = cv2.imread('zip_grade_form.png')
# Converting the image Gray scale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(src=gray, thresh=127, maxval=255, type=0)
contours, hierarchy = cv2.findContours(image=thresh,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mode=cv2.RETR_TREE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?method=cv2.CHAIN_APPROX_SIMPLE)
gray = cv2.drawContours(image=gray, contours=contours, contourIdx=-1,
? ? ? ? ? ? ? ? ? ? ?color=(255, 255, 255), thickness=2)
結(jié)果:
從上面我們可以看到,除了圓圈之外的所有特征都被刪除了。我們使用該
findContours
方法來刪除不需要的偽影。
步驟#2:申請HoughCircles
。您在問題上編寫的代碼相同。結(jié)果:
代碼:
import cv2
import numpy as np
image = cv2.imread('zip_grade_form.png')
# Converting the image Gray scale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(src=gray, thresh=127, maxval=255, type=0)
contours, hierarchy = cv2.findContours(image=thresh,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mode=cv2.RETR_TREE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?method=cv2.CHAIN_APPROX_SIMPLE)
gray = cv2.drawContours(image=gray, contours=contours, contourIdx=-1,
? ? ? ? ? ? ? ? ? ? ? ? color=(255, 255, 255), thickness=2)
cv2.imwrite("gray.png", gray)
img_blur = cv2.medianBlur(gray, 5)
circles = cv2.HoughCircles(img_blur, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=16,
? ? ? ? ? ? ? ? ? ? ? ? ? ?minRadius=9, maxRadius=10)
circle_contours = []
if circles is not None:
? ? circles = np.uint16(np.around(circles))
? ? for i in circles[0, :]:
? ? ? ? # Draw outer circle
? ? ? ? cv2.circle(image, (i[0], i[1]), i[2], (108, 105, 255), 2)
? ? ? ? circle_contours.append(circles)
cv2.imwrite("circles.png", image)
更新
為了檢測復(fù)選框和單選按鈕,您需要計(jì)算
contour-perimeter
(p) 和contour-approximation
(a)。我們可以使用
p
和a
值來分隔每個(gè)對象,因?yàn)槊總€(gè)對象都有唯一的p
和a
值。例如,在圖像 3 中,
復(fù)選框:
p
= 73 和a
= 4單選按鈕:
p
= 64 和a
= 8。
您可以通過觀察代碼找到這些值。
再次應(yīng)用第一步。
結(jié)果:
現(xiàn)在找到上圖中的輪廓:
if len(approx) == 8 and int(p) == 64:
? ? cv2.drawContours(image, [c], -1, (180, 105, 255), 3)
elif len(approx) == 4 and int(p) == 73:
? ? cv2.drawContours(image, [c], -1, (180, 105, 255), 3)
結(jié)果:
代碼:
import cv2
from imutils import grab_contours as grb_cns
from imutils import resize as rsz
image = cv2.imread('K1Z94.png')
# Converting the image Gray scale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(src=gray, thresh=127, maxval=255, type=0)
contours, hierarchy = cv2.findContours(image=thresh.copy(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mode=cv2.RETR_TREE,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?method=cv2.CHAIN_APPROX_SIMPLE)
gray = cv2.drawContours(image=gray, contours=contours, contourIdx=-1, color=(255, 255, 255), thickness=2)
resized = rsz(gray, width=300)
ratio = gray.shape[0] / float(gray.shape[0])
canny = cv2.Canny(gray, 50, 200)
thresh = cv2.threshold(src=canny, thresh=60, maxval=255,
? ? ? ? ? ? ? ? ? ?type=cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]
cns = cv2.findContours(image=thresh.copy(), mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE)
cns = grb_cns(cns)
for c in cns:
? ? ?p = cv2.arcLength(c, True)? # perimeter
? ? ?approx = cv2.approxPolyDP(c, 0.04 * p, True)
? ? ?M = cv2.moments(c)
? ? ?# check if the all values of M are 0.
? ? ?all_zr = all(value == 0 for value in M.values())
? ? ?if not all_zr:
? ? ? ? ?cX = int((M["m10"] / M["m00"]))
? ? ? ? ?cY = int((M["m01"] / M["m00"]))
? ? ? ? ?c = c.astype("float")
? ? ? ? ?c *= ratio
? ? ? ? ?c = c.astype("int")
? ? ? ? ?# Circles: (radio-buttons)
? ? ? ? ?if len(approx) == 8 and int(p) == 64:
? ? ? ? ? ? ?cv2.drawContours(image, [c], -1, (180, 105, 255), 3)
? ? ? ? ?elif len(approx) == 4 and int(p) == 73:
? ? ? ? ? ? ?cv2.drawContours(image, [c], -1, (180, 105, 255), 3)
? cv2.imwrite("result.png", image)
添加回答
舉報(bào)