之前用Python+Opencv 写过答题卡识别的算法。

这篇博客用的C++和Opencv来完成答题卡的识别,相关算法的思想是不变的。

(一)定位答题卡的四个边角锚点

因为标准答题卡的四角都有黑色的圈圈,将这些圈圈的位置定位出来,就相当于定位出四个边角锚点。

定位黑色圆圈,有两种方式:

(1)霍夫圆检测,找到圆心的位置,这个方法我在之前的Python版本中已经用过。但是我用C++来做的时候,霍夫圆检测速度比较慢,而且占很大的内存。所以改用了第二种方法。

(2)模板匹配,事先做好和边角黑圈大小差不多的模板图片。然后对输入图片进行模板匹配。

模板匹配:通过在输入图像上滑动模板图片,对两者进行对比,找出相似度最高的ROI区域。

实现模板匹配的函数:matchTeplate()。它的参数如下:

第一个参数:InputArray image,8位或者32位浮点型输入图像。

第二个参数:InputArray template,和源图片有一样的数据类型,而且尺寸不能大于原图。

第三个参数:OutArray result,比较结果的映射图像。这里的result是32位的单通道图像,输入图像的尺寸是(W,H),模板图像的尺寸是(w,h),那么它的大小是(W-w+1)*(H-h+1)。

第四个参数:int类型的method。Opencv提供了6种图像匹配的方法。

匹配后的结果是32位,需要做个归一化处理。

实现归一化的函数:normalize()。它的参数如下:

第一个参数:输入图像。第二个参数:输出图像。Mat类的对象即可。

第三个参数:double类型alpha。第四个参数:double类型beta。

第五个参数:norm_type的类型。

第六个参数:int类型的dtype,默认是-1。当这个参数取负数的时候,输出矩阵和src拥有同样的类型,否则就是和src相同的通道数。

第七个参数:可选的操作掩模。

模板匹配的代码思想:

(1)将整张图片分成四个部分。

这里的Rect使用注意:

1,第一个参数和第二个参数,表示划分图片的左上角坐标,第三和第四个参数表示划分区域的宽和高。

2,所以获取的最大位置的坐标是相对裁剪部分而言,所以返回坐标的时候需要做相应的调整,使其能够对应到原图的位置。

 Mat matLT = matSrc(Rect(0, 0, col / 2, row / 2));Mat matLD = matSrc(Rect(0, row/2, col / 2, row / 2));Mat matRT = matSrc(Rect(col/2 ,0, col / 2, row / 2));Mat matRD = matSrc(Rect(col/2, row/2, col / 2, row / 2));

(2)进行四次模板匹配,得到四张result结果图。

结果图保存在matTemp中,其中参数5表示采用第五种匹配方法:系数匹配法TM_CCOOEFF。

matchTemplate(matLD, matTemplate, matTemp, 5);

(3)对matTemp进行归一化。

采用区间归一化,将像素值映射到[0,1]这个范围内。

normalize(matTemp, matTemp, 0, 1, NORM_MINMAX, -1, Mat());

(4)获取结果图中最大值的位置,并返回该位置。

minMaxLoc是用获取图像最大值,最小值,以及对应的位置。这里只需要获取最大值的位置,其他的可以设置成NULL。

minMaxLoc(matTemp, NULL, NULL, NULL, &maxLocLD,Mat());
anchorLD = Point(maxLocLD.x , maxLocLD.y+row/2);
anchorLT = maxLocLT;
anchorRT = Point(maxLocRT.x+col/2, maxLocRT.y);
anchorRD = Point(maxLocRD.x + col / 2, maxLocRD.y + row / 2);

(5)在原图中将最大的位置画出来。

//将获取的锚点画出来。
circle(matStand, anchorLT, 5, Scalar(0, 0, 255), 5);
circle(matStand, anchorLD, 5, Scalar(0, 0, 255), 5);
circle(matStand, anchorRT, 5, Scalar(0, 0, 255), 5);
circle(matStand, anchorRD, 5, Scalar(0, 0, 255), 5);

看一下整个模板匹配的效果。这里看一张正的图片和一张倾斜图片的匹配效果。

            

看一下局部匹配出来的效果图。这是matTemp的展示,边角最亮的应该就是匹配度最高的点。

matTemp的属性如下:W-w+1 =210-24+1=187.

H-h+1 = 185-24+1 = 162

所以matTemp的大小就是187*162。根据打印的matTemp的像素值,为32位的浮点型,但是带符号。

归一化后,就是0.0-1.0的范围。

总结下来,模板匹配的两步基本工作:匹配和归一化。

答题卡识别C++版本(一)相关推荐

  1. python CV 趣味项目 答题卡识别

    英文原文来自 Bubble sheet multiple choice scanner and test grader using OMR, Python and OpenCV 说到答题卡,满满的都是 ...

  2. 用Python+OpenCV+PyQt开发的答题卡识别软件

    用Python+OpenCV+PyQt开发的答题卡识别软件 软件使用说明 软件设计思路 如何设置答案 界面风格 备注 这是一个可以识别定制答题卡的软件,它可以根据用户自定的答案来进行识别,校对正误并统 ...

  3. 【Matlab答题卡识别】hough变换答题卡判定与成绩统计【含GUI源码 752期】

    一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计[含GUI源码 752期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [ ...

  4. 【Matlab答题卡识别】hough变换答题卡判定与成绩统计(带面板)【含GUI源码 1017期】

    一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计(带面板)[含GUI源码 1017期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 ...

  5. 基于 SpringMvc + OpenCV 实现的答题卡识别系统(附源码)

    点击关注公众号,实用技术文章及时了解 java_opencv 项目介绍 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,它提供了一系列图像处理和计算机视觉方面很多通用算法.是研究图像 ...

  6. python 答题卡识别_opencv+python机读卡识别(初级版)

    最近在进一步学习Python,在网上发现有使用opencv进行机读卡识别的, 就根据大神的文章,跟着学习,自己写了一个机读卡识别, 文章一:opencv+python机读卡识别整合版 文章二:pyth ...

  7. OpenCV C++案例实战五《答题卡识别》

    OpenCV C++案例实战五<答题卡识别> 前言 一.图像矫正 1.源码 二.获取选项区域 1.扣出每题选项 2.源码 三.获取答案 1.思路 2.辅助函数 3.源码 4.效果 总结 前 ...

  8. 自动判卷 、答题卡识别、六级答题卡客观题自动判卷系统1.0

    自动判卷 .答题卡识别.六级答题卡客观题自动判卷系统1.0 一.前言 二.代码 三.处理原图片.以及效果图片 四.总结 一.引言: 1.本程序设计想法来源于一次四六级考试,因为六级没有好好准备,裸考上 ...

  9. opencv图像处理—项目实战:答题卡识别判卷

    哔站唐宇迪opencv课程--项目实战:答题卡识别判卷 [计算机视觉-OpenCV]唐宇迪博士教会了我大学四年没学会的OpenCV OpenCV计算机视觉实战全套课程(附带课程课件资料+课件笔记+源码 ...

最新文章

  1. [BTS2004]一步一步学习BizTalk2004 CBR(content-based routing)
  2. mysql安装samba_centos 安装samba
  3. 用神经网络计算甲醛CH2O和亚硝酸HNO2的化学键的键能
  4. python实现一个字典
  5. 没有互联网,我不会写程序了
  6. php撒意思,php表示是什么意思
  7. ref和out区别总结
  8. 对过去css+div的总结
  9. 产品经理三大证书,考哪个好
  10. 国产CAM究竟水平如何?看完测试我震惊了
  11. Web3到底是什么?
  12. APP兼容性覆盖测试
  13. 小木虫网站无法登陆(账号突然被封禁)的解决办法
  14. 数据结构·堆·完全二叉树
  15. 【神经网络】MP神经网络模型(附实例代码讲解)
  16. QT编译在注释中遇到意外的文件结束
  17. 新出生的机器狗,打滚1小时后自己掌握走路,吴恩达开山大弟子最新成果
  18. alipay.trade.app.pay
  19. 抖音小店无货源:创业很苦,坚持很酷,她是如何做到日赚1k+的?
  20. Vue后台管理页面总体结构及主要功能设计

热门文章

  1. CI520与CV520的兼容模式研发资料
  2. gzip bzip2 区别
  3. 恢复和保护视力的方法
  4. 伺服编码器差分信号转PLC24V脉冲信号变送器0-5V电平隔离器 DIN33
  5. 微信整人假红包图片_微信假红包生成器安卓-微信红包图片截图整人交友方法 红包显示一会出现你的交友宣言...
  6. c语言程序设计第四版乌云高娃,C语言程序设计教学课件作者第3版乌云高娃学习手册C语言程序设计教学课件作者第3版乌云高娃学习手册学习手册第10章文件及其应用课件.docx...
  7. 自由天空XP/2K3封装工具 Easy Sysprep v2.0 正式版封装教程
  8. 让运行在T61上的windows xp支持4G内存
  9. 工业传感器新手,主要谈一下工业传感器领域吧!
  10. Google Play 应用上架流程(有图有真相)