




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课 程 设 计 课程名称_数字图像处理_题目名称_纸牌识别_学生学院_ _专业班级_ _学 号_ _学生姓名_ _ _指导教师_ _曹江中_一、设计题目(1)、在VC环境下实现打开、显示一幅纸牌图(设计资料中有纸牌图)。(2)、将提供的几幅图片中的纸牌进行分类和识别,要求:a、判断出是那种类型(共四类:红桃,梅花、黑桃、方片); b、检测出点数(1、210);c:将上述检测的结果输出。二、设计目的通过设计,以C+为工具,实现数字图像处理。会用数字图像处理知识对图像进行增强,如全局阈值,对图像进行旋转,边缘检测,对图像进行平移,截取图像特征并会用简单的模板匹配方法匹配判断图片内容。学会使用FMC
2、。三设计内容。(1) 基本思想为:对图片进行中值滤波去除噪声,对图像进行全局阈值处理,用锐化模板检测,纸牌边缘,左方开始测量每个点当碰到纸牌边缘时灰度为255,此时记下像素距离,从而对得到纸牌水平位置,同理得图片竖直距离,对图片进行平移,并截取左上角的特征,对特征进行基本处理,如二值化。逐一加载模板,进行匹配,匹配原理为特征于模板相同像素的个数,如个数很高则匹配成功,从而识别纸牌。(2)在下建立FMC平台。使用DIB类处理bmp格式文件。工程名为pokeridentyfy。CPokeridentyfyview.中包的DIB类有CDIB m_dib;CDIB mid_boader;CDIB bo
3、aer_crectCDIB cutmask;CDIB forcut;CDIB masknumber;CDIB masktype;用于存放,处理和显示图片。制作菜单每个对于图像处理功能,一个按键调用一个处理函数,也可一个按键调用多个处理函数。菜单及其功能如下图打开图像的代码为功能为大开所处理图像:void CPokeridentifyView:OnOpenimage() / TODO: Add your command handler code herestatic char szFilter="BMP文件(*.bmp)|*.bmp|" /定义过滤文件的类型CFileDial
4、og dlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);/定义文件对话框对象CString filename; int ret=dlg.DoModal(); /运行打开文件对方框if(ret=IDOK)filename=dlg.GetFileName(); /获取所选择图像的路径m_dib.LoadFromFile(filename); /加载图像if(!m_dib.m_bLoaded) /判断是否加载图像成功AfxMessageBox("图像打不开");return;m
5、id_boader.LoadFromFile(filename); /加载图像if(!mid_boader.m_bLoaded) /判断是否加载图像成功AfxMessageBox("图像打不开");return;boaer_crect.LoadFromFile(filename); /加载图像if(!boaer_crect.m_bLoaded) /判断是否加载图像成功AfxMessageBox("图像打不开");return;cutmask.LoadFromFile("TTcut.bmp"); /加载图像if(!cutmask.m_b
6、Loaded) /判断是否加载图像成功AfxMessageBox("图像打不开");return; forcut.LoadFromFile(filename); /加载图像if(!forcut.m_bLoaded) /判断是否加载图像成功AfxMessageBox("图像打不开");return;masknumber.LoadFromFile("1.bmp"); /加载图像if(!masknumber.m_bLoaded) /判断是否加载图像成功masktypeAfxMessageBox("图像打不开");retu
7、rn; masktype.LoadFromFile("111.bmp"); /加载图像if(!masktype.m_bLoaded) /判断是否加载图像成功AfxMessageBox("图像打不开");return; 打开一图片后为:中值滤波的代码为:void CPokeridentifyView:OnMidiamaskImage() / TODO: Add your command handler code hereif(!m_dib.m_bLoaded) AfxMessageBox("图像还打开,请先打开图像!");return;
8、 /获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j; BYTE * ptemp=(BYTE *) new BYTEnw*nh;memset(ptemp,0,nw*nh);double mid9;for(j=3/2;j<nh-3/2;j+)for(i=3/2;i<nw-3/2;i+)double result=0; int k,h;for(k=0;k<3;k+)/k行h列for(h=0;h<3;h+)midk*3+h=m_dib.m_pdata(j-k)*nw+i-h;int ii
9、,jj,tempmid;double sweep; for(ii=0;ii<8;ii+) tempmid=ii; for(jj=ii;jj<=8;jj+)if(midjj<midtempmid)tempmid=jj;sweep=midii;midii=midtempmid;midtempmid=sweep; result=mid4; if(result>255)result=255; if(result<0)result=0;ptempj*nw+i=result;memcpy(m_dib.m_pdata,ptemp,nw*nh);m_dib.UpdateData(
10、);memcpy(mid_boader.m_pdata,ptemp,nw*nh);mid_boader.UpdateDatadup(); deleteptemp;/刷新屏幕Invalidate(); 调用后结果为:全局门限的代码中先计算图像的直方图,以一个点(一般去中间值)把直方图分成两份,分别计算两部分的灰度均值,m1与m2,由(m1+m2)/2得到新的阈值与灰度分割点,知道新阈值与旧的阈值相差不到。用新的阈值进行二值化。代码为:void CPokeridentifyView:OnAllthrImage() / TODO: Add your command handler code here
11、if(!m_dib.m_bLoaded) AfxMessageBox("图像还打开,请先打开图像!");return; /获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j;double p256;/存放直方图int throld=200,thrnew=210,m1=0,m2=0;/匹配时用180for(i=0;i<256;i+)pi=0;for(j=0;j<nh;j+)for(i=0;i<nw;i+)pm_dib.m_pdataj*nw+i+; /统计各像素总数 fo
12、r(i=0;i<256;i+)pi=pi*1.0/(nw*nh);/直方图归一化 dothrold=thrnew;for(i=0;i<=throld;i+)m1=m1+pi*i;for(i=throld+1;i<256;i+)m2=m2+pi*i;thrnew=(m1+m2)/2;while( abs(thrnew=throld)<5 ); for(j=0;j<nh;j+)for(i=0;i<nw;i+)/对图像的第j行、第i列的象素的灰度信息进行判断,修改if(m_dib.m_pdataj*nw+i>thrnew)m_dib.m_pdataj*nw+
13、i=255;elsem_dib.m_pdataj*nw+i=0;/将修改的m_pdata的数据赋值给m_pDIBData,以显示修改的结果m_dib.UpdateData(); memcpy(mid_boader.m_pdata,m_dib.m_pdata,nw*nh);mid_boader.UpdateData();/刷新屏幕Invalidate(); 结果为:对图像进行边缘检测的代码为:void CPokeridentifyView:OnFindborderImage() / TODO: Add your command handler code hereif(!m_dib.m_bLoad
14、ed) AfxMessageBox("图像还打开,请先打开图像!");return; /获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j; BYTE * ptemp=(BYTE *) new BYTEnw*nh;memset(ptemp,0,nw*nh);double mask33=-1,-1,-1,-1,8,-1,-1,-1,-1;for(j=3/2;j<nh-3/2;j+)for(i=3/2;i<nw-3/2;i+)double result=0;int k,h;for
15、(k=0;k<3;k+)for(h=0;h<3;h+)result+=maskkh*m_dib.m_pdata(j-k)*nw+i-h;if(result>255)result=255;if(result<0)result=0;ptempj*nw+i=result;memcpy(m_dib.m_pdata,ptemp,nw*nh);m_dib.UpdateData(); memcpy(boaer_crect.m_pdata,ptemp,nw*nh);boaer_crect.UpdateData(); deleteptemp; /刷新屏幕 Invalidate();结果为
16、:对图片进行测量并平移校正的代码为:void CPokeridentifyView:OnAutomoveImage() / TODO: Add your command handler code hereif(!m_dib.m_bLoaded) AfxMessageBox("图像还打开,请先打开图像!");return; /获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j; BYTE * ptemp=(BYTE *) new BYTEnw*nh;memset(ptemp,0,nw*nh
17、);int movedownj,moverighti;/移动像素距离int h,k;int temp;int nwmove7,nhmove7;int nwmlength7=600,600,600,600,600,600,600,nhmlength7=600,600,600,600,600,600,600;int bnw,bnh;for(i=0;i<7;i+)nhmovei=nh*(i+1)/8;nwmovei=nw*(i+1)/8;for(k=0;k<7;k+)/寻找水平距离for(i=0;i<nw;i+) if(m_dib.m_pdatanhmovek*nw+i!=0)nh
18、mlengthk=i;break; for(k=0;k<7;k+)/寻找竖直距离for(j=nh;j>0;j-)if(m_dib.m_pdataj*nw+nwmovek!=0)nwmlengthk=nh-j;break;for(i=0;i<6;i+)/水平测量量nhmlegnth的排列k=i;for(j=i;j<7;j+)if(nhmlengthj<nhmlengthk)k=j;temp=nhmlengthk;nhmlengthk=nhmlengthi;nhmlengthi=temp;bnw=nhmlength0;for(i=0;i<6;i+)/竖直测量量n
19、wmlength的排列k=i;for(j=i;j<7;j+)if(nwmlengthj<nwmlengthk)k=j;temp=nwmlengthk;nwmlengthk=nwmlengthi;nwmlengthi=temp;bnh=nwmlength0;movedownj=-bnh;moverighti=-bnw;for(j=0;j<nh;j+)/进行平移for(i=0;i<nw;i+)h=j-movedownj;k=i+moverighti;if(h>0&&h<nh&&k>0&&k<nw)pte
20、mph*nw+k=m_dib.m_pdataj*nw+i;memcpy(m_dib.m_pdata,ptemp,nw*nh);m_dib.UpdateData();memcpy(boaer_crect.m_pdata,ptemp,nw*nh);boaer_crect.UpdateDatadup();/刷新屏幕 Invalidate();/*/for(j=0;j<nh;j+)for(i=0;i<nw;i+)h=j-movedownj;k=i+moverighti;if(h>0&&h<nh&&k>0&&k<nw)p
21、temph*nw+k=forcut.m_pdataj*nw+i; memcpy(forcut.m_pdata,ptemp,nw*nh); forcut.UpdateData(); deleteptemp;void CPokeridentifyView:OnRecreactImage() / TODO: Add your command handler code hereif(!m_dib.m_bLoaded) AfxMessageBox("图像还打开,请先打开图像!");return; /获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_
22、dib.GetDIBHeight();int i,j;int h,k;BYTE * ptemp=(BYTE *) new BYTEnw*nh;memset(ptemp,0,nw*nh);int movedownj,moverighti;/移动像素距离int bnh;int moveup=500;for(j=0;j<nh;j+)if(m_dib.m_pdataj*nw+50=255)moveup=j;break;bnh=moveup;movedownj=bnh;moverighti=0;for(j=0;j<nh;j+)for(i=0;i<nw;i+)h=j+movedownj;
23、k=i-moverighti;if(h>0&&h<nh&&k>0&&k<nw)ptemph*nw+k=m_dib.m_pdataj*nw+i;memcpy(m_dib.m_pdata,ptemp,nw*nh);m_dib.UpdateData();/刷新屏幕 deleteptemp;Invalidate();平移结果为:截取特权的代码为:void CPokeridentifyView:OnCrectGetfeature() / TODO: Add your command handler code hereif(!cutm
24、ask.m_bLoaded) AfxMessageBox("图像还打开,请先打开图像!");return; /获取图像宽和高int nw=m_dib.GetDIBWidth();int nh=m_dib.GetDIBHeight();int i,j; BYTE * ptemp=(BYTE *) new BYTEnw*nh; memset(ptemp,0,nw*nh);int nw1=cutmask.GetDIBWidth();int nh1=cutmask.GetDIBHeight();for(j=nh-nh1;j<nh;j+)for(i=0;i<nw1;i+)
25、cutmask.m_pdata(j-(nh-nh1)*nw1+i=forcut.m_pdataj*nw+i;cutmask.UpdateDatadup(); Invalidate();结果为:对特征进行处理并加载模板,进行匹配,并显示匹配结果的代码为:void CPokeridentifyView:OnFeatureRecognize() / TODO: Add your command handler code hereif(!cutmask.m_bLoaded) AfxMessageBox("图像还打开,请先打开图像!");return; /获取图像宽和高int nw=
26、cutmask.GetDIBWidth();int nh=cutmask.GetDIBHeight();int i,j;int k,h,t; BYTE * ptemp=(BYTE *) new BYTEnw*nh;/*/特征增强double p256;int throld=200,thrnew=180,m1=0,m2=0;/匹配时用180for(i=0;i<256;i+)pi=0;for(j=0;j<nh;j+)for(i=0;i<nw;i+)pcutmask.m_pdataj*nw+i+; /统计各像素总数 for(i=0;i<256;i+)pi=pi*1.0/(nw
27、*nh);/直方图归一化 dothrold=thrnew;for(i=0;i<=throld;i+)m1=m1+pi*i;for(i=throld+1;i<256;i+)m2=m2+pi*i;thrnew=(m1+m2)/2;while( abs(thrnew=throld)<5 );for(j=0;j<nh;j+)for(i=0;i<nw;i+)/对图像的第j行、第i列的象素的灰度信息进行判断,修改if(cutmask.m_pdataj*nw+i>thrnew)ptempj*nw+i=255;else ptempj*nw+i=0;memcpy(cutmas
28、k.m_pdata,ptemp,nw*nh);cutmask.UpdateData(); Invalidate();/识别 int cardnumber; float nuberthr=0.9; float typethr=0.92;CString filename; /*/数字识别 for(t=0;t<10;t+) switch(t) case 0:filename="1.bmp"break; case 1:filename="2.bmp"break;case 2:filename="3.bmp"break;case 3:fi
29、lename="4.bmp"break;case 4:filename="5.bmp"break;case 5:filename="6.bmp"break;case 6:filename="7.bmp"break;case 7:filename="8.bmp"break;case 8:filename="9.bmp"break;case 9:filename="10.bmp"break;masknumber.LoadFromFile(filename);
30、/加载图像if(!masknumber.m_bLoaded) /判断是否加载图像成功AfxMessageBox("匹配加载模板失败");return;int nw2=masknumber.GetDIBWidth();int nh2=masknumber.GetDIBHeight(); BYTE * maskptemp=(BYTE *) new BYTEnw2*nh2;/*/double p256;int throld=200,thrnew=180,m1=0,m2=0;/匹配时用180for(i=0;i<256;i+)pi=0;for(j=0;j<nh2;j+)f
31、or(i=0;i<nw2;i+)pmasknumber.m_pdataj*nw2+i+; /统计各像素总数 for(i=0;i<256;i+)pi=pi*1.0/(nw2*nh2);/直方图归一化 dothrold=thrnew;for(i=0;i<=throld;i+)m1=m1+pi*i;for(i=throld+1;i<256;i+)m2=m2+pi*i;thrnew=(m1+m2)/2;while( abs(thrnew=throld)<5 );for(j=0;j<nh2;j+)for(i=0;i<nw2;i+)/对图像的第j行、第i列的象素的
32、灰度信息进行判断,修改if(masknumber.m_pdataj*nw2+i>thrnew)maskptempj*nw2+i=255;else maskptempj*nw2+i=0;memcpy(masknumber.m_pdata,maskptemp,nw2*nh2);masknumber.UpdateData();Invalidate();delete maskptemp;/*/int count;int flag=0;for(h=0;h<31;h+)for(k=0;k<5;k+)count=0; for(j=0;j<20;j+)for(i=0;i<16;i
33、+)if(masknumber.m_pdataj*nw2+i=cutmask.m_pdata(j+h)*nw+i+k)count+;if(count*1.0/(nw2*nh2)>nuberthr)cardnumber=t;flag=1;break;if(flag=1)break; /检测花型 int cardtype; /*/ double type4;for(t=0;t<4;t+)switch(t)case 0:filename="111.bmp"break;case 1:filename="222.bmp"break;case 2:fil
34、ename="333.bmp"break;case 3:filename="444.bmp"break;masktype.LoadFromFile(filename); /加载图像if(!masktype.m_bLoaded) /判断是否加载图像成功AfxMessageBox("匹配加载模板失败");return;int nw3=masktype.GetDIBWidth();int nh3=masktype.GetDIBHeight(); BYTE * typeptemp=(BYTE *) new BYTEnw3*nh3;/*/double p256;int throld=200,thrnew=180,m1=0,m2=0;/匹配时用180for(i=0;i<256;i+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025重庆镜辰美科技有限公司招聘笔试参考题库附带答案详解
- 浙江国企招聘2025温州市现代服务业发展集团有限公司第二批招聘12人笔试参考题库附带答案详解
- 沈阳市初二数学试卷及答案
- 商务礼仪考试试卷及答案D卷
- 山东高一中考试卷及答案
- 纺织品及针织品环保法规与标准考核试卷
- 网贷平台的业务流程优化考核试卷
- 绢纺厂的智能化仓储与物流管理考核试卷
- 合成材料结构设计原理考核试卷
- 罐头食品行业绿色包装与环保材料应用考核试卷
- 驻厂协议书模板
- 《中英饮食文化差异》课件
- 树木清除合同协议
- 2024年韶关市始兴县事业单位招聘工作人员笔试真题
- 2025-2030中国风电齿轮箱行业投资策略与可持续发展建议研究报告
- 尽职调查专项法律服务合同
- 2025年小学劳动技能大赛实施方案
- 《中国脑卒中防治报告(2023)》
- 学生资助感恩教育主题班会
- 提高学生英语听力能力-英语教师的演讲
- 2025年湖北省八市高三(3月)联考英语试题(含答案和音频)
评论
0/150
提交评论