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

主頁 > 知識庫 > Python答題卡識別并給出分數的實現代碼

Python答題卡識別并給出分數的實現代碼

熱門標簽:百度地圖標注位置怎么修改 無錫客服外呼系統一般多少錢 老人電話機器人 地圖標注視頻廣告 大連crm外呼系統 洪澤縣地圖標注 北京電信外呼系統靠譜嗎 梅州外呼業務系統 高德地圖標注是免費的嗎

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

  那么在獲取到答題卡的填涂區域之后就好辦了。我們首先分隔答題卡,去除干擾項,然后把不同的區域打上標簽。我們的答題卡是自上而下排序的。那么我們獲取到的填涂項的x坐標即橫坐標就派上了用場。選項A~E一定是占據了五個不同的區域。我們已經為不同區域打上了標簽。剩下的就是交給我們的if判斷語句了。這時我們已經為填涂項賦上了實際的意義。即從像素坐標轉換成了具有實際意義的選項。
  那y坐標就沒有用了嗎?非也。經過上面的處理我們只是得到了填涂區域對應的選項。但是我們還沒有進行排序。大家知道無序的選項是沒有意義的。而剛剛我們說了該答題卡的題號順序是自上而下的。因為我們遍歷選項時,是同時得到x、y坐標的,因此我們可以保證得到的坐標是配對的。
  其中橫縱坐標分別填入兩個list中,然后使用zip方法合并list。這時我們再按照每個list的第二個元素也就是縱坐標進行由小到大的排序,就可以得到正確的順序。
  這時我們才真正獲取到了需要的數據。即考生填涂的選項順序,我們再新建一個list放正確的答案,與考生的答案進行對比,經計算得出考生的正確率,并給出分數。
  好,思路清晰,上代碼!

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)
    # 這個輸出各個輪廓的面積
    #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找到的是一個輪廓有幾個突變值,有幾個角就會有幾個突變值
    # 返回的是一個list,輸出他的長度,就可以知道到底有幾個角
    #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)

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

#計算還原后的坐標
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)
#計算變換矩陣
mat3 = cv2.getPerspectiveTransform(mat1,mat2)

#進行透視變換
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)
    # 這個輸出各個輪廓的面積
    #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)
                #輪廓長
        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)
        #拼接兩個一維列表,使x,y坐標配對。
        mix1 = list(zip(l1,l2))
        #按列表第二個元素升序,即按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位置,半徑,顏色,輪廓粗細)
            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)

運行結果:


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

以上就是Python識別答題卡并給出分數的詳細內容,更多關于Python識別答題卡的資料請關注腳本之家其它相關文章!

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

標簽:安慶 長春 岳陽 泉州 清遠 洛陽 怒江 吉林

巨人網絡通訊聲明:本文標題《Python答題卡識別并給出分數的實現代碼》,本文關鍵詞  Python,答題,卡,識別,并,給出,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python答題卡識別并給出分數的實現代碼》相關的同類信息!
  • 本頁收集關于Python答題卡識別并給出分數的實現代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲免费资源在线播放| 亚洲国产成人av| 看电视剧不卡顿的网站| 欧美日韩成人激情| 热久久久久久久| 日韩精品中午字幕| 国产在线精品一区二区不卡了| 日韩女优制服丝袜电影| 国产精品自拍av| 欧美激情一区二区三区不卡 | 六月丁香婷婷久久| 亚洲免费观看在线观看| 在线观看免费视频综合| 亚洲成av人片一区二区三区| 日韩一区二区三区三四区视频在线观看 | 五月天网站亚洲| 99re在线精品| 国产精品卡一卡二卡三| 国产一区二区三区四区在线观看| 日本最新不卡在线| 麻豆91在线观看| 国产一区二区三区蝌蚪| 欧美日韩不卡一区二区| 国产精品麻豆久久久| 欧美第一区第二区| 日韩一区精品视频| 国产一区不卡精品| 性久久久久久久| 久久亚洲一区二区三区明星换脸| 国产精品77777竹菊影视小说| 久久综合给合久久狠狠狠97色69| 高潮精品一区videoshd| 天天av天天翘天天综合网| 日韩色在线观看| 欧美欧美午夜aⅴ在线观看| 黑人巨大精品欧美一区| 午夜欧美视频在线观看| 国产精品电影一区二区| 久久久午夜电影| 51精品久久久久久久蜜臀| 成人伦理片在线| 免费在线观看一区二区三区| 有码一区二区三区| 亚洲综合男人的天堂| 亚洲综合在线免费观看| 一级精品视频在线观看宜春院| 欧美精品一区二区久久久| 欧美疯狂做受xxxx富婆| 欧美男女性生活在线直播观看 | 日韩精品电影一区亚洲| 国产91色综合久久免费分享| 色国产综合视频| 午夜一区二区三区在线观看| 日韩免费视频一区| 欧美影院一区二区| 欧亚一区二区三区| 日韩视频永久免费| 久久久久久久综合狠狠综合| 一区二区三区欧美久久| 国产剧情一区在线| 欧美一区二区三区在线观看视频 | ...中文天堂在线一区| 日韩av电影天堂| 色哟哟日韩精品| 亚洲精品视频在线观看网站| 首页国产欧美久久| 色激情天天射综合网| 91精品国产福利| 亚洲精品亚洲人成人网在线播放| 日韩专区欧美专区| 欧美日本在线一区| 国产精品家庭影院| 夜夜夜精品看看| 极品少妇xxxx精品少妇偷拍| 久久久久国产精品厨房| 欧美tickling挠脚心丨vk| 亚洲欧美日韩国产另类专区| 捆绑调教一区二区三区| 成人精品gif动图一区| 日韩女优av电影在线观看| 精品国内二区三区| 亚洲h精品动漫在线观看| 欧美一区二区三区免费在线看 | 欧美一级精品大片| 国产精品国产三级国产普通话三级 | 国产一区二区导航在线播放| 国产精品久久久久7777按摩| 69堂亚洲精品首页| 色哟哟国产精品免费观看| 一区二区三区中文在线| 国产91对白在线观看九色| 中文字幕一区二区三区在线观看 | 亚洲成人综合网站| 欧美一区2区视频在线观看| 国产精品国产三级国产普通话三级| 99久久精品国产麻豆演员表| 美女在线一区二区| 亚洲精品一区二区三区在线观看| 亚洲国产色一区| 在线视频中文字幕一区二区| 日韩毛片高清在线播放| 色视频成人在线观看免| 亚洲一区二区欧美激情| 欧美日韩一级二级三级| 久久99国产精品免费网站| 精品久久久久久最新网址| 麻豆精品精品国产自在97香蕉| 日韩一级二级三级精品视频| 国产一区在线精品| 日韩一区在线免费观看| 欧美日韩一区二区三区四区五区| 亚洲午夜一区二区| 国产精品久久久久久久久晋中| 成人小视频免费观看| 国产精品久久久久久久久快鸭| 欧美色中文字幕| 国产一区久久久| 日本一区二区不卡视频| 色婷婷国产精品久久包臀 | 久久久久久久久久看片| 99视频一区二区| 美国毛片一区二区| 偷窥国产亚洲免费视频| 亚洲一区二区三区四区不卡| 久久综合狠狠综合| 久久久久久久av麻豆果冻| 日韩一区二区不卡| 日韩欧美成人一区| 久久精品在这里| 久久人人超碰精品| 国产欧美日韩在线观看| 中文字幕不卡在线播放| 欧美—级在线免费片| 中文字幕在线不卡一区| 亚洲美女视频一区| 午夜欧美大尺度福利影院在线看 | 国产精品国产精品国产专区不片| 欧美电视剧免费观看| 日韩一区二区在线看| 精品第一国产综合精品aⅴ| 日韩欧美一区电影| 国产亚洲欧美日韩日本| 亚洲色图欧洲色图婷婷| 亚瑟在线精品视频| 国产一区二区三区观看| 久久99精品久久久久婷婷| 成人久久18免费网站麻豆| 91国内精品野花午夜精品| 欧美乱妇15p| 精品国产乱码久久久久久老虎| 国产亚洲欧洲一区高清在线观看| 国产精品免费看片| 久久精品国产亚洲高清剧情介绍| 午夜精品福利一区二区三区蜜桃| 极品瑜伽女神91| 欧美一区二区在线免费播放| 2欧美一区二区三区在线观看视频| 久久久亚洲综合| 国产午夜精品久久久久久久| 有码一区二区三区| www.视频一区| 国产午夜精品久久久久久免费视 | 欧美激情中文字幕一区二区| 日韩精品亚洲一区| 欧美日韩国产一二三| 一区二区三区精品在线观看| 色哟哟欧美精品| 2020国产精品| 免费成人在线视频观看| 日韩一区二区三区电影在线观看 | 日韩欧美国产麻豆| 久久99久久99| 欧美精品一区二区在线观看| 婷婷成人激情在线网| 欧美mv日韩mv国产网站app| 成人18精品视频| 精品国产乱码91久久久久久网站| 亚洲免费在线视频一区 二区| 色又黄又爽网站www久久| 日韩黄色免费网站| 日本一二三四高清不卡| 99精品国产视频| 男男成人高潮片免费网站| 国产欧美一区二区精品久导航| 91久久久免费一区二区| 青草国产精品久久久久久| 国产欧美日韩在线观看| 欧美日韩在线亚洲一区蜜芽| 风间由美一区二区av101| 综合久久综合久久| 久久精品亚洲国产奇米99| 91精品国产福利在线观看| 在线精品视频一区二区三四| 狠狠色丁香久久婷婷综合_中| 一区二区三区在线观看动漫| 久久久天堂av| 久久精品一区四区| 欧美大片顶级少妇| 欧美一二区视频| 久久亚洲影视婷婷|