电脑视觉综合测试系统的制作方法

文档序号:1040894阅读:339来源:国知局
专利名称:电脑视觉综合测试系统的制作方法
技术领域
本发明属于计算机在视功能检查中的一种应用。即用计算机控制的系统来检测人眼的视力和对颜色的感受能力。
现有的视力检查是用标准的“E”字表在规定的距离和照度要求下,由被测试者判断医生所指“E”字的开口方向来判定其视力。这种方法存在某些缺陷,因为视力表是印制固定的,被测试者可以在测试前将表上“E”的开中方向背诵下来通过视力检测。所以测试结果难以做到客观准确。
在色盲的检查中,目前较为流行的色盲检查法主要是采用假同色法,在我国以俞自萍的《色盲检查图》最为流行,色盲检查图一般由各种不同的色块组成数字、动物以及一些常见的几何图形。各色块的颜色从一般色盲的混同色对中挑选,通过对图案的判别情况来检查出色盲及其种类。由于假同色图案的判别正确与否不只与两色块的色差有关还与图形的复杂程度和受测试者本人的经验有关,因此对假同色图的判断结果不能做为人的色差辨别力的一个单纯依据,同时测试图的数目有限,而每幅图只能针对某一类典型的色盲情况,测试结果只能定性地给出色盲色弱和一色性色觉等,因此现有的检查法不便于准确地划分色盲的种类,更不能进行定量地划分等级。
本系统利用计算机在图形和色彩方面容易实现并且易于量化的优点,采用计算机来产生测试所需要的图形,并判断测试结果,使视力检查和色觉的检查真正做到客观、迅速、准确。
本发明的实现是这样的该系统由一台微型计算机、显示器、打印机和操纵杆组成(操纵杆可以为线控和摇控),其构成如附图(1)所示。
在进行视力测试时,首先由计算机产生测试所需要的“E”字信号,其大小、亮度、对比度以及背景亮度都符合卫生部门颁布的标准,每次出现的“E”字,均在显示器的同一位置上,这就保证了视角的一致。被测试人在规定的距离上,手执操纵杆,当看清“E”字的开口方向后,即将操纵杆推向与“E”字开口一致的方向。每级“E”字按随机的开口方向在屏上同一位置显示两次,供被测试者判断。若两次的判断结果同时正确或错误,则断定被测试者对该图形可鉴别或不可鉴别,若两次判定一对一错,则再显示该级别的“E”字图形一次,以这次的结果来判定被测试者可否鉴别该级图形。测试图从标准正常视力(5,0)对应的“E”字图形开始测试,由程序针对前后两级测试图的判断情况分别作出相应处理。视力测试的结论分为三种情况〈1〉测试的“E”字为最小级时,仍可鉴别,视力最佳〈2〉测试的“E”字为最大级时,仍不可鉴别。最差,即异常〈3〉前一次所测的“E”字图可见,而小一级的“E”字图不可见时,取前一次的“E”字图形所对应的视力度数。
本系统对色觉敏感度的检查方法是要求被测试人判别的图形仍为“E”字图形,判断图的底色为白色,“E”形图由前景色与背景色两部份组成,前景色与背景色都是互不靠拢的色块。由前景色的色块组成了开口方向随机变化的“E”字图形(附图2),前景色与背景色的搭配是根据色盲者的混同色对挑选的,如果对这一色对可辨,则必定可以分辨“E”的开口方向,否则不可辨。前景色与背景色以及混同色对的挑选都是计算机控制。由于目前计算机彩色图形卡已相当完善,故可方便地在一定范围内显示643种色彩,所要做的只是修改显示卡中色彩DAC寄存器中R、G、B三色分量即可,运用R、G、B三色到CIE色坐标转换或R、G、B到HSV(色调、明度、纯度)的转换,可方便的在CIE坐标或HSV坐标上沿一定轨迹连续变化显示色彩。所以利用计算机的这一优势,我们只要在混同色的范围内进行一定的变化。如亮度、纯度、色调的变化,便可由统计的规律得出结果,准确确定色盲者的混同色线和颜色混同范围,因此可定量地测出被测试者为正常、色弱、色盲及一色性色觉。同时还可以用测得的数据确定一个可作为标准的色盲等级。
此外,如果在本系统中,让色彩沿着色调、明度或饱合度单考数改变的轨迹变化,即可实现人眼对色调、明度、饱合度的敏感力的定量测定。如果在以上指标的测定中引入时间参数,即让计算机的不同色彩的测试图形,按一定的出现时间出现,通过统计不同显示时间对判断正确的影响关系即可建立起一套对不同光刺激反应速度的测量标准。这将可以帮助我们建立一套全新的人眼色觉定量测定体系,这对人的色觉敏感度和大脑反映速度的测定有极大的实用意义。
以下是应用以上方法在微型机IBM-PC/XT上所作的一个实施例,该实施例较好地反映了该系统的性能和作用。(见图3~9)
{本程序在IBM-PC通用机上仿真实现了"电脑视力检测系统"的基本功能,'E'形图显示采用实施例中指明的HERCULES单色显示卡及普通单色显示器,判断输入用101键盘右边四个方向键模拟实现(扫描码分别为77H.75H.72H,80H),判断和判别过程与流程图一至,一些变量名作了变更,以程序中说明为主.本程序使用TURBO PASCAL 5.0编译,并直接调用其图形库函数,程序中皆作了说明.
program eyetext;
uses crt,graph,dos;
{使用CRT,GRAPH,DOS三个库}typell=array
of integer;
mm=array
of integer;
xxyy=recordgraph:array
of mm;
fan:array
of byte;
ability:integer;
end;
{该结构中GRAPH:对应四个方向'E'形图绘图矢量,每组矢量由12个点坐标组成;
FAN:记录'E'形图右左下上四个方向,分别用0,1,2,3来表示;
ss=array
of word;
{对应较小'E'形

图16*16点阵}constfigure:mm=(0,0,25,0,25,5,5,5,5,10,25,10,25,15,5,15,5,20,25,20,25,25,0,25);{初始'E'形图矢量}large:ll=(0,0,0,0,4,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35);
{矢量放大系数;}bao:ll=(55,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,32,31,30);
{视力度数*10}min=0;
max=20;{最大最小测示范围}var{全局变量}k,i,j:integer;
eee:array
of ss;{16个图形点阵数组}eepic:array
of mm;{矢量图缓存}testeye:array
of xxyy;
{'E'形图方向.矢量.视力记录数组}
sta0,sta1:boolean;
{分别记录前次和本次判别结果}eend:boolean;{结束判别标志}dat0,dat1:byte;{分别记录前次和本次判别极别}res:byte;{结果变量}toward:byte;{'E'形图方向变量}workfile:file of ss;{'E'图点阵库文件}filename:string[15];
findresurt:searchrec;{TURBO PASCAL中约定记录类形,主要记录文件状态}foundbool:boolean;{找到文件否}ch:char;
{搜索点阵文件函数}procedure foundmyfile;
beginfindfirst(filename,archive,findresurt);
{TURBO PASCAL文件搜寻函数,返回findresurt}if doserror=0 then beginwrite('file found');
{doserror=0表示找到文件}write(findresurt.name,findresurt.size);
foundbool:=true;
endelsebeginwrite('filenot found');
foundbool:=false;
end;
end;
{}{从文件中读出点阵,并按一定次序装入eee数组中}procedure outfile;
varzanput:ss;
beginassign(workfile,filename);
reset(workfile);
seek(workfile,1);
read(workfile,eee[2]);
seek(workfile,2);
read(workfile,eee[3]);
seek(workfile,3);
read(workfile,eee
);
seek(workfile,4);
read(workfile,eee[1]);
for i:=7 to 10 dobeginseek(workfile,i);
read(workfile,eee[i-3]);
end;
for i:=11 to 14 dobeginseek(workfile,i);
read(workfile,eee[i-3]);
end;
for i:=16 to 19 dobeginseek(workfile,i);
read(workfile,eee[i-4]);
end;
seek(workfile,18);
read(workfile,eee[15]);
seek(workfile,19);
read(workfile,eee[14]);
end;
{}{图形初始函数}procedure initialize;
vargraphdriver,graphmode:integer;
errorcode:integer;
begingraphdriver:=0;graphmode:=1;
initgraph(graphdriver,graphmode,'herc.bgi');
{TURBO PASCAL图形初始化函数,这里使HERCULES图卡进入图形状态,参数中'HERC.BGI'为图形驱动文件}errorcode:=graphresult;{函数返回值}if errorcode<>grok thenbeginwriteln('graphicserror:',grapherrormsg(errorcode);
halt(1);
end;{初始失败}
setgraphmode(cgac0);
randomize;{随机数初始化函数}end;
{}{图形矢量数据初始化}procedure predate;
vark,i,j,m:integer;
xlength:integer;
beginfor i:=0 to 20 dowith testeye[i] dobeginxlength:=-25*large[i]div 2;
ability:=bao[i];
for k:=0 to 3 dofor j:=0 to 12 dobegincase k of0:begingraph[k][2*j]:=(figure[2*j]*large[i]+xlength);
graph[k][2*j+1]:=integer(figure[2*j+1]*large[i]+xlength);
graph[k][2*j]:=graph[k][2*j];
graph[k][2*j+1]:=graph[k][2*j+1];
end;{矢量放大}1:begingraph[k][2*j]:=(figure[2*j]*large[i]);
graph[k][2*j+1]:=integer(figure[2*j+1]*large[i]);
graph[k][2*j]:=-graph[k][2*j]-xlength;
graph[k][2*j+1]:=-graph[k][2*j+1]-xlength;
end;{放大反向,产生向左'E'形图矢量}2:begingraph[k][2*j]:=(figure[2*j+1]*large[i])+xlength;
graph[k][2*j+1]:=(figure[2*j]*large[i])+xlength;
{graph[k][2*j]:=graph[k][2*j];
graph[k][2*j+1]:=graph[k][2*j+1];}end;{放大旋转,产生向下'E'形图矢量}3:
begin{graph[k][2*j]:=(figure[2*j+1]*large[i]);
graph[k][2*j+1]:=(figure[2*j]*large[i]);}graph[k][2*j]:=-graph[2][2*j];
graph[k][2*j+1]:=-graph[2][2*j+1];
end;
{放大旋转反向,产生向上'E'形图矢量}end;
end;
end;
end;
{矢量坐标位置调整,使之显示于屏幕中间}procedure let;
vark,i,j,m:integer;
xlength:real;
beginfor i:=0 to 20 dowith testeye[i] dobeginbeginfor k:=0 to 3 dobeginfor j:=0 to 23 dobeginif odd(j) thengraph[k][j]:=trunc(graph[k][j])div 5+160elsegraph[k][j]:=trunc(graph[k][j]*28 div 100+300;
end;
fan[k]:=k;
end;
end;
end;
end;
{}{接受键盘扫描码函数,返回INKEY为判别方向:0,1,2,3}procedure getkey(var inkey:byte);
var ch:char;
beginrepeat
ch:=#0;
repeatdelay(50);{TURBO PASCAL延时函数,延时防抖}until keypressed;{TURBO PASCAL检察键盘按下否函数,按下为真}delay(10);
ch:=readkey;
{readkey:TURBO PASCAL读扫描码过程,返回扫描码}until ch in [#77,#75,#72,#80];
case ch of#77:inkey:=0;
#75:inkey:=1;
#72:inkey:=3;
#80:inkey:=2;
end;{转化为方向}end;
{}{}{'E'形图显示函数}procedure show;
begincleardevice;
toward:=trunc(random(4));
{方向由随机数生成}with testeye[dat1]dobeginif dat1>3 then{如果级数>3,采用矢量绘图}beginfillpoly(12,graph[toward]);
{TURBO PASCAL图形函数,用参数给定的矢量绘图并填充}endelse{否则用点阵绘图}putimage(300,160,eee[dat1*4+toward],1);
{TURBO PASCAL图形函数,在给定坐标处显示点阵}end;
end;
{}
{判断子程序}procedure choose;
varts:array
of boolean;
{记录两次判断结果}i:integer;
inkey:byte;
beginfor i:=0 to 1 dobegininkey:=0;
show;
sound(720);delay(150);nosound;
{响铃提示}getkey(inkey);
if inkey=toward then ts[i]:=true else ts[i]:=false;
end;
if not(ts
xor ts[1]) then sta1:=ts
else{如果两次结果不同,再判断一次}beginshow;
{sound(720);delay(150);nosound;}getkey(inkey);
if(inkey=toward) then sta1:=true else sta1:=false;
end;
end;
{}{判别过程}{详见流程图}procedure anysis;
beginif sta0 xor sta1 thenbeginif sta1=true thenbegindat0:=dat1;
dat1:=dat1-1;
sta0:=sta1;
sta1:=false;
endelsebegineend:=true;
res:=testeye[dat0].ability;
end;
endelseif sta1=true then begindat0:=dat1;
if dat1>Min then dat1:=dat1-1else begineend:=true;
res:=testeye[dat0].ability;
end;
endelsebegindat0:=dat1;
if dat1<max thenbeginif dat1<max-1 thendat1:=dat1+2 else dat1:=dat1+1endelsebegineend:=true;
res:=255;
end;
end;
end;
{}{初始化}procedure init;
begineend:=false;
dat0:=5;
dat1:=dat0;
sta0:=false;
sta1:=false;
filename:='b:\eee.dat';
{eee.dat为点阵库文件}foundmyfile;
outfile;
initialize;
predate;let;
end;
{}{主程序}beginrepeatinit;
repeatchoose;
anysisuntil eend;{测示至结束标志为真}textmode(7);{回到文本状态}writeln('you eye ability is:');
if not(res=255)then writeln(res/10)else writeln('error');
{显示结果}writeln('!!!do you test continue please enter(y(Y)/n(N))');
readln(ch);
until((ch='n')or(ch='N')){连续测试}end.
{THE END}
/* DISC.II */struct cool{char redl;
char greenl;
char bluel;};/*该结构与R.G.B三基色相对应*/union key{char ch[2];
int keynum;
}kk;/*联合与扫描 返回相对应*//*以下为图形库函数*/void mysetmode(char);/*设定图形模式*/void myputpixel(int,int,char);/*绘点函数*/void setpatonly(struct cool,char);/*修改char指定色号的颜色组成*/void myouttext(int,int,char,char,char*);/*在指定处显示一字串*/
/*本程序在PC-AT系统机上仿真实现了本专利中所提出的色盲检测方法*//*程序采用TUROB-C编写;图形子程序采用自编图形库函数,在下将一一给..*//*.予说明;图形显示采用TVGA图形卡及CASPER彩色显士器,并采用5DH图.*//*形显示方式,既640*480 256色方式,本程序作为实施例,基本上说明了本方法*//*的实现过程,只在数据的后处理上作了些省略*/#include<a:\disc.h>/*自定义INCLUDE文件,附后*/#include<bios.h>
/*TURBO-C提供INCLUDE文件,包含一些中断调用过程说明*/#include<stdio.h>
/*TURBO-C提供INCLUDE文件,包含一些标准输入输出过程*//**//*全局变量*/struct cool colist[30];/*混同色对数组*/struct cool color[16];/*对应初始色号*/char toward;/*记录"E"图方向,0,1,2,3分别代表上下左右四方向*/char pand;/*记录判断结果*/int colnum;/*当前测示的颜色对号*/int right;/*正确次数统计*/double errorp,rightp;
/**//*函数及过程*/void giveresurt();/*简单的数据处理,并打出结果*/int mygetkey();/*在仿真实现中,采用101键盘模拟控制杆,本函数读取键盘扫描码*/void init();/*图形初始化*/void initcolor();/*色彩初始化*/void outcolfile();/*读出色彩文件中色彩的R.G.B三色组成*/void precolor();
void show();
/*下面四函数分别显示右左上下"E"形图*/void righte();
void lefte();
void upe();
void downe();
/*主程序*/main(){init();
do{test();
if(pand==0)err++;
if(pand==1)right++;/*记录对错次数*/colnum++;
precolor();
}while(colnum<15);
}/**//*根据随机数,产生不同方向"E"形图*/void show(){toward=random(4);
/*TURBO-C产生随机数过程*/switch (toward){case0:upe();break;
case1:downe();break;
case2:lefte();break;
case3:righte();break;
}}/**/void precolor(){/*color
,color[1]中分别记录前景与背景色对*/color
=colist[2*colnum];
color[1]=colist[2*colnum+1];
}/**//**//*初始化函数*/void init(){struct cool colorground;
int i;
colnum=0;
colorground.redl=63;
colorground.greenl=63;
colorground.bluel=63;
outdatfile("coldat.dat");/*coldat.dat文件中存放显示对*/myselmode(0x5d);
setpatonly(colorground,0);/*使底色为白色*/for(i=1;i<16;i++){setpatonly(colorground,i);}setpatonly(colorground,255);
setpatonly(colorground,254);/*让所有使用到的色为白色*/outfile("eeel.pic");/*eeel.pic为图形存贮文件*/randomize();/*TURBO-C随机初始化函数*/}void outcolfile(char*filename){FILE*datfile;
int i;
if(!(datfile=fopen(filename,"rb"))){printf("can't open file\n");exit(0);}else{for(i=0;i<30;i++){colist[i].redl=fgetc(datfile);
colist[i].greenl=fgetc(datfile);
colist[i].bluel=fgetc(datfile);
}fclose(datfile);
}}/*读出图形文件中原始图形*/void outgraphfile(char *path){FILE *fp;
int i,j,k;
char ch;
if(!(fp=fopen(path,"rb")))/*打开只读文件*/{myouttext(10,100,66,0,"cant open file");
/*自定义图形函数,于图形方式下显示一字窜*/exit(1);}else{for(j=0;j<480;j++){for(i=0;i<640;i++){ch=(char)(fgetc(fp));
myputpixel(i,j,ch);
/*自定义函数,于某坐标处绘点,ch为颜色号*/
}}}fclose(fp);/*关闭文件*/}/*判断过程*//*同一色对的"E"形图随机出现两次,如果两次判对或判错则作结果,如果两次一对一错,则第三次显士"E"图*/void test(){int mm,i;
char end;
char testf;
char res[2];
for(i=0;i<2;i++){show();
do{kk.ch[1]=0;end=1;mm=0;
do{if(kbhit())/*kbhit()为TURBO-C提供函数,检查键盘被击否*/{kk.keynum=mygetkey();end=0;}delay(20);
mm++;
}while(mm<5);
}while(end==1&&(kk.ch
!=0x77&&kk.ch
!=0x75&&kk.ch
!=0x72&&kk.ch
!=0x80));
switch(kk.ch
){case0x77:testf=3;break;/*77H,75H,72H,80H分别为键盘右边*/case0x75:testf=2;break;/*方向键的扫描码*/case0x72:testf=1;break;
case0x80:testf=0;break;
}if(testf==toward)res[i]=0;/*判断正确赋0*/}if(res
^res[1])/*如果两次结果不同,再判段一次*/{show();
do{kk.ch[1]=0;end=1;
do{if(kbhit()){kk.keynum=mygetkey();end=0;}delay(20);
i++;
}while(i<5);
}while(end==1);
switch(kk.ch
)
{case0x77:testf=3;break;
case0x75:testf=2;break;
case0x72:testf=1;break;
case0x80:testf=0;break;
}if(testf==toward)pand=0;
else pand=1;
}else pand=res
;
}/**//*以下为"E"图显示的四个子程序,由于初始图形作了一些特别处理,因而只须改变相应颜色就能显式不同朝向的"E"图*/void righte(){initcolor();
setpatonly(color[1],15);
setpatonly(color[1],13);
setpatonly(color[1],14);
setpatonly(color[1],12);
setpatonly(color[1],7);
}void lefte(){initcolor();
setpatonly(color[1],15);
setpatonly(color[1],13);
setpatonly(color[1],14);
setpatonly(color[1],12);
setpatonly(color[1],11);
}void downe(){initcolor();
setpatonly(color[1],15);
setpatonly(color[1],13);
setpatonly(color[1],3);
setpatonly(color[1],11);
setpatonly(color[1],7);
}void upe(){initcolor();
setpatonly(color[1],15);
setpatonly(color[1],11);
setpatonly(color[1],14);
setpatonly(color[1],3);
setpatonly(color[1],7);
}/**/int mygetkey(){union REGS in,out;
in.h.ah=0;
return(int86(0x16,&in,&out));
/*使用TURBO-C中断调用读取扫瞄码,返回整数高位为扫描码,低位为ASCII码*/}/**/void initcolor(){int i;
for(i=0;i<16;i++)setpatonly(color
,i);
setpatonly(color
,255);
}/*读出数据文件中的颜色对并赋值给颜色数组collist*//*该数据文件存贮了红色色盲色弱混同色对*//*根据对错概率,给出结果*/void giveresurt(){rightp=right/15;
if(rightp==0)printf("红色盲/n");
else if(right<0.5)printf("一极红色弱/n");
else if(right>0.5&rightp<0.8)printf("二极红色弱/n");
else printf("红色视觉正常");
}
权利要求
1.一种利用计算机实现的综合测试系统它包括计算机、显示器、打印机及操纵杆。其特征在于计算机通过连线与显示器相连,操纵杆与计算机相连,计算机与打印机相连组成的系统以及配合该系统完成测量人眼的视力、色觉如人眼对光刺激反应速度的计算机程序。
2.如权利要求1所述之系统其待征在于在该系统中利用具有明显方向特征的字符或符号来判断人眼的视力。
3.如权利要求1所述的系统其特征在于用具有明显方向特征的字符或符号与背景色一起构成混同色对检验人眼对颜色的判别能力。
4.如权利要求1所述之系统,通过引入时间参数在计算机控制下,判别对颜色反应的速度。
5.如权利要求1所述系统,通过推动操纵杆来指示人眼的判断结果。
全文摘要
该发明是关于使用计算机来测试人眼的视力和对颜色的辨别能力和反应速度。利用计算机的图形功能产生不同级别大小的“E”字信号,让受试者推动操纵杆确定其开口方向,由此判断视力。利用混同色对组成色块,其色块分别为前景色和背景色,由前景色组成“E”字图形,检查受试者能否分辨混同色对,从而判定“E”字的开口方向。这样可以定量地知道人眼是正常、色弱或者是色盲。同时也可以定量测定人眼对色调、明度、饱合度的敏感能力以及不同光刺激的反应速度。
文档编号A61B3/028GK1077873SQ9210809
公开日1993年11月3日 申请日期1992年4月22日 优先权日1992年4月22日
发明者王植恒, 万海峰, 傅玉川 申请人:四川大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1