1. 程式人生 > >Opencv識別答題卡

Opencv識別答題卡

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include "opencv2/imgproc.hpp"
#include <opencv2/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

#include <map>

class RectComp
{  
public:
	Rect rm;  
	RectComp(Rect rms)  
	{  
		rm = rms;  
	}  
	bool operator < (const RectComp& ti) const  
	{  
		return rm.x< ti.rm.x;  
	}  
};

int main()  
{  
	//裝載圖片  
	Mat srcImage1= imread("D:\\opencv_image\\images\\20150820103614491.png");   
	namedWindow("hello-1", 1);  
	imshow("hello-1", srcImage1 ); 
	Mat srcImage2,srcImage3,srcImage4,srcImage5;  

	//圖片變成灰度圖片  
	cvtColor(srcImage1,srcImage2,CV_BGR2GRAY);  
	//圖片二值化  
	threshold(srcImage2,srcImage3,200,255,THRESH_BINARY_INV);  

	//確定腐蝕和膨脹核的大小  
	Mat element = getStructuringElement(MORPH_RECT, Size(4, 4));  
	//腐蝕操作  
	erode(srcImage3,srcImage4,element);  
	//膨脹操作  
	dilate(srcImage4,srcImage5,element);  

	namedWindow("hello-5", 1);  
	imshow("hello-5", srcImage5 );  

	//確定每張答題卡的ROI區域  
	Mat imag_ch1 = srcImage5(Rect(0,30,100,60));  
	namedWindow("img1", 1);  
	imshow("img1",imag_ch1);  

	//提取已經塗好了的選項  
	std::vector<std::vector<cv::Point> > chapter1;  
	findContours(imag_ch1,chapter1,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);  
	Mat result(imag_ch1.size(), CV_8U , cv::Scalar(255)) ;  
	cv::drawContours(result,chapter1,-1,cv::Scalar(0),2);  
	namedWindow("resultImage", 1);  
	cv::imshow("resultImage" , result);  

	vector<RectComp>RectCompList;  
	for(int i = 0;i<chapter1.size();i++)  
	{  
		Rect rm= cv::boundingRect(cv::Mat(chapter1[i]));  
		RectComp *ti = new RectComp(rm);  
		RectCompList.push_back(*ti);  
		//         printf("Rect %d x = %d,y = %d \n",i,rm.x,rm.y);  
	}  
	sort(RectCompList.begin(),RectCompList.end());  
	map<int,string>listenAnswer;  
	//判斷這部分的答題卡是否都已塗上  
	for(int t = 0;t<RectCompList.size();t++)  
	{  
		if(RectCompList.at(t).rm.y<=22)  
		{  
			listenAnswer[t] = "A";  
		}  
		else if((RectCompList.at(t).rm.y>22)&&(RectCompList.at(t).rm.y<=34))  
		{  
			listenAnswer[t] = "B";  
		}  
		else if(RectCompList.at(t).rm.y>34)  
		{  
			listenAnswer[t] = "C";  
		}  
		printf("sorted %d x = %d,y = %d \n",t,RectCompList.at(t).rm.x,RectCompList.at(t).rm.y);  
	}  
	for(map<int,string>::iterator it = listenAnswer.begin();it!=listenAnswer.end();++it)  
	{  
		cout<<"num:"<<it->first+1<<","<<"answer:"<<it->second<<endl;  
	}  

	waitKey(0);  
	return 0;  
}  


相關推薦

Opencv識別答題

#include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include "opencv2/imgproc.hpp" #include <opencv2/highgui.hpp> #include <i

使用python3+opencv3實現的識別答題的例子(01)

answer_sheet_scan使用python3+opencv3實現的一些識別答題卡的例子由於工作需要,最近在研究關於如何通過程式識別答題卡的客觀題的答案,之前雖然接觸過python,但對於計算機視覺這一塊卻完全是一個陌生的領域,經過各種調研,發現網上大多數的例子都是採用

識別簡單的答題(Bubble sheet multiple choice scanner and test grader using OMR, Python and OpenCV——jsxyhelu重新整編)

該部落格轉自www.pyimagesearch.com,進行了相關修改補充。 Over the past few months I’ve gotten quite the number of requests landing in my inbox to build a bubble sheet/

opencv答題識別 (一)

背景:答題卡閱卷需要游標閱讀機,有些小學校買不起游標閱讀機。 主要開源庫:opencv,版本3.0。 識別原理:把答題卡放在深色背景中,用查詢輪廓定位好答題卡位置,用透視變換取出答題卡影象,根據位置判斷是否被塗黑,識別出ABCD,對比標準答題計算出成績。 打包應用下載:

答題識別

目錄 1.問題描述 2.解決思路 3.程式碼實現 4.相關資料 該部落格整編於:https://www.pyimagesearch.com/ 1.問題描述 現在,我們需要識別一張簡易的答題卡,如圖1-1所示。       &nb

【4opencv】識別複雜的答題1(主要演算法)

一、問題提出     由於GPY進行了糾偏,所以在採集的時候,就已經獲得了質量較高的答題卡圖片 下一步就是需要從這張圖片中,識別出人眼識別出來的那些資訊,並且將這個過程儘可能地魯棒化,提高識別的準確率。 二、思路探索     在從圖片到數字的轉變過程中,既是一個“量化”的過程,也是一個“降維”的過程,需要特

影象處理例項--基於Hough變化的答題識別(未完成)

影象二值化 在答題卡自動識別實驗中,為了方便地進行目標答案的檢測和識別,我們需要對灰度影象進行二值化處理,而在這個過程中,閾值的選取是關鍵,直接影響到目標答案是否能被正確識別。 閾值選取方法 閾值選取方法可以分為區域性和全域性兩種。因為每個學生填塗答題

計算機視覺小例項 No.3 基於Hough變化的答題識別

答題卡識別 答題卡自動閱卷系統通過獲取答題卡影象作為系統輸入,並通過計算機處理、自動識別填圖示記,存入資料庫完成閱卷。 但是答題卡在運輸和使用過程中,容易受到裝置、環境等因素的影響,使得影象質量在一定程度上有所下降,影響了自動閱卷的準確率,甚至導致無法正常

Python3+Opencv3 答題識別

小計: 1)cv2.Canny():  cv2.Canny()第一個引數是輸入影象,第二和第三個分別是minVal和maxVal。minVal和maxVal。當影象的灰度梯度高於maxVal時被認為是真的邊界,那些低於minVal的邊界會被拋棄。如果介於兩者之

Opencv透視變換——實現不規則四邊形轉換為規則矩形(以答題校正為例)

最近在做答題卡識別方面的工作,但是掃描的答題卡試卷可能會存在一定程度的傾斜,而我們需要提取答題卡有效區域並對其進行校正,實現後續的工作。 傾斜答題卡如下圖所示: 我們需要對其進行校正:思路如下 霍夫圓檢測 提取圓心所形成的外包矩形 利用四個圓心與矩形

普通PC安裝ESXI6.0無法識別驅動問題

current pac process -o real war 格式 mark 2.7 VMware官方鏡像中沒有封裝普通網卡的驅動,無法識別REALTEK RTL 8111E等。需要通過ESXi-Customizer-v2.7.2工具將驅動程序封裝到安裝鏡像裏面,在網

答題作文模塊的一種方法-VSTO

In center 屬性 答題 查看 百度 ofo AD http 在開始做之前,首先百度了Word有沒有簡單的生成方法,果然有--頁面布局->稿紙設置->方格式稿紙 效果如下圖所示。很規範,但是不是答題卡所需要的,因為這樣會把所有頁面都設置為這樣的稿紙。

opencv識別封閉區域 並標記該區域

rom coord polygon ted oid read num label region #!/usr/bin/env python # -*- coding: utf-8 -*- # Author : zhibo.wang # E-mail : d_1206@

python OpenCV識別人臉

直接附上程式碼吧。網上有的資料夾開啟是錯的,參照這個格式吧。 import cv2 # 待檢測的圖片路徑 imagepath="F:/MyCode/Image/baby.jpg" image = cv2.imread(imagepath) gray = cv2.cvtColor(image

JavaOpencv實現答題掃描 銀行卡號碼擷取

專案中需要用到opencv,先了解後做仿照別人做了兩個 關於java Opencv 答題卡掃描 銀行卡號碼擷取 的 小程式。 Opencv的安裝下載,就不多介紹,主要是貼程式碼,希望大家能多多指教。 答題卡 import org.opencv.c

OpenCV識別技術

OpenCV識別技術# 老師:james 20181019 # 識別技術# Pycharm + Python3 + OpenCV """ 一、識別技術: 什麼是OpenCV?物體識別,影象的分隔,人臉識別,機器視覺。OpenCV底層:C語言和C++寫的。 二、Python怎麼去實現?4個案例案例思路

opencv——識別A4紙

小編這篇給大家帶來的是如何用opencv在視野中識別出A4紙或者是某一個具體的靶標什麼的,同樣的演算法改改可以用來識別其他的形狀的物體,先來看看實際的效果: 由於小編是在虛擬機器下呼叫攝像頭出現了一些問題,還沒有試試連續過程中的識別情況,等攝像頭到了,小編會再後續中測試。 在程式開始之前我

C++ opencv 識別火焰 (程式碼)

/*****************************************************************************

Python中openCV庫實現爾曼濾波案例

1.0 什麼是卡爾曼模型 理論推導過於複雜,看個知乎上的解釋吧  假設你有兩個感測器,測的是同一個訊號。可是它們每次的讀數都不太一樣,怎麼辦? 取平均。  再假設你知道其中貴的那個感測器應該準一些,便宜的那個應該差一些。那有比取平均更好的辦法嗎? 加權平均。  怎麼加權?假

虛擬機器 搭載 Ubuntu 識別SD失敗分析

虛擬機器上安裝Linux系統後,相信很多人都碰到過在Linux系統中SD卡或U盤不能正常讀取的狀況。這裡整理了一些常見的解決方法: 1. 如果在Windows下也不能讀取到SD卡,則說明Windows系統的USB驅動異常或SD卡有問題 解決辦法:重灌Windows系統的USB驅動 2. 如果在Windows下