想让自己轻松点就要让计算机多为你做点!
前几天一个朋友找到我让我做一个网上阅卷系统,就是实现这么几个功能:高速扫描仪扫描试卷后得到一张一张的图片,软件的功能就是处理图片,计算成绩。再详细点就是自动识别考生涂的学号,自动识别考生的选择题答案并记录,后面的大题要分块,把每一个题从试卷中分离出来,转发给老师进行阅卷。最后就是实现成绩的汇总与分析。
说起来功能也不算复杂,实现起来细节性的东西还是挺多的,比如每一科的试卷都不相同,要做一个通用型的软件,适合各种类型的试卷,还有就是服务器的设置呀,学生信息的保密呀,各种错误的处理啊……反正挺麻烦的,都怪我知识不够。
这个项目是挺好的,作为一个大学生,能做出来的话对各方面的能力都是一种提升,可惜以我们现在的水平,做这个软件还是很困难的,我现在只会C,C++,这个软件肯定需要一个图形化界面,我MFC还不会,windows的api就会那么几个,信息的存储要用到数据库,我数据库也不会,悲剧,还有就是互联网通信技术,每台老师的电脑和服务器要进行通信,我也不知道怎么编程实现……太悲剧了!
有时候我就想在大学里我到底学到了什么?什么时候我能做出一个像模像样的软件?各种实用的技术什么时候才能掌握?看到学长一个一个都这么牛,我hold不住了,抓紧时间学把!想想刚进大学时,我基本就是一个电脑盲,不努力真不行了!我感觉我一个同学高中时都比我现在厉害……
废话不多说了,前几天我那个朋友商量了一下,他说除了识别那一块外,其他的都是小事(又是一个大牛!)。我想了想,识别那一块并不是那么难的,我应该能做到,然后就接下了这个任务。
下面说说识别的方法:这实际上就是一个概率
软件运行截图(可以正确识别学号):
程序源码:
/*
功能:网上阅卷系统的识别
作者:ma6174
邮箱:ma6174@
时间:2月23日
其他:包含的头文件来则easyx的图形库
*/
#include
#include
#include
#include
#include
#include
//定义方格的大小和方格的间距,根据实际情况做相应的修改#defineBOX_X42
#defineBOX_Y13
#defineBLANK_X18
#defineBLANK_Y25
//颜色分量类classrgb
{
public:
BYTEred;
BYTEgreen;
BYTEblue;
};
//判断一个点是不是黑色booljudge_black(rgbcolor)
{
if(color.blue+color.green+color.red<30)//可能会有点误差,根据实际情况调整returntrue;//黑色,有标记returnfalse;
}
//判断一个方格有没有被填涂booljudge_box(intx,inty,HDChdc)
{
inti,j,total=0,count=0;
COLORREFcolor;
for(i=x+2;i
for(j=y+1;j
{
total++;
color=GetPixel(hdc,i,j);
rgbtemp;
temp.red=GetRValue(color);
temp.green=GetGValue(color);
temp.blue=GetBValue(color);
if(judge_black(temp)==true)
count++;
}
}
if(double(count)/total>0.5)//黑色的比例大于50%则认为该方格被填涂returntrue;
returnfalse;
}
//判断所有的,入口参数分别是起始横坐标,起始纵坐标,行数,列数,窗口句柄voidjudge_all(intstart_x,intstart_y,inthangshu,intlieshu,HDChdc)
{
inti,j;
for(i=0;i
{
for(j=0;j
{
//Sleep(50);//circle(start_x+i*(BOX_X+BLANK_X),start_y+j*(BOX_Y+BLANK_Y),10);if(judge_box(start_x+i*(BOX_X+BLANK_X),start_y+j*(BOX_Y+BLANK_Y),hdc)==true)
{
printf("%d",j);
//outtextxy(start_x+i*(BOX_X+BLANK_X),start_y+j*(BOX_Y+BLANK_Y),"A");}
}
//printf("\n");}
}
intmain()
{
intstart_x,start_y,total=0,count=0;
initgraph(1440,900);
cleardevice();
IMAGEimg;
loadimage(NULL,"d:\\1.jpg");
HDChdc=GetImageHDC();
MOUSEMSGm;
while(1)//通过鼠标点击得到起始位置{
m=GetMouseMsg();
if(m.uMsg==WM_LBUTTONDOWN)
{
start_x=m.x;
start_y=m.y;
break;
}
}
judge_all(start_x,start_y,18,10,hdc);
printf("\n");
getch();
}