java识别答题卡纸_opencv 识别答题卡

//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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值