参考这个网站,然后自己 找了张图片试了一下 http://blog.csdn.net/cp562090732/article/details/47804003

// 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 <string>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <map>
using namespace std;
using namespace cv; class RectComp//Rect排序
{
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:\\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,,,THRESH_BINARY_INV);
imshow("hello-3",srcImage3);
cv::waitKey();
//确定腐蚀和膨胀核的大小
Mat element = getStructuringElement(MORPH_RECT, Size(, ));
//腐蚀操作
erode(srcImage3,srcImage4,element);
//膨胀操作
dilate(srcImage4,srcImage5,element); namedWindow("hello-5", );
imshow("hello-5", srcImage5 );
cv::waitKey(); //确定每张答题卡的ROI区域
Mat imag_ch1 = srcImage5(Rect(,,,)); namedWindow("img1", );
imshow("img1",imag_ch1);
cv::waitKey(); //提取已经涂好了的选项
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()) ;
cv::drawContours(result,chapter1,-,cv::Scalar());
namedWindow("resultImage", );
cv::imshow("resultImage" , result); vector<RectComp>RectCompList;
for(int i = ;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());
std::map<int,string>listenAnswer;
//判断这部分的答题卡是否都已涂上
for(int t = ;t<RectCompList.size();t++)
{
if(RectCompList.at(t).rm.y<)
{
listenAnswer[t] = "A";
}
else if((RectCompList.at(t).rm.y>)&&(RectCompList.at(t).rm.y<))
{
listenAnswer[t] = "B";
}
else if(RectCompList.at(t).rm.y>)
{
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+<<","<<"answer:"<<it->second<<endl;
} cv::waitKey();
return ;
}

感觉腐蚀操作的正方形大小选择很关键,过大过小效果都不好。http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html

opencv 识别答题卡的更多相关文章

  1. python-图像目标监测(1)识别答题卡

    # -*- coding: utf-8 -*- """ Created on Thu Dec 20 16:05:10 2018 @author: leizhen.liu ...

  2. 识别简单的答题卡(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 reque ...

  3. 浅谈PHP答题卡识别(一)

    最近期末考试考完了,我们也要放寒假了.于是突发奇想,想用PHP写一个答题卡识别程序.已经实现了一些,现分享给大家. 具体的步骤如下: 上传答题卡=>图片二值化(已实现)=>寻找定位点(已实 ...

  4. 【4opencv】识别复杂的答题卡1(主要算法)

    一.问题提出 由于GPY进行了纠偏,所以在采集的时候,就已经获得了质量较高的答题卡图片 下一步就是需要从这张图片中,识别出人眼识别出来的那些信息,并且将这个过程尽可能地鲁棒化,提高识别的准确率. 二. ...

  5. 机器学习进阶-案例实战-答题卡识别判 1.cv2.getPerspectiveTransform(获得投射变化后的H矩阵) 2.cv2.warpPerspective(H获得变化后的图像) 3.cv2.approxPolyDP(近似轮廓) 4.cv2.threshold(二值变化) 7.cv2.countNonezeros(非零像素点个数)6.cv2.bitwise_and(与判断)

    1.H = cv2.getPerspectiveTransform(rect, transform_axes) 获得投射变化后的H矩阵 参数说明:rect表示原始的位置左上,右上,右下,左下, tra ...

  6. jquery css3问卷答题卡翻页动画效果

    这个选项调查的特效以选项卡的形式,每答完一道题目自动切换到下一条,颇具特色.使用jQuery和CSS3,适合HTML5浏览器. 效果展示 http://hovertree.com/texiao/jqu ...

  7. 答题卡作文模块的一种方法-VSTO

    在开始做之前,首先百度了Word有没有简单的生成方法,果然有--页面布局->稿纸设置->方格式稿纸 效果如下图所示.很规范,但是不是答题卡所需要的,因为这样会把所有页面都设置为这样的稿纸. ...

  8. Android实现选择题答题(包括单选、多选和答题卡)

    在线答题demo,具体代码是一年多前完成的,比较简单,不再贴出,请参见Github. 主要功能: 单选:点击选项直接进入下一题.多选:选择多个选项,向右滑动进入下一题.答题卡:点击题号重新进入答题界面 ...

  9. 转载:使用 OpenCV 识别 QRCode

    原文链接:http://coolshell.cn/articles/10590.html#jtss-tsina 识别二维码的项目数不胜数,每次都是开箱即用,方便得很. 这次想用 OpenCV 从零识别 ...

随机推荐

  1. 第一课 GCC入门

    1序言 gcc是一个可移植的编译器,支持多种硬件平台:也不仅仅是一个本地编译器也是一个跨平台编译器:支持多张语言编译时按照模块化设计支持多种语言. gcc编译过程:预处理(预处理器):编译(编译器): ...

  2. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  3. mybatis入门学习记录(一)

    过硬的技术本领,可以给我们保驾护航,飞得更高.今天开始呢.我们就一起来探讨使用mybatis的好处. 首先我们一起来先看看原生的JDBC对于数据库的操作,然后总结其中的利弊,为学习mybatis奠定基 ...

  4. LeetCode: Find Largest Value in Each Tree Row

    BFS /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...

  5. HTTP与服务器的四种交互方式

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

  6. shell 中的 eval 及 crontab 命令

    eval eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接引用,则保证间接引用的语义.也就是说,eval命令将会首先扫描命令行进行所有的置 ...

  7. tinyxml优化之一

    原文链接:http://www.cnblogs.com/zouzf/p/4154569.html 最近在搞XML解析优化,公司引擎用了tinyxml1和tinyxml2两个XML库,后者的效率比前者高 ...

  8. Effective C++ 条款02:尽量以const,enum,inline替换 #define

    换一种说法就是宁可以编译器替换预处理器 举例 #define ASPECT_RATIO 1.653 记号ASPECT_RATIO也许从未被编译器看见:也许在编译起开始处理源码前它就被预处理器移走了,于 ...

  9. Nginx的长链接

    网站使用程序discuz3访问都正常,只有用户登录存在异常,具体就是:用户登陆后会马上显示未登录,然后刷新一下又变成了登录中 这个问题的原因显然是由于session导致,后台有多个web机器,当用户登 ...

  10. JAVA中的枚举使用总结

    概念 在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类; 理解 类里面定义了固定数量的实例,类名如同命令空间 代码 pac ...