第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

區(qū)分圓圈和單選按鈕 Opencv python

區(qū)分圓圈和單選按鈕 Opencv python

一只斗牛犬 2023-09-26 15:07:13
我的任務(wù)是檢測圖像中的圓圈和單選按鈕。為此,我通過使用不同的參數(shù)嘗試了霍夫圓。問題:如果圖像中的圓圈與單選按鈕的半徑相同,則兩者都會(huì)被檢測到,但在我們的情況下,它應(yīng)該只檢測到一個(gè)。有沒有辦法區(qū)分圓圈和單選按鈕(當(dāng)未選中它們時(shí))?,F(xiàn)在我用半徑限制它們,有兩種不同的功能,一種用于圓形,一種用于單選按鈕。上面的代碼是針對圓的    circle_contours=[]    # Converting the image Gray scale    gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)    # Blur the image to reduce noise    img_blur = cv2.medianBlur(gray, 5)    # Apply hough transform on the image    circles = cv2.HoughCircles(img_blur, cv2.HOUGH_GRADIENT, 1,20, param1=50, param2=20,     minRadius=11, maxRadius=21)    # Draw detected circles    if circles is not None:       circles = np.uint16(np.around(circles))    for i in circles[0, :]:       # Draw outer circle       cv2.circle(image1, (i[0], i[1]), i[2], (34, 255, 34), 2)       circle_contours.append(circles)我對單選按鈕使用了類似的方法,但參數(shù)不同,如下所示。    radio_buttons= cv2.HoughCircles(img_blur, cv2.HOUGH_GRADIENT, 1,20, param1=50, param2=16,     minRadius=9, maxRadius=10)原始圖像圖片1:圖片2:對于 Image1,它正確檢測到圓圈,當(dāng)它傳遞到單選按鈕功能時(shí),它還會(huì)為其內(nèi)部繪制半徑減小的圓圈(Image2),這些圓圈也被檢測為單選按鈕在Image3 Image3 中,它必須檢測圓形和單選按鈕,而我的代碼只能檢測圓形。我也嘗試過使用繪制輪廓,但當(dāng)圖像也有復(fù)選框時(shí)會(huì)出現(xiàn)問題。有沒有其他方法或者更好的檢測方法?
查看完整描述

1 回答

?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊

  1. 找到并畫出答題卡中的所有輪廓。


  1. 申請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é)果:

https://img3.sycdn.imooc.com/651283990001d13404320554.jpg

  • 從上面我們可以看到,除了圓圈之外的所有特征都被刪除了。我們使用該findContours方法來刪除不需要的偽影。

步驟#2:申請HoughCircles。您在問題上編寫的代碼相同。結(jié)果:

https://img4.sycdn.imooc.com/651283af0001ea9204330554.jpg

代碼:

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

  • 我們可以使用pa值來分隔每個(gè)對象,因?yàn)槊總€(gè)對象都有唯一的pa值。

  • 例如,在圖像 3 中,

    • 復(fù)選框:p= 73 和a= 4

    • 單選按鈕:p= 64 和a= 8。

  • 您可以通過觀察代碼找到這些值。

  • 再次應(yīng)用第一步。

    • 結(jié)果:

https://img3.sycdn.imooc.com/651283c60001396203860556.jpg

現(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é)果:

https://img4.sycdn.imooc.com/651283d2000186ef03870554.jpg

代碼:


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)


查看完整回答
反對 回復(fù) 2023-09-26
  • 1 回答
  • 0 關(guān)注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)