1、 X1=s(x0,y0)=c1x0+c2y0+c3x0y0+c4; Y1=t(x0,y0)=c5x0+c6y0+c7x0y0+c8上述表达式中总共涉及到8个参数,如果能找到4对对应点就能够建立8个方程,然后解出对应的参数,从而求出对应的几何关系(4) 模型的求解通过对原图像做求解后的几何变换即可得出投影失真校正后的车牌图像4.试验结果及分析运行效果截图: 结果分析: 此次实验表明,此次实验所提出的投影校正方法能够在车牌存在较小角度倾斜的情况下较好的恢复车牌原型,且处理速度快便于实现。不足则在于每次均需通过手工定位车牌边缘定点,所以此实验算法可以在实现对应车牌定位算法的基础上进行改进。附:1.参
2、考文献数字图像处理与机器视觉张铮 王艳平 薛桂香 著人民邮电出版社附源代码:/*投影变形校正相关*/*void CImgProcess:ProdMat(double* ppDbMat, double *pDbSrc2, double *pDbDest, int y, int x, int z)功能:计算两矩阵的乘积注:该函数计算两个矩阵的相乘,然后将相乘的结果存放在pDbDest中。 其中pDbSrc1 *的大小为 x*z,pDbSrc2的大小为 z*y,pDbDest的大小为 x*y参数:double *pDbSrc1 - 指向相乘矩阵1的内存double *pDbSrc2 - 指向相乘矩阵
3、2的内存double *pDbDest - 存放矩阵相乘运行结果的内存指针int x - 矩阵的尺寸,具体参见函数注int y - 矩阵的尺寸,具体参见函数注int z - 矩阵的尺寸,具体参见函数注 返回值: 无 */ int nCnt = 0; int i,j; double * pDbSrc1 = new doublem_nBasePt * m_nBasePt; for(i=0; im_nBasePt; i+) for(j=0; j j+) pDbSrc1nCnt+ = ppDbMatij; iy;i+)jx;j+) pDbDesti*x + j = 0; for(int m=0;mz;
4、m+) pDbDesti*x + j += pDbSrc1i*z + m*pDbSrc2m*x + j; nCnt = 0; ppDbMatij = pDbSrc1nCnt+; delete pDbSrc1;GetProjPara(CPoint* pPointBase, CPoint* pPointSampl, double* pDbProjPara)根据基准点对儿(4对儿)确定变换参数CPoint* pPointBase:基准图像的基准点CPoint* pPointSampl:输入图像的基准点double* pDbProjPara:变换参数返回值: int i; /投影线性方程的系数矩阵 d
5、ouble* ppParaMat; ppParaMat = new double*m_nBasePt; ppParaMati = new doublem_nBasePt; ppParaMati0 = pPointBasei.x; ppParaMati1 = pPointBasei.y; ppParaMati2 = pPointBasei.x * pPointBasei.y; ppParaMati3 = 1; double* pResMat;/结果矩阵 pResMat = new doublem_nBasePt; i+)/计算前四个系数 c1,c2,c3,c4 pResMati = pPoint
6、Sampli.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 pResMati = pPointSampli.y; /投影线性方程的值y / 采用左乘系数矩阵的逆矩阵的方法解出投影变换的后4个系数 c5,c6,c7,c8 ProdMat(ppParaMat, pResMat,
7、pDbProjPara+m_nBasePt, m_nBasePt, 1, m_nBasePt);/求出后4个系数 /释放空间 delete pResMat; delete ppParaMati; delete ppParaMat;BOOL CImgProcess:InvMat(double* ppDbMat, int nLen)计算ppDbMat的逆矩阵ppDbMat必须为方阵double* ppDbMat:输入矩阵int nLen:矩阵ppDbMat的尺寸 BOOL =true:执行成功 =false:计算过程中出现错误*/ double* pDbSrc = new doublenLen *
8、 nLen; int *is,*js,i,j,k; /保存要求逆的输入矩阵nLen; pDbSrcnCnt+ = ppDbMatij; double d,p; is = new intnLen; js = new intnLen; for(k=0;kd) d = p; /记录绝对值最大的系数的行、列索引 isk = i; jsk = j; if(d+1.0=1.0) /系数全是0,系数矩阵为0 阵,此时为奇异矩阵 delete is; delete js; return FALSE; if(isk != k) /当前行不包含最大元素 for(j=0; /交换两行元素 p = pDbSrck*n
9、Len + j; pDbSrck*nLen + j = pDbSrc(isk*nLen) + j; pDbSrc(isk)*nLen + j = p; if(jsk != k) /当前列不包含最大元素 for(i=0; /交换两列元素 p = pDbSrci*nLen + k; pDbSrci*nLen + k = pDbSrci*nLen + (jsk); pDbSrci*nLen + (jsk) = p; pDbSrck*nLen + k=1.0/pDbSrck*nLen + k; /求主元的倒数 / ak,jak,k - ak,j if(j != k) pDbSrck*nLen + j*
10、=pDbSrck*nLen + k; / ai,j - ai,kak,j - ai,j for(i=0; if(i ! for(j=0; if(j!=k) pDbSrci*nLen + j -= pDbSrci*nLen + k*pDbSrck*nLen + j; / -ai,kak,k - ai,k pDbSrci*nLen + k *= -pDbSrck*nLen + k; for(k=nLen-1; k=0; k-) /恢复列 pDbSrck*nLen + j = pDbSrc(jsk)*nLen + j; pDbSrc(jsk)*nLen + j = p; /恢复行 pDbSrci*n
11、Len + k = pDbSrci*nLen +(isk); pDbSrci*nLen + (isk) = p; /将结果拷贝回系数矩阵ppDbMat ppDbMatij = pDbSrcnCnt+; delete is; delete js; delete pDbSrc; return TRUE;MYPOINT CImgProcess:ProjTrans(CPoint pt, double* pDbProjPara)根据变换参数对点pt实施投影变换CPoint pt:要进行投影变换的点坐标 MYPOINT MYPOINT retPt; retPt.x = pDbProjPara0 * pt.
12、x + pDbProjPara1 * pt.y + pDbProjPara2 * pt.x * pt.y + pDbProjPara3; retPt.y = pDbProjPara4 * pt.x + pDbProjPara5 * pt.y + pDbProjPara6 * pt.x * pt.y + pDbProjPara7; return retPt;ImProjRestore(CImgProcess* pTo, CPoint *pPointBase, CPoint *pPointSampl, bool bInterp)实施投影变形校正CImgProcess* pTo:校准后图像的 CIm
13、gProcess 指针CPoint *pPointBase:基准图像的基准点数组CPoint *pPointSampl:输入图像的基准点数组bool bInterp:是否使用(双线性)插值 double* pDbProjPara = new doublem_nBasePt * 2; GetProjPara(pPointBase, pPointSampl, pDbProjPara); /用得到的变换系数对图像实施变换 int i, j; pTo-InitPixels(255); /清空目标图像 int nHeight = pTo-GetHeight(); int nWidth = pTo-Get
14、WidthPixel();nHeight;nWidth; /对每个点(j, i),计算其投影失真后的点ptProj MYPOINT ptProj = ProjTrans( CPoint(j, i), pDbProjPara ); if(bInterp) int nGray = InterpBilinear(ptProj.x, ptProj.y); /输入图像(投影变形图像)的对应点灰度 if(nGray = 0) pTo-SetPixel(j, i, RGB(nGray, nGray, nGray); elseSetPixel(j, i, RGB(255, 255, 255); /超出图像范围,填充白色 else int ii = ptProj.y + 0.5; /四舍五入的最近邻插值 int jj = ptProj.x + 0.5; if( ii0 & ii jjGetWidthPixel() )SetPixel(j, i, GetPixel(jj, ii); delete pDbProjPara;2