浅谈PHP答题卡识别(一)
最近期末考试考完了,我们也要放寒假了。于是突发奇想,想用PHP写一个答题卡识别程序。已经实现了一些,现分享给大家。
具体的步骤如下:
上传答题卡=>图片二值化(已实现)=>寻找定位点(已实现)=>使用定位点切割掉不要的部分(已实现)=>切割小题=>客观题自动阅卷&主观题切割后交由阅卷老师批改=>统计分数=>生成csv文档
先爆出源码:
<?php
error_reporting(0);
$fn="./1.jpg";//要识别的答题卡文件名,生产环境中替换为"$fn='./cards/'.$_GET['testno']."/".$_GET['cardno'];"
$m255=200;//图片二值化的阈值
$minx=-1;//定位点坐标,L6同。
$miny=-1;
function gett($res,$i,$j){//求某座标的灰度值
$m255=200;
$rgb = imagecolorat($res,$j,$i); $rgbarray = imagecolorsforindex($res, $rgb);
$r= $rgbarray['red'] * 0.333;
$g= $rgbarray['green'] * 0.333;
$b= $rgbarray['blue'] * 0.333;
$t= round(($r+$g+$b) /$m255);
return $t;
} header('Content-type:image/png');
$res = imagecreatefromjpeg($fn);
$size = getimagesize($fn);
$black = imagecolorallocate($res, 0, 0, 0);
$white = imagecolorallocate($res, 255, 255, 255);
$red=imagecolorallocate($res, 255, 0, 0);
$fl=imagecolorallocate($res, 0, 255, 0);
for($j=0; $j <$size[0]; ++$j)
for($i=0; $i <$size[1]; ++$i)
{
//这一部分代码的Line26-Line35和Line36-Line49借鉴的网上的一位大大的文章,稍作修改,具体是哪位大大的,不太记得了,这一行献给那位大大
{
$rgb = imagecolorat($res,$j,$i);
$rgbarray = imagecolorsforindex($res, $rgb);
$r= $rgbarray['red']*0.333;
$g= $rgbarray['green']*0.333;
$b= $rgbarray['blue']*0.333;
$t= round(($r+$g+$b) /$m255);
if ($t==0)
{
imagesetpixel($res,$j,$i,$black);//原本是$data[$i][$j]=true;因为内存超限,so换成了这个,L47的一样.
if($minx==-1 and $miny==-1 and $i>=10 and $j>=10 and gett($res,$i+5,$j)==0 and gett($res,$i,$j+5)==0){//gett($res,$i+5,$j)==0 and gett($res,$i,$j+5)==0:防止误识别.
//找到左上角的定位点
$minx=$j;
$miny=$i; }
}else{ imagesetpixel($res,$j,$i,$white);
}
}
} //$b=dgcz($res,$miny,$minx,$fl);//这个函数本是用于标记定位点的,后来取消了
imageellipse($res,$minx,$miny,40,40,$red);//标记定位点
//imageline($res,$minx,0,$minx,$size[1],$red);
//imageline($res,$size[0]-$minx,0,$size[0]-$minx,$size[1]-1,$red);
//画切割线 //imageellipse($res,$b-minx,$miny,40,40,$red); $Out = imagecreatetruecolor ($size[0]-2*$minx,$size[1]-2*$miny);//切割后图像存放位置
imagecopy ( $Out,$res , 0,0 ,$minx ,$miny ,$size[0]-2*$minx,$size[1]-2*$miny );//切割
imagepng($Out);
imagedestroy($res);
imagedestroy($Out);
//$fh=fopen("./log.log","a");
//fwrite($fh,"x:".$minx.";y:".$miny."\n");
?>
但效率有点低。需要二十多秒才能完成。
测试图片:

执行结果:

浅谈PHP答题卡识别(一)的更多相关文章
- 机器学习进阶-案例实战-答题卡识别判 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 ...
- LeadTools答题卡识别方案
/// <summary> /// 批改操作 /// </summary> public AnswerCard DoCorrect(Stream AnserCardFile) ...
- 【4opencv】识别复杂的答题卡1(主要算法)
一.问题提出 由于GPY进行了纠偏,所以在采集的时候,就已经获得了质量较高的答题卡图片 下一步就是需要从这张图片中,识别出人眼识别出来的那些信息,并且将这个过程尽可能地鲁棒化,提高识别的准确率. 二. ...
- 浅谈人脸识别中的loss 损失函数
浅谈人脸识别中的loss 损失函数 2019-04-17 17:57:33 liguiyuan112 阅读数 641更多 分类专栏: AI 人脸识别 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- 识别简单的答题卡(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 ...
- opencv 识别答题卡
参考这个网站,然后自己 找了张图片试了一下 http://blog.csdn.net/cp562090732/article/details/47804003 // test.cpp : 定义控制台应 ...
- Android性能优化的浅谈
一.概要: 本文主要以Android的渲染机制.UI优化.多线程的处理.缓存处理.电量优化以及代码规范等几方面来简述Android的性能优化 二.渲染机制的优化: 大多数用户感知到的卡顿等性能问题的最 ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 浅谈单页应用和多页应用——Vue.js向
浅谈单页应用和多页应用--Vue.js向 多页面 多页面应用:每次页面跳转,后台都会返回一个新的HTML文档,就是多页面应用. 在以往传统开发的应用(网站)大多都是多页面应用,路由由后端来写. 页面跳 ...
随机推荐
- Centos6.9安装部署nginx服务器
(一)依赖包安装 首先,gcc,pcre,zlib,openssl安装一边(可以用非-devel,但是嫌麻烦....用非-devel的看这个链接) yum -y install gcc ------ ...
- 批处理注册dll时候 遇到错误:模块已加载,但对***dll的调用失败
解决方法 在批处理的第一行加入:cd /d %~dp0 然后在批处理上右键选择使用管理员权限运行
- Effective Java 第三版——29. 优先考虑泛型
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- MySQL5.6安装(RPM)笔记
1. 检查MySQL是否安装,如果有安装,则移除(rpm –e 名称)[root@localhost ~]# rpm -qa | grep -i mysqlmysql-libs-xxxxxxxxxx. ...
- text和submit框的border问题
A1:在input框中,为type为text的输入框增加边框,它会在内容区域外额外增添,但是在submit框中,它会占用内容区块的一部分作为边框 <style type="text/c ...
- mysql数据库表字段使用DESC等关键字报错及解决方法
<!-- desc是MySQL数据库的关键字,作为字段名直接使用会报错 --><sql id="Base_Column"> id,mol,ip,port,n ...
- 【转】rinex
RINEX(Receiver INdependent Exchange)格式是与接收机无关的数据交换格式,该格式采用文本文件存储数据,数据记录格式与接收机的制造厂商和具体型号无关.RINEX ...
- tomcat调优(三)
标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.安全优化 降权启动 telnet管理端口保护 ajp连接端口保护 禁用管理端 关闭本地默认 ...
- 多对多中间表详解 -- Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- fread和fwrite的使用
fread和fwrite的使用 fread和fwrite一般用于二进制文件的输入/输出,要不然你打开fwrite写入的文件就是乱码. 1.fread和fwrite函数 数据块I/O fread与fwr ...