欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > python OpenCV實現答題卡識別判卷

python OpenCV實現答題卡識別判卷

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

本文實例為大家分享了python OpenCV實現答題卡識別判卷的具體代碼,供大家參考,具體內容如下

完整代碼:

#導入工具包
import numpy as np
import argparse
import imutils
import cv2
 
# 設置參數
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", default="./images/test_03.png",
 help="path to the input image")
args = vars(ap.parse_args())
 
# 正確答案
ANSWER_KEY = {0: 1, 1: 4, 2: 0, 3: 3, 4: 1}
 
def order_points(pts):
 # 一共4個坐標點
 rect = np.zeros((4, 2), dtype = "float32")
 
 # 按順序找到對應坐標0123分別是 左上,右上,右下,左下
 # 計算左上,右下
 s = pts.sum(axis = 1)
 rect[0] = pts[np.argmin(s)]
 rect[2] = pts[np.argmax(s)]
 
 # 計算右上和左下
 diff = np.diff(pts, axis = 1)
 rect[1] = pts[np.argmin(diff)]
 rect[3] = pts[np.argmax(diff)]
 
 return rect
 
def four_point_transform(image, pts):
 # 獲取輸入坐標點
 rect = order_points(pts)
 (tl, tr, br, bl) = rect
 
 # 計算輸入的w和h值
 widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
 widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
 maxWidth = max(int(widthA), int(widthB))
 
 heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
 heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
 maxHeight = max(int(heightA), int(heightB))
 
 # 變換后對應坐標位置
 dst = np.array([
  [0, 0],
  [maxWidth - 1, 0],
  [maxWidth - 1, maxHeight - 1],
  [0, maxHeight - 1]], dtype = "float32")
 
 # 計算變換矩陣
 M = cv2.getPerspectiveTransform(rect, dst)
 warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
 
 # 返回變換后結果
 return warped
def sort_contours(cnts, method="left-to-right"):
    reverse = False
    i = 0
    if method == "right-to-left" or method == "bottom-to-top":
        reverse = True
    if method == "top-to-bottom" or method == "bottom-to-top":
        i = 1
    boundingBoxes = [cv2.boundingRect(c) for c in cnts]
    (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),
                                        key=lambda b: b[1][i], reverse=reverse))
    return cnts, boundingBoxes
def cv_show(name,img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()  
 
# 預處理
image = cv2.imread(args["image"])
contours_img = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
cv_show('blurred',blurred)
edged = cv2.Canny(blurred, 75, 200)
cv_show('edged',edged)
 
# 輪廓檢測
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(contours_img,cnts,-1,(0,0,255),3) 
cv_show('contours_img',contours_img)
docCnt = None
 
# 確保檢測到了
if len(cnts) > 0:
 # 根據輪廓大小進行排序
 cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
 
 # 遍歷每一個輪廓
 for c in cnts:
  # 近似
  peri = cv2.arcLength(c, True)
  approx = cv2.approxPolyDP(c, 0.02 * peri, True)
 
  # 準備做透視變換
  if len(approx) == 4:
   docCnt = approx
   break
 
# 執行透視變換
 
warped = four_point_transform(gray, docCnt.reshape(4, 2))
cv_show('warped',warped)
# Otsu's 閾值處理
thresh = cv2.threshold(warped, 0, 255,
 cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] 
cv_show('thresh',thresh)
thresh_Contours = thresh.copy()
# 找到每一個圓圈輪廓
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
 cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(thresh_Contours,cnts,-1,(0,0,255),3) 
cv_show('thresh_Contours',thresh_Contours)
questionCnts = []
 
# 遍歷
for c in cnts:
 # 計算比例和大小
 (x, y, w, h) = cv2.boundingRect(c)
 ar = w / float(h)
 
 # 根據實際情況指定標準
 if w >= 20 and h >= 20 and ar >= 0.9 and ar = 1.1:
  questionCnts.append(c)
 
# 按照從上到下進行排序
questionCnts = sort_contours(questionCnts,
 method="top-to-bottom")[0]
correct = 0
 
# 每排有5個選項
for (q, i) in enumerate(np.arange(0, len(questionCnts), 5)):
 # 排序
 cnts = sort_contours(questionCnts[i:i + 5])[0]
 bubbled = None
 
 # 遍歷每一個結果
 for (j, c) in enumerate(cnts):
  # 使用mask來判斷結果
  mask = np.zeros(thresh.shape, dtype="uint8")
  cv2.drawContours(mask, [c], -1, 255, -1) #-1表示填充
  cv_show('mask',mask)
  # 通過計算非零點數量來算是否選擇這個答案
  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 = ANSWER_KEY[q]
 
 # 判斷正確
 if k == bubbled[1]:
  color = (0, 255, 0)
  correct += 1
 
 # 繪圖
 cv2.drawContours(warped, [cnts[k]], -1, color, 3)
 
 
score = (correct / 5.0) * 100
print("[INFO] score: {:.2f}%".format(score))
cv2.putText(warped, "{:.2f}%".format(score), (10, 30),
 cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow("Original", image)
cv2.imshow("Exam", warped)
cv2.waitKey(0)

test_03.png

運行效果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

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

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

巨人網絡通訊聲明:本文標題《python OpenCV實現答題卡識別判卷》,本文關鍵詞  python,OpenCV,實現,答題,卡,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python OpenCV實現答題卡識別判卷》相關的同類信息!
  • 本頁收集關于python OpenCV實現答題卡識別判卷的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    一区二区三区av电影| 中国男女全黄大片| 亚洲成人黄色av| 日韩一区二区三区四区| 午夜在线电影亚洲一区| 欧美久久久久久久久久久| 欧美日韩在线电影| 一区二区欧美精品| 91视频com| 日本高清不卡在线观看| 亚洲婷婷在线视频| av午夜一区麻豆| 欧美亚洲动漫精品| 夜夜精品视频一区二区 | 一区二区三区免费在线观看| 99国产欧美另类久久久精品| 在线观看一区二区视频| 亚洲激情综合网| 亚洲熟女一区二区三区| 欧美精品久久久久久久多人混战 | 91麻豆精品视频| 欧美自拍丝袜亚洲| 亚洲午夜三级在线| 在线免费观看污视频| 日韩欧美卡一卡二| 久久国产生活片100| 纪美影视在线观看电视版使用方法| 国产午夜亚洲精品午夜鲁丝片| 国产成人三级在线观看| 日本韩国欧美一区二区三区| 亚洲国产成人va在线观看天堂| 污污内射在线观看一区二区少妇| 日韩欧美在线综合网| 精品综合久久久久久8888| 亚洲欧美精品久久| 一区二区三区欧美视频| 欲求不满的岳中文字幕| 2020国产精品久久精品美国| 国产成人免费在线视频| 在线免费av一区| 日韩中文字幕亚洲一区二区va在线| 国产人妻一区二区| 国产精品麻豆欧美日韩ww| 国产chinesehd精品露脸| 日韩网站在线看片你懂的| 精品一区二区三区蜜桃| 中文字幕另类日韩欧美亚洲嫩草| 亚洲一区在线视频| 成人乱码一区二区三区av| 欧美激情一区在线观看| 91论坛在线播放| 精品欧美久久久| bt欧美亚洲午夜电影天堂| 884aa四虎影成人精品一区| 韩国成人在线视频| 91国偷自产一区二区开放时间 | 偷拍日韩校园综合在线| 国产1区2区在线观看| 亚洲欧美一区二区不卡| 国产伦精品一区二区三区妓女| 国产日韩精品久久久| 97中文字幕在线观看| 久久久久久97三级| 97精品人人妻人人| 国产婷婷色一区二区三区| 中文字幕一二三区| 久久久久久久综合色一本| 91亚洲国产成人精品一区二区三| 精品国产乱码久久久久久图片| 不卡电影一区二区三区| 日韩欧美不卡在线观看视频| 成人国产在线观看| 精品蜜桃在线看| 99国产精品免费视频| 国产午夜三级一区二区三| 扒开伸进免费视频| 亚洲欧洲日韩一区二区三区| 国产中年熟女高潮大集合| 一区二区三区在线观看动漫| 中文字幕黄色网址| 天堂在线亚洲视频| 色悠久久久久综合欧美99| 老司机午夜精品| 欧美男人的天堂一二区| 国产成人一区在线| 精品国产91乱码一区二区三区| 中文字幕第六页| 国产精品你懂的| 女女互磨互喷水高潮les呻吟| 亚洲一区免费观看| 成年人午夜剧场| 极品尤物av久久免费看| 91精品国产色综合久久不卡蜜臀| 成人精品视频.| 国产视频一区二区在线观看| 青青草视频播放| 亚洲综合在线免费观看| 欧美黑人性猛交xxx| 国产原创一区二区三区| 日韩一区二区三| 国产在线a视频| 亚洲天堂中文字幕| 国产第一页浮力| 国产专区欧美精品| 精品日韩99亚洲| 右手影院亚洲欧美| 首页综合国产亚洲丝袜| 欧美午夜精品久久久久久孕妇| 成人免费观看视频| 国产女主播视频一区二区| 微拍福利一区二区| 免费在线观看成人| 日韩西西人体444www| 亚洲一区二区三区四区五区六区 | 亚洲天堂2024| 一区二区欧美视频| 在线观看日韩精品| 99re这里只有精品6| 中文字幕制服丝袜一区二区三区 | 综合激情成人伊人| 亚洲综合视频网站| 成人永久免费视频| 国产精品久久久久桃色tv| 91久久久久久久久久久久久久| 国产乱码精品一品二品| 亚洲精品国产成人av在线| 亚洲一二三区不卡| 欧美蜜桃一区二区三区| 精品影片一区二区入口| 午夜精品久久一牛影视| 欧美一区二区三区不卡| 手机在线看片日韩| 久久 天天综合| 国产午夜精品美女毛片视频| 美女网站视频色| 成人性视频免费网站| 亚洲欧美综合在线精品| 农村黄色一级片| 先锋资源在线视频| 亚洲电影中文字幕在线观看| 欧美一区日本一区韩国一区| 30一40一50老女人毛片| 黄色精品一二区| 国产精品色呦呦| 色综合天天综合在线视频| 91尤物视频在线观看| 亚洲影视在线观看| 日韩午夜精品视频| 亚洲a∨无码无在线观看| 成人深夜福利app| 亚洲激情自拍偷拍| 欧美一区二区久久| 夫妇交换中文字幕| 成人免费看片app下载| 亚洲一区二区视频| 日韩欧美视频在线| 999精品在线视频| 久久久久久久久久久影视| 日韩电影免费在线看| 久久久精品tv| 麻豆明星ai换脸视频| 日本精品一二三| 蜜桃在线一区二区三区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产精品美女久久久久久久久久久| 黄色a级片在线观看| av地址在线观看| 老司机精品视频线观看86| 国产精品国产三级国产| 精品视频999| 极品久久久久久久| 91色porny在线视频| 久久精品国产99| 中文字幕一区二区视频| 欧美一区二区三区色| 亚洲AV成人无码网站天堂久久| 91网上在线视频| 另类小说欧美激情| 综合久久综合久久| 精品久久一区二区| 91成人免费网站| 欧美狂猛xxxxx乱大交3| jlzzjlzz欧美大全| 日本不卡视频在线| 中文字幕一区在线观看| 欧美一二三在线| 色婷婷久久久久swag精品| 蜜臀av一区二区三区有限公司| 成人性视频网站| 捆绑调教一区二区三区| 亚洲精品国久久99热| 精品久久久久99| 欧美影院午夜播放| 美国黄色特级片| 成年女人免费视频| 成人综合婷婷国产精品久久| 日韩av一二三| 亚洲乱码国产乱码精品精可以看 | 亚洲天堂一级片| 免费a级黄色片|