车牌校正实验报告Word格式.docx

上传人:b****4 文档编号:7901791 上传时间:2023-05-09 格式:DOCX 页数:15 大小:570.58KB
下载 相关 举报
车牌校正实验报告Word格式.docx_第1页
第1页 / 共15页
车牌校正实验报告Word格式.docx_第2页
第2页 / 共15页
车牌校正实验报告Word格式.docx_第3页
第3页 / 共15页
车牌校正实验报告Word格式.docx_第4页
第4页 / 共15页
车牌校正实验报告Word格式.docx_第5页
第5页 / 共15页
车牌校正实验报告Word格式.docx_第6页
第6页 / 共15页
车牌校正实验报告Word格式.docx_第7页
第7页 / 共15页
车牌校正实验报告Word格式.docx_第8页
第8页 / 共15页
车牌校正实验报告Word格式.docx_第9页
第9页 / 共15页
车牌校正实验报告Word格式.docx_第10页
第10页 / 共15页
车牌校正实验报告Word格式.docx_第11页
第11页 / 共15页
车牌校正实验报告Word格式.docx_第12页
第12页 / 共15页
车牌校正实验报告Word格式.docx_第13页
第13页 / 共15页
车牌校正实验报告Word格式.docx_第14页
第14页 / 共15页
车牌校正实验报告Word格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

车牌校正实验报告Word格式.docx

《车牌校正实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《车牌校正实验报告Word格式.docx(15页珍藏版)》请在冰点文库上搜索。

车牌校正实验报告Word格式.docx

X1=s(x0,y0)=c1x0+c2y0+c3x0y0+c4;

Y1=t(x0,y0)=c5x0+c6y0+c7x0y0+c8

上述表达式中总共涉及到8个参数,如果能找到4对对应点就能够建立8个方程,然后解出对应的参数,从而求出对应的几何关系

(4)模型的求解

通过对原图像做求解后的几何变换即可得出投影失真校正后的车牌图像

4.试验结果及分析

运行效果截图:

结果分析:

此次实验表明,此次实验所提出的投影校正方法能够在车牌存在较小角度倾斜的情况下较好的恢复车牌原型,且处理速度快便于实现。

不足则在于每次均需通过手工定位车牌边缘定点,所以此实验算法可以在实现对应车牌定位算法的基础上进行改进。

附:

1.参考文献

《数字图像处理与机器视觉》——张铮王艳平薛桂香著人民邮电出版社

附源代码:

//***************************************投影变形校正相关*************************************//

/*******************

voidCImgProcess:

:

ProdMat(double**ppDbMat,double*pDbSrc2,double*pDbDest,inty,intx,intz)

功能:

计算两矩阵的乘积

注:

该函数计算两个矩阵的相乘,然后将相乘的结果存放在pDbDest中。

其中pDbSrc1*的大小为x*z,pDbSrc2的大小为z*y,pDbDest的大小为x*y

参数:

double*pDbSrc1-指向相乘矩阵1的内存

double*pDbSrc2-指向相乘矩阵2的内存

double*pDbDest-存放矩阵相乘运行结果的内存指针

intx-矩阵的尺寸,具体参见函数注

inty-矩阵的尺寸,具体参见函数注

intz-矩阵的尺寸,具体参见函数注

返回值:

*******************/

{

intnCnt=0;

inti,j;

double*pDbSrc1=newdouble[m_nBasePt*m_nBasePt];

for(i=0;

i<

m_nBasePt;

i++)

{

for(j=0;

j<

j++)

pDbSrc1[nCnt++]=ppDbMat[i][j];

}

i<

y;

i++)

j<

x;

j++)

{

pDbDest[i*x+j]=0;

for(intm=0;

m<

z;

m++)

pDbDest[i*x+j]+=pDbSrc1[i*z+m]*pDbSrc2[m*x+j];

}

nCnt=0;

ppDbMat[i][j]=pDbSrc1[nCnt++];

delete[]pDbSrc1;

}

GetProjPara(CPoint*pPointBase,CPoint*pPointSampl,double*pDbProjPara)

根据基准点对儿(4对儿)确定变换参数

CPoint*pPointBase:

基准图像的基准点

CPoint*pPointSampl:

输入图像的基准点

double*pDbProjPara:

变换参数

返回值:

inti;

//投影线性方程的系数矩阵

double**ppParaMat;

ppParaMat=newdouble*[m_nBasePt];

ppParaMat[i]=newdouble[m_nBasePt];

ppParaMat[i][0]=pPointBase[i].x;

ppParaMat[i][1]=pPointBase[i].y;

ppParaMat[i][2]=pPointBase[i].x*pPointBase[i].y;

ppParaMat[i][3]=1;

double*pResMat;

//结果矩阵

pResMat=newdouble[m_nBasePt];

i++)//计算前四个系数c1,c2,c3,c4

pResMat[i]=pPointSampl[i].x;

//投影线性方程的值x'

//采用左乘系数矩阵的逆矩阵的方法解出投影变换的前4个系数c1,c2,c3,c4

InvMat(ppParaMat,m_nBasePt);

ProdMat(ppParaMat,pResMat,pDbProjPara,m_nBasePt,1,m_nBasePt);

//求出前4个系数

i++)//计算后四个系数c5,c6,c7,c8

pResMat[i]=pPointSampl[i].y;

//投影线性方程的值y'

//采用左乘系数矩阵的逆矩阵的方法解出投影变换的后4个系数c5,c6,c7,c8

ProdMat(ppParaMat,pResMat,pDbProjPara+m_nBasePt,m_nBasePt,1,m_nBasePt);

//求出后4个系数

//释放空间

delete[]pResMat;

delete[]ppParaMat[i];

delete[]ppParaMat;

BOOLCImgProcess:

InvMat(double**ppDbMat,intnLen)

计算ppDbMat的逆矩阵

ppDbMat必须为方阵

double**ppDbMat:

输入矩阵

intnLen:

矩阵ppDbMat的尺寸

BOOL

=true:

执行成功

=false:

计算过程中出现错误

*******************/

double*pDbSrc=newdouble[nLen*nLen];

int*is,*js,i,j,k;

//保存要求逆的输入矩阵

nLen;

pDbSrc[nCnt++]=ppDbMat[i][j];

doubled,p;

is=newint[nLen];

js=newint[nLen];

for(k=0;

k<

k++)

d=0.0;

for(i=k;

for(j=k;

{

p=fabs(pDbSrc[i*nLen+j]);

//找到绝对值最大的系数

if(p>

d)

{

d=p;

//记录绝对值最大的系数的行、列索引

is[k]=i;

js[k]=j;

}

}

if(d+1.0==1.0)

{//系数全是0,系数矩阵为0阵,此时为奇异矩阵

deleteis;

deletejs;

returnFALSE;

if(is[k]!

=k)//当前行不包含最大元素

for(j=0;

//交换两行元素

p=pDbSrc[k*nLen+j];

pDbSrc[k*nLen+j]=pDbSrc[(is[k]*nLen)+j];

pDbSrc[(is[k])*nLen+j]=p;

if(js[k]!

=k)//当前列不包含最大元素

for(i=0;

//交换两列元素

p=pDbSrc[i*nLen+k];

pDbSrc[i*nLen+k]=pDbSrc[i*nLen+(js[k])];

pDbSrc[i*nLen+(js[k])]=p;

pDbSrc[k*nLen+k]=1.0/pDbSrc[k*nLen+k];

//求主元的倒数

//a[k,j]a[k,k]->

a[k,j]

if(j!

=k)

pDbSrc[k*nLen+j]*=pDbSrc[k*nLen+k];

//a[i,j]-a[i,k]a[k,j]->

a[i,j]

for(i=0;

if(i!

for(j=0;

if(j!

=k)

{

pDbSrc[i*nLen+j]-=pDbSrc[i*nLen+k]*pDbSrc[k*nLen+j];

}

//-a[i,k]a[k,k]->

a[i,k]

pDbSrc[i*nLen+k]*=-pDbSrc[k*nLen+k];

for(k=nLen-1;

k>

=0;

k--)

//恢复列

pDbSrc[k*nLen+j]=pDbSrc[(js[k])*nLen+j];

pDbSrc[(js[k])*nLen+j]=p;

//恢复行

pDbSrc[i*nLen+k]=pDbSrc[i*nLen+(is[k])];

pDbSrc[i*nLen+(is[k])]=p;

//将结果拷贝回系数矩阵ppDbMat

ppDbMat[i][j]=pDbSrc[nCnt++];

deleteis;

deletejs;

delete[]pDbSrc;

returnTRUE;

MYPOINTCImgProcess:

ProjTrans(CPointpt,double*pDbProjPara)

根据变换参数对点pt实施投影变换

CPointpt:

要进行投影变换的点坐标

MYPOINT

MYPOINTretPt;

retPt.x=pDbProjPara[0]*pt.x+pDbProjPara[1]*pt.y+pDbProjPara[2]*pt.x*pt.y+pDbProjPara[3];

retPt.y=pDbProjPara[4]*pt.x+pDbProjPara[5]*pt.y+pDbProjPara[6]*pt.x*pt.y+pDbProjPara[7];

returnretPt;

ImProjRestore(CImgProcess*pTo,CPoint*pPointBase,CPoint*pPointSampl,boolbInterp)

实施投影变形校正

CImgProcess*pTo:

校准后图像的CImgProcess指针

CPoint*pPointBase:

基准图像的基准点数组

CPoint*pPointSampl:

输入图像的基准点数组

boolbInterp:

是否使用(双线性)插值

double*pDbProjPara=newdouble[m_nBasePt*2];

GetProjPara(pPointBase,pPointSampl,pDbProjPara);

//用得到的变换系数对图像实施变换

inti,j;

pTo->

InitPixels(255);

//清空目标图像

intnHeight=pTo->

GetHeight();

intnWidth=pTo->

GetWidthPixel();

nHeight;

nWidth;

//对每个点(j,i),计算其投影失真后的点ptProj

MYPOINTptProj=ProjTrans(CPoint(j,i),pDbProjPara);

if(bInterp)

intnGray=InterpBilinear(ptProj.x,ptProj.y);

//输入图像(投影变形图像)的对应点灰度

if(nGray>

=0)

pTo->

SetPixel(j,i,RGB(nGray,nGray,nGray));

else

SetPixel(j,i,RGB(255,255,255));

//超出图像范围,填充白色

else

intii=ptProj.y+0.5;

//四舍五入的最近邻插值

intjj=ptProj.x+0.5;

if(ii>

0&

&

ii<

GetHeight()&

jj>

jj<

GetWidthPixel())

SetPixel(j,i,GetPixel(jj,ii));

deletepDbProjPara;

2

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2