参考这个网站,然后自己 找了张图片试了一下 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. 11 Spring框架 SpringDAO的JdbcTemplate

    上几个章节我们探讨了Spring的IoC和AOP,这是Spring的重点,但是Spring对jdbc的支持同样我们也不能忘记,毕竟我们还要通过Spring来管理DAO框架(例如Hibernate或者M ...

  2. 你真的会用javascript?

    偶然在csdn看到几个js的小题,考察的都是很基础的知识,拿来分享一下1. 1 2 3 4 if (!("a" in window)) { var a = 1; } alert(a ...

  3. mac相关记录

    一.设置允许安装任何来源软件 命令行执行: sudo spctl --master-disable -----------------------------

  4. SVN使用—工作模式及运行原理以及优缺点对比

    一.SVN原理 (1)运行方式 svn服务器有2种运行方式:独立服务器和借助apache运行. 1.独立服务器访问 访问地址如:svn://svn.test.com/test 2.借助Apache等h ...

  5. 最牛技术 1秒启动Linux的窍门

    1秒启动Linux可以实现吗?我们知道Linux系统开机并不算快,最少也需要11秒,但是,现在有一个技巧,可以1秒打开linux系统,到底是什么技术这么牛?请看下文详细介绍 尽可能快的启动系统,对于自 ...

  6. 详解Linux系统中的文件名和文件种类以及文件权限

    Linux文件种类与副文件名 一直强调一个概念,那就是:任何装置在Linux底下都是文件, 不仅如此,连资料沟通的介面也有专属的文件在负责-所以,你会瞭解到,Linux的文件种类真的很多- 除了前面提 ...

  7. 【转载】在block中使用weakSelf/strongSelf

    http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block/

  8. SQL查询以某个字母开头

    select * from a where left(a.name, 1)='H'; 或 select * from a where a.name REGEXP ''^(B|S)'';

  9. UVA 10214 Trees in a Wood(欧拉函数)

    题意:给你a.b(a<=2000,b<=2000000),问你从原点可以看到范围在(-a<=x<=a,-b<=y<=b)内整数点的个数 题解:首先只需要计算第一象限 ...

  10. java处理图片base64编码的相互转换

    转载自http://www.cnblogs.com/libra0920/p/5754356.html 直接上代码 import sun.misc.BASE64Decoder; import sun.m ...