扑克纸牌识别.docx
- 文档编号:5715670
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:20
- 大小:151.15KB
扑克纸牌识别.docx
《扑克纸牌识别.docx》由会员分享,可在线阅读,更多相关《扑克纸牌识别.docx(20页珍藏版)》请在冰豆网上搜索。
扑克纸牌识别
课程设计
课程名称
题目名称
学生学院
专业班级
学号
学生姓名
指导教师
年月日
摘要
随着图像处理、人工智能、计算机技术的不断发展,计算机识别技术也日趋成熟,逐渐转为使用阶段,目前计算机识别方法主要有两种:
1)标记识别技术;
2)基于图像处理的识别技术。
第一种方法是先在识别目标上预先安设一个标记,标记可以是IC条形码等,再将目标的信息存储在标记中,则从标记中可以识别出目标及其它相关的内容。
这种方法的优点是识别准确度高、速度快和可靠,但由于这种方法对硬件的要求,使得它存在了许多的局限性,若应用到扑克纸牌识别当中,需要为纸牌装有一个微型的IC,这样的设备价格十分昂贵,同时也摒弃了纸牌的实际用途,普及实用性不强。
基于图像处理的识别技术相比较第一种方法的优势在于不需要给识别目标添加任何辅助设备就可以对其进行识别。
应用到扑克纸牌识别当中,对目标信息的采集是非接触性的,可以实时识别,非人工操作,工作效率高。
这种方法是基于计算机视觉和图像处理技术,作为一个软件系统,更方便维护和升级,通用性更强。
存在着这几方面的优势,基于图像处理的识别技术具有很大的发展空间。
基于图像处理的纸牌识别主要包括纸牌图像预处理(倾斜校正与定位)、特征提取、特征匹配、纸牌识别等方面的技术。
系统构成如上图所示,当系统发现监视图像发生变化时,触发图像采集,通过CCD摄像头摄取的纸牌图像,然后识别系统对纸牌图像进行一系列处理从而识别出纸牌,输出识别结果。
纸牌图像预处理
传感器触发CCD摄像头进行图像采集后可以得到一张图像,图像中包括背景和待识的目标纸牌,但目标纸牌在图像中并不一定是正放的,许多的时候纸牌与图像的边缘形成一定的倾斜角度,如下图所示:
因此,纸牌识别之前,必须先对目标纸牌进行倾斜校正和定位。
对于整个纸牌识别系统来说,纸牌识别精确度的高低很大程度下取决于纸牌的倾斜校正与定位精确度高低,这是十分重要的一步。
纸牌形状为一矩形,纸牌是否倾斜可以以纸牌的物理边缘是否与图像边缘倾斜为准则,若纸牌的物理边缘与图像边缘呈0或90度(平放或正放),则纸牌没有发生倾斜,反之,则存在倾斜。
根据以上分析的特点,可以利用Hough变换和边缘检测结合的方法实现纸牌的倾斜校正与定位。
Hough变换是利用极坐标变换的方法,在图像中进行像素的累加,从而估算出最长直线与图像边缘所成倾斜的角度。
如下左图所示,首先在原图像中引入ρ、θ和L三个参数,通过ρ和θ参数的变化可以累加出对应L的值(直线长度):
利用Hough变换,可以很容易地得出在图像中最长直线的长度和该直线与图像边缘对应所成的角度。
对于大多数的纸牌来说,我们可以直接把检测出来最大的L所对应的倾斜角θ视为纸牌的倾斜,这是因为,纸牌本身拥有的一条较长边缘,而任何角度上的直线像素累加都不能与之相比。
但对于一些内部图案很复杂的纸牌,如J、Q、K和JOKER,由于图案边缘复杂性的原因,Hough变换后就会产生一些非纸牌物理边缘而长度超过物理边缘的线条,此时,该线条对应的倾斜角θ就不是纸牌与图像所成的真实倾斜角度。
这些复杂线条信息的存在,会对纸牌物理边缘的确认产生十分大的影响,因此,在Hough变换之前,必须采取一些操作,最大程度地去除这些复杂的边缘信息的同时,保留纸牌的物理边缘信息。
可以在经过边缘检测的前提下,通过形态学闭操作把纸牌内部的复杂线条模糊化,然后再对模糊化后的图像进行边缘检测,具体效果如下图:
第二次的边缘检测只保留了纸牌的物理边缘。
经过以上的步骤后,再对图像进行Hough变换,就可以准确地确认出纸牌的物理边缘,然后对纸牌进行倾斜校正与定位,Matlab程序实现如下:
functionpoker=rectify(rgbimage)
%扑克目标校正且定位函数
grey=rgb2gray(rgbimage);%灰度化图像
ed1=edge(grey,'sobel','both');%灰度化图象边缘化
bw1=imclose(ed1,strel('disk',20));%形态学闭操作圆形结构体
%以上形态学操作为了模糊纸牌内部的线条结构
%从而减小J,Q,K,JOKER纸牌等内部复杂边缘对定位的影响
ed2=edge(bw1,'sobel','both');%对纸牌的物理边缘进行检测
bw2=bwmorph(ed2,'dilate');%结构性膨胀加强边缘效果
hough=radon(bw2,-90:
90);%-90到90度的hough变换
[m,n]=size(hough);
rotate=0;%倾斜角值
sline=0;%最长直线长度
fori=1:
m
forj=1:
n
ifhough(i,j)>sline;
rotate=j-1;sline=hough(i,j);
end
end
end
ed3=bwmorph(ed2,'clean',10);
bw3=imrotate(ed3,-rotate);%预校正
[m,n]=find(bw3);%预测校正后的目标位置
rgb=imrotate(rgbimage,-rotate,'bilinear');%倾斜校正
poker=rgb(min(m):
max(m),min(n):
max(n),:
);%定位
[m,n]=size(poker);
ifn>m
poker=imrotate(poker,90,'bilinear');
end
纸牌特征提取
纸牌具有很多的特征,如字符特征,花形特征,图案特征,颜色特征等,不同的纸牌具有不同的特征。
根据特征的组合,可以产生出54纸不同的纸牌。
纸牌识别的第一步,必须在待识别的纸牌中提取它所具备的特征。
由于纸牌内部的图案较复杂,对其操作运算量较大,不以其作为识别的特征。
而字符和花形特征结构较为简单,易于操作,所以应该在纸牌中提取字符与花形的特征,并以这两个特征识别出纸牌。
在纸牌倾斜校正与定位后,根据纸牌的固有属性,可以大概地定位出纸牌上字符与花形的位置,然后把字符与花形粗略提取出来。
提取出字符与花形的大概位置后,必须对提取出的图像进行二值化,进一步提取特征。
二值化是指整幅图像像素仅有黑、白二值的图像。
由于“非黑即白”的特性,二值图像在数字图像处理中占有非常重要的地位。
二值化的关键是要找到合适的阈值来区分对象和背景。
阈值选取有许多的方法,常用的阈值选取方法有:
直方图双峰法、自适应局部阈值法、最佳阈值法等。
Ostu算法是最佳阈值算法的一种。
Ostu算法是利用最大类间方差法,判决分析最小二乘法的原理基础上推导得出的。
它的计算步骤是先计算图像的灰度直方图概率函数,然后以阈值为基准将灰度级划分为两类,Ostu算法求二值化最佳阈值的Matlab程序实现如下:
functionlevel=ostu(IMAGE)
%最大类间方差ostu算法,求最佳阈值
[m,n,s]=size(IMAGE);
ifs==1
image=IMAGE;
end
ifs==3
image=RGB2gray(IMAGE);
end
ranks=256;
counts=imhist(image,ranks);
p=counts/sum(counts);omega=cumsum(p);
mu=cumsum(p.*(0:
ranks-1)');mu_t=mu(end);
sigma2=0;%otsu类间方差
T=0;%原始阈值
h=0;
Hmax=0;
w0=0;w1=0;
u0=0;u1=0;
HStore=zeros(1,256);
fori=1:
ranks
if(omega(i)==0)|((1-omega(i))==0)
continue;
end;
w0=omega(i);w1=1-w0;
u0=mu(i)/w0;u1=(mu_t-mu(i))/w1;
sigma2=w0*(u0-mu_t).^2+w1*(u1-mu_t).^2;
h=sigma2;HStore(i)=h;
end
Hmax=max(HStore);
isfinite_maxval=isfinite(Hmax);
ifisfinite_maxval
idx=mean(find(HStore==Hmax));
level=(idx-1)/(ranks-1);
else
level=;
end
在字符和花形粗略定位并且二值化之后,有时会残留一些很长边缘信息。
这些边缘信息多数来自于纸牌本身的图案边缘或背景残留。
由于这些线条多数与字符和花形的颜色相近,因此在图像二值化之后仍然会保留下来。
这些多余的边缘信息给特征的正确提取带来了很大的影响,所以在字符分割之前去除这些干扰是必要的。
这些边缘信息都具有连续不跳变的特性,因此可以利用这个特性对二值化图像进行扫描,当出现超过一定长度不跳变的线条,把它视为干扰信息,并且把它去除。
清除干扰线条的Matlab实现程序如下:
functionstr=reduce(bwstr);
%去除干扰边缘信息
[m,n]=size(bwstr);
temp=ones(m,n);
num=1;
forj=1:
n
count=0;
fori=1:
m
ifbwstr(i,j)==0;%线条不连续
count=0;continue;
else
count=count+1;%连续不跳变点数增加
ifcount>=m/3;%连续不跳变长度超过1/3边长
break;
end
end
end
ifcount>=m/3
line(num)=j;
num=num+1;%记录扫描到线条位置
end
end
fori=1:
num-1%清除干扰边缘
forj=1:
m
temp(j,line(i))=0;
end
end
str=logical(double(bwstr).*temp);
这个算法对断裂较多的线条没有作用,但能够在一定程度下消除了线条对目标信息的干扰,为纸牌识别的准确度提供一个保障。
纸牌识别
在识别技术中,被广泛采用的有两类特征:
结构特征和统计特征。
常用的结构特征主要有:
笔道密度函数、空洞和缺口、字符的特殊节点数。
而常用的统计特征主要有复杂指数、粗网格特征、垂直和水平投影。
纸牌中有字符和花形两种字符,字符包括A、2、3、4、5、6、7、8、9、10、J、Q、K、JOKER十四种;而花形包括:
黑桃、红桃、梅花和方片四种。
不论采用结构特征还是统计特征的匹配方法方法,均需要与一个系统预知道的标准符号模板库进行匹配。
结构特征匹配的识别准确率较高,但是运算量十分大,用于符号结构较复杂的识别;统计特征匹配识别准确率相对较低,但运算量少,适用于结构简单的符号识别。
纸牌只有14个字符和4个花形符号,而且结构较简单,这里选用统计特征匹配。
对于不同的符号,其投影均不相同。
因此,可以利用待识别符号投影与模板中各符号的投影求均方差,选择均方差最小(即与待识别符号投影偏离最小)所对应的模板符号作为识别结果。
在符号中,JOKER信息像素所占数目较多,可以先对其确认。
在匹配前先对符号进行一定的结构性膨胀,由于JOKER具有多个字符,在膨胀后非零像素增加的数量定会大大的大于其它纸牌。
这里设置一个临界值,当某待识别纸牌特征像素数量大于此临界值时把这张纸牌识别为JOKER,小于临界值再与其他模板进行匹配,这样就可以不需要额外加入JOKER模板,同时也一定程度下提高了系统的识别效率。
Matlab-GUI程序实现
新建一个空的GUI任务:
设置菜单栏:
菜单栏选择项映射Callback函数:
各菜单选择项映射函数具体定义:
打开(O)——打开一幅图像,并且显示到窗口上。
functionnew_Callback(hObject,eventdata,handles)
globalIMAGE;
globalPOKER;
globalGRAY;
globalBW;
globalBWSTR;
name=0;
[name,path]=uigetfile({'*.bmp';'*.jpg';'*,tif'},'打开图像');
ifname==0;%没有打开图像
return;
end
IMAGE=imread(strcat(path,name));%成功打开图像
POKER=0;GRAY=0;BW=0;BWSTR=0;%其他图像复位
subplot(1,1,1),imshow(IMAGE),title('扑克纸牌图像');
倾斜矫正与定位(Y)——对纸牌图像进行倾斜校正和纸牌定位,计算定位耗时并显示。
functionrectify_Callback(hObject,eventdata,handles)
globalIMAGE;
globalPOKER;
ifIMAGE==0;%未打开图像
msgbox('请先打开一幅扑克图像','错误','error');
else
tic;%计算校正与定位用时
POKER=rectify(IMAGE);%自定义函数rectify()
iftoc>5%设置超时时间为3秒
msgbox('图像校正定位超时','错误','error');
return;
end
time=num2str(toc);
str=strcat('校正与定位耗时',time,'秒');
subplot(1,1,1),imshow(POKER),title('扑克纸牌');
msgbox(str,'消息');
end
图像二值化(B)——对纸牌图像进行二值化,阈值用最佳阈值ostu算法计算得出。
functionbinary_Callback(hObject,eventdata,handles)
globalIMAGE;%全局变量
globalPOKER;
globalGRAY;
globalBW;
ifIMAGE==0%未打开图像
msgbox('请先打开一幅扑克图像','错误','error');
elseifPOKER==0%未进行图像校正
msgbox('请先对图像进行校正定位','错误','error');
elseifGRAY==0%未进行图像灰度化
msgbox('请先对图像进行灰度化','错误','error');
else
bw=im2bw(GRAY,ostu(GRAY));%自定义函数ostu()
BW=logical(abs(double(bw)-1));
subplot(1,1,1),imshow(BW),title('图像二值化');
end
纸牌字符提取(P)——提取纸牌的特征字符。
functiongetsymstr_Callback(hObject,eventdata,handles)
globalIMAGE;
globalPOKER;
globalGRAY;
globalBW;
globalBWSTR;
ifIMAGE==0%未打开图像
msgbox('请先打开一幅扑克图像','错误','error');
elseifPOKER==0%未进行图像校正
msgbox('请先对图像进行校正定位','错误','error');
elseifGRAY==0%未进行图像灰度化
msgbox('请先对图像进行灰度化','错误','error');
elseifBW==0%未进行图像二值化
msgbox('请先对图像进行二值化','错误','error');
else
[m,n]=size(GRAY);
pokerstr=GRAY(2:
m/2,n/20:
n/;%字符粗略定位
bw=im2bw(pokerstr,ostu(pokerstr));%自定义函数ostu()
bw1=bwmorph(bw,'clean');%清除孤立点
bw2=logical(abs(double(bw)-1));%二值图像反色
bw3=reduce(bw2);%自定义函数reduce()
[m,n]=size(bw3);
temp=sum(bw3);shadow(2:
n+1)=temp;shadow
(1)=0;shadow(n+2)=0;
fori=2:
n+1
ifshadow(i)~=0&shadow(i-1)==0&shadow(i+1)==0%出现孤立线条
forj=1:
m
bw3(j,i-1)=0;%删除孤立线条列
end
end
end
[m,n]=find(bw3);
BWSTR=bw3(min(m):
max(m),min(n):
max(n));
subplot(1,1,1),imshow(BWSTR),title('纸牌特征字符');
end
花形
扑克识别(R)——对字符特征进行匹配识别,并且输出识别结果。
functionrecognition_Callback(hObject,eventdata,handles)
globalIMAGE;
globalPOKER;
globalGRAY;
globalBW;
globalBWSTR
%纸牌字符模板,34*22投影
str1=[66668810101010888810108,...
888121216161212888816161616];%A
str2=[10101616121212121212664488,...
886666666688101022222222];%2
str3=[22221414101088888121214146,...
644444444888121218181212];%3
str4=[22446688101012121010101088,...
101012122020222266666688];%4
str5=[181816164444416161616664444,...
4444441012121616121222];%5
str6=[991515775533551414181812129,...
9991111111177101014141111];%6
str7=[15152222141499555555444466,...
44446644444444];%7
str8=[101016161010668866121214141414,...
101088888888141418181010];%8
str9=[141416168888121212101012121212,...
1818161644446661212141488];%9
str10=[10101616141412121212121212121212,...
121212121212121212121212161616161010];%10
str11=[1313111155555555555555555,...
55599991414131344];%J
str12=[111110101010666666666661010,...
141416161212101010101018181212];%Q
str13=[202020201212101010101010881212,...
1212121210101010101088101018182020];%K
STR=[str1;str2;str3;str4;str5;str6;str7;str8;str9;str10;str11;str12;str13];
%纸牌花形模板,24*20投影
style1=[446688121216161616,...
20202020202014146666];%黑桃
style2=[121220202020202018181616,...
1414121288664422];%红桃
style3=[448810101010881616,...
20202020202012124444];%梅花
style4=[2244661212161620202020,...
16161212666622];%方片
STYLE=[style1;style2;style3;style4];
ifIMAGE==0%未打开图像
msgbox('请先打开一幅扑克图像','错误','error');
elseifPOKER==0%未进行图像校正
msgbox('请先对图像进行校正定位','错误','error');
elseifGRAY==0%未进行图像灰度化
msgbox('请先对图像进行灰度化','错误','error');
elseifBW==0%未进行图像二值化
msgbox('请先对图像进
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 扑克 纸牌 识别
![提示](https://static.bdocx.com/images/bang_tan.gif)