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

  1. // test.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "cv.h"
  6. #include "opencv2/imgproc/imgproc.hpp"
  7. #include "opencv2/highgui/highgui.hpp"
  8. #include "highgui.h"
  9. #include "cxcore.h"
  10. #include <string>
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <vector>
  14. #include <map>
  15. using namespace std;
  16. using namespace cv;
  17.  
  18. class RectComp//Rect排序
  19. {
  20. public:
  21. Rect rm;
  22. RectComp(Rect rms)
  23. {
  24. rm = rms;
  25. }
  26. bool operator < (const RectComp& ti) const
  27. {
  28. return rm.x < ti.rm.x;
  29. }
  30. };
  31.  
  32. int main()
  33. {
  34.  
  35. //装载图片
  36. Mat srcImage1= imread("D:\\13.jpg");
  37. Mat srcImage2,srcImage3,srcImage4,srcImage5;
  38. //namedWindow("hello-1", 1);
  39. //imshow("hello-1",srcImage1);
  40. // cv::waitKey(0);
  41. //图片变成灰度图片
  42. cvtColor(srcImage1,srcImage2,CV_BGR2GRAY);
  43. //imshow("hello-2",srcImage2);
  44. // cv::waitKey(0);
  45. //图片二值化
  46. threshold(srcImage2,srcImage3,,,THRESH_BINARY_INV);
  47. imshow("hello-3",srcImage3);
  48. cv::waitKey();
  49. //确定腐蚀和膨胀核的大小
  50. Mat element = getStructuringElement(MORPH_RECT, Size(, ));
  51. //腐蚀操作
  52. erode(srcImage3,srcImage4,element);
  53. //膨胀操作
  54. dilate(srcImage4,srcImage5,element);
  55.  
  56. namedWindow("hello-5", );
  57. imshow("hello-5", srcImage5 );
  58. cv::waitKey();
  59.  
  60. //确定每张答题卡的ROI区域
  61. Mat imag_ch1 = srcImage5(Rect(,,,));
  62.  
  63. namedWindow("img1", );
  64. imshow("img1",imag_ch1);
  65. cv::waitKey();
  66.  
  67. //提取已经涂好了的选项
  68. std::vector<std::vector<cv::Point> > chapter1;
  69. findContours(imag_ch1,chapter1,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
  70. Mat result(imag_ch1.size(), CV_8U , cv::Scalar()) ;
  71. cv::drawContours(result,chapter1,-,cv::Scalar());
  72. namedWindow("resultImage", );
  73. cv::imshow("resultImage" , result);
  74.  
  75. vector<RectComp>RectCompList;
  76. for(int i = ;i<chapter1.size();i++)
  77. {
  78. Rect rm= cv::boundingRect(cv::Mat(chapter1[i]));
  79. RectComp *ti = new RectComp(rm);
  80. RectCompList.push_back(*ti);
  81. // printf("Rect %d x = %d,y = %d \n",i,rm.x,rm.y);
  82. }
  83. sort(RectCompList.begin(),RectCompList.end());
  84. std::map<int,string>listenAnswer;
  85. //判断这部分的答题卡是否都已涂上
  86. for(int t = ;t<RectCompList.size();t++)
  87. {
  88. if(RectCompList.at(t).rm.y<)
  89. {
  90. listenAnswer[t] = "A";
  91. }
  92. else if((RectCompList.at(t).rm.y>)&&(RectCompList.at(t).rm.y<))
  93. {
  94. listenAnswer[t] = "B";
  95. }
  96. else if(RectCompList.at(t).rm.y>)
  97. {
  98. listenAnswer[t] = "C";
  99. }
  100. printf("sorted %d x = %d,y = %d \n",t,RectCompList.at(t).rm.x,RectCompList.at(t).rm.y);
  101. }
  102.  
  103. for(map<int,string>::iterator it = listenAnswer.begin();it!=listenAnswer.end();++it)
  104. {
  105. cout<<"num:"<<it->first+<<","<<"answer:"<<it->second<<endl;
  106. }
  107.  
  108. cv::waitKey();
  109. return ;
  110. }

感觉腐蚀操作的正方形大小选择很关键,过大过小效果都不好。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. redis 笔记04 服务器、复制

    服务器 1. 一个命令请求从发送到完成主要包括以下步骤: 1). 客户端将命令请求发送给服务器 2). 服务器读取命令请求,并分析出命令参数 3). 命令执行器根据参数查找命令的实现函数,然后执行实现 ...

  2. Entity FrameWork Code First 迁移命令详解

    1. Enable-Migrations 启动迁移 执行get-help Enable-Migrations –detailed 查看Enable-Migrations的详细用法. -ContextT ...

  3. Linux防火墙--iptables学习

    iptables是Linux系统提供的一个强大的防火墙工具,可以实现包过滤.包重定向.NAT转换等功能.iptables是免费的,iptables是一个工具,实际的功能是通过netfilter模块来实 ...

  4. springmvc 整合微信

    springmvc 整合微信 方式一: ① 配置验证 @RequestMapping(value = "/into", method = RequestMethod.GET, pr ...

  5. jQuery鼠标滑动切换焦点图

    在线演示 本地下载

  6. React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发

    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发   2016/09/23 |  React Native技术文章 |  Sky丶清|  4 条评论 |  1 ...

  7. NOIP 货车运输

    题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...

  8. [Android]热修复框架AndFix测试说明

    AndFix,全称是Android hot-fix.是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug.支持Android 2.3 到 6.0,并且支持arm 与 X86系 ...

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

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

  10. 4.微信小程序-B站:先把首页造出来

    (小安娜:失踪人口已上线,大家快来喷喷喷他!),sorry++,最近身边发生太多事情,导致这最关键的实战开篇都未写,(小安娜-分身1:懒就是懒,不负责任,我之前学的都忘了),(小安娜-分身2:上一篇双 ...