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 从零识别 ...
随机推荐
- redis 笔记04 服务器、复制
服务器 1. 一个命令请求从发送到完成主要包括以下步骤: 1). 客户端将命令请求发送给服务器 2). 服务器读取命令请求,并分析出命令参数 3). 命令执行器根据参数查找命令的实现函数,然后执行实现 ...
- Entity FrameWork Code First 迁移命令详解
1. Enable-Migrations 启动迁移 执行get-help Enable-Migrations –detailed 查看Enable-Migrations的详细用法. -ContextT ...
- Linux防火墙--iptables学习
iptables是Linux系统提供的一个强大的防火墙工具,可以实现包过滤.包重定向.NAT转换等功能.iptables是免费的,iptables是一个工具,实际的功能是通过netfilter模块来实 ...
- springmvc 整合微信
springmvc 整合微信 方式一: ① 配置验证 @RequestMapping(value = "/into", method = RequestMethod.GET, pr ...
- jQuery鼠标滑动切换焦点图
在线演示 本地下载
- React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发
React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发 2016/09/23 | React Native技术文章 | Sky丶清| 4 条评论 | 1 ...
- NOIP 货车运输
题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...
- [Android]热修复框架AndFix测试说明
AndFix,全称是Android hot-fix.是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug.支持Android 2.3 到 6.0,并且支持arm 与 X86系 ...
- Effective C++ 条款02:尽量以const,enum,inline替换 #define
换一种说法就是宁可以编译器替换预处理器 举例 #define ASPECT_RATIO 1.653 记号ASPECT_RATIO也许从未被编译器看见:也许在编译起开始处理源码前它就被预处理器移走了,于 ...
- 4.微信小程序-B站:先把首页造出来
(小安娜:失踪人口已上线,大家快来喷喷喷他!),sorry++,最近身边发生太多事情,导致这最关键的实战开篇都未写,(小安娜-分身1:懒就是懒,不负责任,我之前学的都忘了),(小安娜-分身2:上一篇双 ...