婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼

Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼

熱門標(biāo)簽:百度地圖標(biāo)注位置怎么修改 無錫客服外呼系統(tǒng)一般多少錢 老人電話機(jī)器人 地圖標(biāo)注視頻廣告 大連crm外呼系統(tǒng) 洪澤縣地圖標(biāo)注 北京電信外呼系統(tǒng)靠譜嗎 梅州外呼業(yè)務(wù)系統(tǒng) 高德地圖標(biāo)注是免費(fèi)的嗎

  哈嘍大家好,這里是滑稽研究所。看過我們圖像處理系列的朋友,應(yīng)該知道識(shí)別答題卡那期文章。其中利用opencv框架,完美的實(shí)現(xiàn)了答題卡填涂區(qū)域的識(shí)別。在后臺(tái)有小伙伴想要我完善一下判斷選項(xiàng)對(duì)錯(cuò)并打分的功能,本期我們就來實(shí)現(xiàn)一下。
  那么我們來復(fù)習(xí)一下往期的代碼原理。我們需要對(duì)圖片素材進(jìn)行灰度化處理、透視變換、輪廓檢測(cè)、腐蝕膨脹處理、區(qū)域分割、邊框計(jì)算、區(qū)域計(jì)算。實(shí)際上我們是通過像素面積的過濾、填涂區(qū)域優(yōu)化和獲取選項(xiàng)坐標(biāo)來完成答題卡的識(shí)別的。
素材:

  那么在獲取到答題卡的填涂區(qū)域之后就好辦了。我們首先分隔答題卡,去除干擾項(xiàng),然后把不同的區(qū)域打上標(biāo)簽。我們的答題卡是自上而下排序的。那么我們獲取到的填涂項(xiàng)的x坐標(biāo)即橫坐標(biāo)就派上了用場(chǎng)。選項(xiàng)A~E一定是占據(jù)了五個(gè)不同的區(qū)域。我們已經(jīng)為不同區(qū)域打上了標(biāo)簽。剩下的就是交給我們的if判斷語句了。這時(shí)我們已經(jīng)為填涂項(xiàng)賦上了實(shí)際的意義。即從像素坐標(biāo)轉(zhuǎn)換成了具有實(shí)際意義的選項(xiàng)。
  那y坐標(biāo)就沒有用了嗎?非也。經(jīng)過上面的處理我們只是得到了填涂區(qū)域?qū)?yīng)的選項(xiàng)。但是我們還沒有進(jìn)行排序。大家知道無序的選項(xiàng)是沒有意義的。而剛剛我們說了該答題卡的題號(hào)順序是自上而下的。因?yàn)槲覀儽闅v選項(xiàng)時(shí),是同時(shí)得到x、y坐標(biāo)的,因此我們可以保證得到的坐標(biāo)是配對(duì)的。
  其中橫縱坐標(biāo)分別填入兩個(gè)list中,然后使用zip方法合并list。這時(shí)我們?cè)侔凑彰總€(gè)list的第二個(gè)元素也就是縱坐標(biāo)進(jìn)行由小到大的排序,就可以得到正確的順序。
  這時(shí)我們才真正獲取到了需要的數(shù)據(jù)。即考生填涂的選項(xiàng)順序,我們?cè)傩陆ㄒ粋€(gè)list放正確的答案,與考生的答案進(jìn)行對(duì)比,經(jīng)計(jì)算得出考生的正確率,并給出分?jǐn)?shù)。
  好,思路清晰,上代碼!

import cv2
import numpy as np

path = './test_01.png'
img = cv2.imread(path)

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray,(3,3),1)
imgCanny = cv2.Canny(imgBlur,100,120)

cv2.imshow("O", imgCanny)

imgContour = img.copy()

cnts = cv2.findContours(imgCanny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
for cnt in cnts:
    area = cv2.contourArea(cnt)
    # 這個(gè)輸出各個(gè)輪廓的面積
    #print(area)
#
if area >= 500:
    cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 3)
    peri = cv2.arcLength(cnt, True)
    # 找出輪廓的突變值
    approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
    # approx找到的是一個(gè)輪廓有幾個(gè)突變值,有幾個(gè)角就會(huì)有幾個(gè)突變值
    # 返回的是一個(gè)list,輸出他的長(zhǎng)度,就可以知道到底有幾個(gè)角
    #print(approx)
    a1,a2,a3,a4 = list(approx[0][0]),list(approx[1][0]),list(approx[2][0]),list(approx[3][0])

#cv2.imshow("Canny Image",imgContour)

mat1 = np.array([a1,a2,a3,a4],dtype=np.float32)

#透視變換
#計(jì)算矩形寬高
width = 402#int(((a4[0]-a1[0])+(a3[0]-a2[0]))/2)
height = 518#int(((a2[1]-a1[1])+(a3[1]-a4[1]))/2)

#計(jì)算還原后的坐標(biāo)
new_a1 = [0,0]
new_a2 = [0,height]
new_a3 = [width,height]
new_a4 = [width,0]

mat2 = np.array([new_a1,new_a2,new_a3,new_a4],dtype=np.float32)
#計(jì)算變換矩陣
mat3 = cv2.getPerspectiveTransform(mat1,mat2)

#進(jìn)行透視變換
res = cv2.warpPerspective(imgCanny,mat3,(width,height))
res1 = cv2.warpPerspective(img,mat3,(width,height))

imgxx = cv2.cvtColor(res1,cv2.COLOR_BGR2GRAY)
binary = cv2.threshold(imgxx,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU )[1]
#變換完成
#cv2.imshow("Output",res1)

cntss = cv2.findContours(res, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
for cnt1 in cntss:
    area1 = cv2.contourArea(cnt1)
    # 這個(gè)輸出各個(gè)輪廓的面積
    #print(area)
#
    if area1 >= 1500 and area1=1700:
        #把圓的輪廓畫成黑色
        cv2.drawContours(binary, cnt1, -1, (0, 0, 0), 10)

        kernel = np.ones((5, 5), np.uint8)
        imgDialation = cv2.dilate(binary, kernel, iterations=1)

cv2.imshow("Out", imgDialation)

cntsss = cv2.findContours(imgDialation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]

l1 = []
l2 = []
l3 = ['B','E','A','D','B']

for cnt2 in cntsss:
    area2 = cv2.contourArea(cnt2)
            #print(area)

    if area2 = 1200 and 800=area2:
                #cv2.drawContours(res1, cnt, -1, (0, 255, 0), 5)
                #輪廓長(zhǎng)
        peri = cv2.arcLength(cnt2, True)
                # 找出輪廓的突變值
        approx1 = cv2.approxPolyDP(cnt2, 0.02 * peri, True)

        x, y, w, h = cv2.boundingRect(approx1)
                #外接矩形
        #print(x+w//2,y+h//2)

        m = x+w//2
        n = y+h//2
        l1.append(m)
        l2.append(n)
        #拼接兩個(gè)一維列表,使x,y坐標(biāo)配對(duì)。
        mix1 = list(zip(l1,l2))
        #按列表第二個(gè)元素升序,即按y值由小到大排列。
        #這是我們得到的答案為正確順序。
        mix1.sort(key=lambda x: x[1])

        if 400>x>80 and 50y350:
            cv2.rectangle(res1, (x, y), (x + w, y + h), (0, 0, 255), 2)
            #圓心
            # (圖像,x.y位置,半徑,顏色,輪廓粗細(xì))
            cv2.circle(res1, (x+w//2,y+h//2), 1, (255, 0, 0), 5)

l4 = []
for i in mix1:
    if 75  i[0]  130:
        print("A")
        l4.append('A')
    elif 130  i[0]  185:
        print("B")
        l4.append('B')
    elif 185  i[0]  240:
        print("C")
        l4.append('C')
    elif 240  i[0]  295:
        print("D")
        l4.append('D')
    elif 295  i[0]  350:
        print("E")
        l4.append('E')

print('正確答案:',l3)
print('考生答案',l4)


h = 0
for i in range(0, len(l3)):
    if l3[i] == l4[i]:
        h=h+1
print('得分:',str(h/5*100)+'分')

cv2.imshow("cc Image",res1)

cv2.imshow("dd Image",binary)

cv2.waitKey(0)

運(yùn)行結(jié)果:


  以上為兩個(gè)圖片素材的運(yùn)行結(jié)果,我們只放出其中一部分。剩余的素材大家自行實(shí)驗(yàn)。
  可以看到,程序成功的識(shí)別了考生填涂的答題卡,并給出了考生答案、正答案和考生最后的得分。
  綜上功能實(shí)現(xiàn),任務(wù)完成。大家學(xué)會(huì)了嗎?

以上就是Python識(shí)別答題卡并給出分?jǐn)?shù)的詳細(xì)內(nèi)容,更多關(guān)于Python識(shí)別答題卡的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python OpenCV實(shí)現(xiàn)答題卡識(shí)別判卷
  • python實(shí)現(xiàn)百萬答題自動(dòng)百度搜索答案
  • python實(shí)現(xiàn)用戶答題功能
  • 答題輔助python代碼實(shí)現(xiàn)
  • python3.5+tesseract+adb實(shí)現(xiàn)西瓜視頻或頭腦王者輔助答題
  • 從0到1使用python開發(fā)一個(gè)半自動(dòng)答題小程序的實(shí)現(xiàn)
  • Python沖頂大會(huì) 快來答題!
  • python利用opencv如何實(shí)現(xiàn)答題卡自動(dòng)判卷

標(biāo)簽:安慶 長(zhǎng)春 岳陽 泉州 清遠(yuǎn) 洛陽 怒江 吉林

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼》,本文關(guān)鍵詞  Python,答題,卡,識(shí)別,并,給出,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python答題卡識(shí)別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 恩平市| 凤山县| 宁河县| 南城县| 西丰县| 垦利县| 芷江| 甘谷县| 高青县| 准格尔旗| 凭祥市| 抚宁县| 兴国县| 金乡县| 英山县| 屏边| 邓州市| 和田市| 邵武市| 菏泽市| 九龙坡区| 垦利县| 怀化市| 莎车县| 玉龙| 定安县| 正安县| 怀宁县| 方城县| 宁夏| 彩票| 德保县| 堆龙德庆县| 三都| 运城市| 松滋市| 南充市| 祁阳县| 毕节市| 东平县| 南丹县|