opencv答题卡识别 (一)
2016-01-07 18:57
429 查看
背景:答题卡阅卷需要光标阅读机,有些小学校买不起光标阅读机。
主要开源库:opencv,版本3.0。
识别原理:把答题卡放在深色背景中,用查找轮廓定位好答题卡位置,用透视变换取出答题卡图像,根据位置判断是否被涂黑,识别出ABCD,对比标准答题计算出成绩。
打包应用下载:
http://veryjuly.com/anomr/anomr.apk
答题卡定位与识别代码先在windows下测试完成,然后通过NDK编译让android用JNI方式调用。
Windows下用图片做测试源,主函数如下:
int main(intargc,
char ** argv)
{
cvNamedWindow("test", CV_WINDOW_NORMAL);
unsignedcharresults[64 * 24];
intret = 0;
char* img_file =
".\\samples\\save.jpg";
IplImage* src = NULL;
//源图像
src =cvLoadImage(img_file, 1);
if(!src){
printf("Couldn't load %s\n", img_file);
return0;
}
clock_tstart, finish;
doubleTotal_time;
start= clock();
ret =cv_omr(src, results);
finish= clock();
Total_time= (double)(finish - start) ;
printf("%f ms\n", Total_time);
if(ret == 0)
printf("识别成功。\n");
if(ret == 1)
printf("答题卡四边形定位失败。\n");
if(ret == 2)
printf("行坐标获取失败。\n");
return0;
}
其中int cv_omr(IplImage *img_src,
unsignedchar *results);为测试程序与android应用都要使用的主要识别函数,unsignedchar
*results为返回识别结果。
Android通过下面的函数来调用识别函数:
int Yuv420sp_omr(unsignedchar*results,
unsignedchar
* yuvdata, intwidth,
int height)
{
intret = 0;
IplImage*image;
image= cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
Yuv420sp2RGBimg(yuvdata,image, width, height);
//保存图像到SD卡,观察是否正确;win
下调试
//cvSaveImage("/storage/emulated/0/save.jpg",image, 0);
//可以开始识别了,保存测试图片时不运行下面的代码
ret =cv_omr(image, results);
//结束,释放图像
//cvReleaseImage(&image);
returnret;
}
此函数把Yuv420sp格式的图像数据转换成IplImage,再调用识别函数。
主要开源库:opencv,版本3.0。
识别原理:把答题卡放在深色背景中,用查找轮廓定位好答题卡位置,用透视变换取出答题卡图像,根据位置判断是否被涂黑,识别出ABCD,对比标准答题计算出成绩。
打包应用下载:
http://veryjuly.com/anomr/anomr.apk
答题卡定位与识别代码先在windows下测试完成,然后通过NDK编译让android用JNI方式调用。
Windows下用图片做测试源,主函数如下:
int main(intargc,
char ** argv)
{
cvNamedWindow("test", CV_WINDOW_NORMAL);
unsignedcharresults[64 * 24];
intret = 0;
char* img_file =
".\\samples\\save.jpg";
IplImage* src = NULL;
//源图像
src =cvLoadImage(img_file, 1);
if(!src){
printf("Couldn't load %s\n", img_file);
return0;
}
clock_tstart, finish;
doubleTotal_time;
start= clock();
ret =cv_omr(src, results);
finish= clock();
Total_time= (double)(finish - start) ;
printf("%f ms\n", Total_time);
if(ret == 0)
printf("识别成功。\n");
if(ret == 1)
printf("答题卡四边形定位失败。\n");
if(ret == 2)
printf("行坐标获取失败。\n");
return0;
}
其中int cv_omr(IplImage *img_src,
unsignedchar *results);为测试程序与android应用都要使用的主要识别函数,unsignedchar
*results为返回识别结果。
Android通过下面的函数来调用识别函数:
int Yuv420sp_omr(unsignedchar*results,
unsignedchar
* yuvdata, intwidth,
int height)
{
intret = 0;
IplImage*image;
image= cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
Yuv420sp2RGBimg(yuvdata,image, width, height);
//保存图像到SD卡,观察是否正确;win
下调试
//cvSaveImage("/storage/emulated/0/save.jpg",image, 0);
//可以开始识别了,保存测试图片时不运行下面的代码
ret =cv_omr(image, results);
//结束,释放图像
//cvReleaseImage(&image);
returnret;
}
此函数把Yuv420sp格式的图像数据转换成IplImage,再调用识别函数。
相关文章推荐
- shell统计每秒log文件中行数增加值
- linux服务器 Apache服务的源码安装与基本配置
- Linux 安装apache
- Linux下MySql服务器启动以及数据库登陆的几个常见问题
- hadoop1.0安装部署(一)
- SNMP 原理及配置简述 net-snmp-utils net-snmp 第2版基于SNMP 群体名(community name) 第3版引入了安全性更高的访问控制方法 SNMP协议操作只有4种 Apache的php_snmp 模块
- BZOJ 1015 - 变删点为加点 + 并查集维护
- Linux安装配置php
- opencv学习笔记(二十二)——驱动双摄像头
- hadoop mapreduce lzo
- Apache以及PHP的默认编码问题解决(详解)
- 安装 openSUSE 13.1 后必须做的10件事情
- shell中的${},##和%%的使用
- Nginx模块示例
- linux 下日常使用便利工具
- linux操作系统原理
- Linux 系统应用编程——线程基础
- tomcat 日志
- 马哥linux学习笔记:openssl的使用
- CentOS 7 启动、重启、chkconfig等命令已经合并为systemctl