//test.cpp : 定义控制台应用程序的入口点。//#include"stdafx.h"#include"cv.h"#include"opencv2/imgproc/imgproc.hpp"#include"opencv2/highgui/highgui.hpp"#include"highgui.h"#include"cxcore.h"#include#include#include#include#include
using namespacestd;using namespacecv;class RectComp//Rect排序
{public:
Rect rm;
RectComp(Rect rms)
{
rm=rms;
}bool operator < (const RectComp& ti) const{return rm.x
}
};intmain()
{//装载图片
Mat srcImage1= imread("D:\\13.jpg");
Mat srcImage2,srcImage3,srcImage4,srcImage5;//namedWindow("hello-1", 1);//imshow("hello-1",srcImage1);//cv::waitKey(0);//图片变成灰度图片
cvtColor(srcImage1,srcImage2,CV_BGR2GRAY);//imshow("hello-2",srcImage2);//cv::waitKey(0);//图片二值化
threshold(srcImage2,srcImage3,200,255,THRESH_BINARY_INV);
imshow("hello-3",srcImage3);
cv::waitKey(0);//确定腐蚀和膨胀核的大小
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));//腐蚀操作
erode(srcImage3,srcImage4,element);//膨胀操作
dilate(srcImage4,srcImage5,element);
namedWindow("hello-5", 1);
imshow("hello-5", srcImage5 );
cv::waitKey(0);//确定每张答题卡的ROI区域
Mat imag_ch1 = srcImage5(Rect(2,20,268,40));
namedWindow("img1", 1);
imshow("img1",imag_ch1);
cv::waitKey(0);//提取已经涂好了的选项
std::vector<:vector> >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));
namedWindow("resultImage", 1);
cv::imshow("resultImage", result);
vectorRectCompList;for(int i = 0;i
{
Rect rm=cv::boundingRect(cv::Mat(chapter1[i]));
RectComp*ti = newRectComp(rm);
RectCompList.push_back(*ti);//printf("Rect %d x = %d,y = %d \n",i,rm.x,rm.y);
}
sort(RectCompList.begin(),RectCompList.end());
std::maplistenAnswer;//判断这部分的答题卡是否都已涂上
for(int t = 0;t
{if(RectCompList.at(t).rm.y<5)
{
listenAnswer[t]= "A";
}else if((RectCompList.at(t).rm.y>5)&&(RectCompList.at(t).rm.y<16))
{
listenAnswer[t]= "B";
}else if(RectCompList.at(t).rm.y>16)
{
listenAnswer[t]= "C";
}
printf("sorted %d x = %d,y = %d \n",t,RectCompList.at(t).rm.x,RectCompList.at(t).rm.y);
}for(map::iterator it = listenAnswer.begin();it!=listenAnswer.end();++it)
{
cout<first+1<second<
}
cv::waitKey(0);return 0;
}