opencv 识别答题卡
参考这个网站,然后自己 找了张图片试了一下 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 识别答题卡的更多相关文章
- python-图像目标监测(1)识别答题卡
# -*- coding: utf-8 -*- """ Created on Thu Dec 20 16:05:10 2018 @author: leizhen.liu ...
- 识别简单的答题卡(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 ...
- 浅谈PHP答题卡识别(一)
最近期末考试考完了,我们也要放寒假了.于是突发奇想,想用PHP写一个答题卡识别程序.已经实现了一些,现分享给大家. 具体的步骤如下: 上传答题卡=>图片二值化(已实现)=>寻找定位点(已实 ...
- 【4opencv】识别复杂的答题卡1(主要算法)
一.问题提出 由于GPY进行了纠偏,所以在采集的时候,就已经获得了质量较高的答题卡图片 下一步就是需要从这张图片中,识别出人眼识别出来的那些信息,并且将这个过程尽可能地鲁棒化,提高识别的准确率. 二. ...
- 机器学习进阶-案例实战-答题卡识别判 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 ...
- jquery css3问卷答题卡翻页动画效果
这个选项调查的特效以选项卡的形式,每答完一道题目自动切换到下一条,颇具特色.使用jQuery和CSS3,适合HTML5浏览器. 效果展示 http://hovertree.com/texiao/jqu ...
- 答题卡作文模块的一种方法-VSTO
在开始做之前,首先百度了Word有没有简单的生成方法,果然有--页面布局->稿纸设置->方格式稿纸 效果如下图所示.很规范,但是不是答题卡所需要的,因为这样会把所有页面都设置为这样的稿纸. ...
- Android实现选择题答题(包括单选、多选和答题卡)
在线答题demo,具体代码是一年多前完成的,比较简单,不再贴出,请参见Github. 主要功能: 单选:点击选项直接进入下一题.多选:选择多个选项,向右滑动进入下一题.答题卡:点击题号重新进入答题界面 ...
- 转载:使用 OpenCV 识别 QRCode
原文链接:http://coolshell.cn/articles/10590.html#jtss-tsina 识别二维码的项目数不胜数,每次都是开箱即用,方便得很. 这次想用 OpenCV 从零识别 ...
随机推荐
- NSIS卸载后无法删除开始菜单中的内容
我们在安装程序时通常会使用createShortCut命令来创建一个快捷方式,如下,是在开始–>启动项 里创建run.bat的快捷方式. CreateShortCut "$SMPROG ...
- js防抖
那我们设置个 options 作为第三个参数,然后根据传的值判断到底哪种效果,我们约定: leading:false 表示禁用第一次执行trailing: false 表示禁用停止触发的回调 我们来改 ...
- h5打开App的方法。
在浏览器中: 法1: location.href = `${scheme}`;//location跳转App是几乎所以情况都支持的. 法2: var ifr = document.createElem ...
- Mysql5.7 用户与授权
mysql -uroot -proot MySQL5.7 mysql.user表没有password字段改 authentication_string: 一. 创建用户: 命令:CREATE USER ...
- 一般处理程序中 C#中对象转化为Json对象
namespace: Newtonsoft.Json; context.Response.ContentType = "application/text"; 注:这里为什么不是 J ...
- CSS3 Loading进度条加载动画特效
在线演示 本地下载
- Javascript何时执行
分以下两种情况: 1.HTML head部分的Javascript会在被调用的时候执行 需要调用才执行的脚本或事件触发执行的脚本放在head部分,这可以保证脚本在任何调用之前被预先加载,在页面加载完之 ...
- C\C++与Java中的static关键字
C\C++里面的static: 面向过程的static: 在c和c++面向过程的设计里,在全局变量前加上static关键字则可将该变量定义为一个静态全局变量,比如: static int a; 那么c ...
- Linux系统下修改IP地址、网关、DNS的基本方法
临时修改IP地址.网关.主机名.DNS,马上生效,无需重启(重启后失效) 1.修改主机名 #hostname Slyar 2.修改IP地址(eth0为网卡名称) #ifconfig eth0 192. ...
- Java学习笔记50:JSONObject与JSONArray的使用(转)
Java不像PHP解析和生产JSON总是一个比较痛苦的过程.但是使用JSONObject和JSONArray会让整个过程相对舒服一些. 需要依赖的包:commons-lang.jar commons- ...