该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void CImageregistrationDlg::OnCornermatching()
{
// TODO: Add your control notification handler code here
int i,j;
const int height1=mobanImage1->height;
const int width1=mobanImage1->width;
const int height2=mobanImage2->height;
const int width2=mobanImage2->width;//这里出错了刚弄反了
const int height=height1>height2?height1:height2;
const int width=width1+width2;
int m,n;
double Dist;
//double Dmin=2;//不应该在这里定义,错的。
const int size=5;
int k=0;
int numofJD=0;
//如实没有点击平移按钮,则必须加这些代码,否则出错。dlg.m_nPingYi初始化时0,
//若点击了平移按钮,则dlg.m_nPingYi就是输入的值
BYTE* lpSrc1;
BYTE* lpSrc2;
BYTE* PingYiImageChar;
PingYiImage=cvCreateImage(cvSize(width,height+dlg.m_nPingYi),IPL_DEPTH_8U,1);
for (i=0;i
for (j=0;j
{
if(j=dlg.m_nPingYi&&i
{
lpSrc1=(uchar*)mobanImage1->imageData+mobanImage1->widthStep*(i-dlg.m_nPingYi)+j;
PingYiImageChar=(uchar*)PingYiImage->imageData+PingYiImage->widthStep*i+j;
*PingYiImageChar=*lpSrc1;
}
else if(j>=width1&&i
{
lpSrc2=(uchar*)mobanImage2->imageData+mobanImage2->widthStep*i+j-width1;
PingYiImageChar=(uchar*)PingYiImage->imageData+PingYiImage->widthStep*i+j;
*PingYiImageChar=*lpSrc2;
}
else
{
PingYiImageChar=(uchar*)PingYiImage->imageData+PingYiImage->widthStep*i+j;
*PingYiImageChar=0;
}
}
/*****************************************************2:开始连线*********************************************************/
CvPoint pt1[200];
CvPoint pt2[200];
CvPoint pt3[200];
if (height1<=height2)
{
for(j=size/2;j
for(i=size/2+2*width1/3;i
{
//每次循环都给Dmin初始化,要不然第一次循环就找到了最小的Dist下次循环的时候会有影响
double Dmin=1000;//这个要是10的话对实际图像相机不动会匹配错误
if(CV_MAT_ELEM(*mat_corner1,int,j,i)==255)//点从左上角开始的图像时从左下角开始的所以要拿height减
{
pt1[k].x=i;
pt1[k].y=j+dlg.m_nPingYi;//只要是图一的角点都保存.角点存在矩阵里,所以是从左上角开始需要加dlg.m_nPingYi
for(m=size/2;m
for(n=size/2;n<2*width2/3-size/2;n++)
if(CV_MAT_ELEM(*mat_corner2,int,m,n)==255)
{
pt2[k].x=n;
pt2[k].y=m+dlg.m_nPingYi;
Dist=Distance(mobanImage1,pt1[k],mobanImage2,pt2[k]);
/*lpSrc1=(BYTE *)junheng1->imageData+junheng1->widthStep*j+i;
lpSrc2=(BYTE *)junheng2->imageData+junheng2->widthStep*m+n;
Dist=abs(*lpSrc1-*lpSrc2);*///这个是绝对值,要不是的话,下面用Dist
//求最小欧氏距离
if (Dist
{
Dmin=Dist;
pt3[k].x=width1+n;//3*3以前不成功是因为这里面的以前为pt2,他由循环可能被上面的pt2改变
pt3[k].y=m;
numofJD++;//进行匹配连线的角点数
}
}
cvLine(PingYiImage,pt1[k], pt3[k], cvScalar(255,0,0),1);
k++;
}
}
}
else if (height1>height2)
{
for(j=size/2;j
for(i=size/2+2*width1/3;i
{
//每次循环都给Dmin初始化,要不然第一次循环就找到了最小的Dist下次循环的时候会有影响
double Dmin=1000;//这个要是10的话对实际图像相机不动会匹配错误
if(CV_MAT_ELEM(*mat_corner1,int,j,i)==255)//点从左上角开始的图像时从左下角开始的所以要拿height减
{
pt1[k].x=i;
pt1[k].y=j+dlg.m_nPingYi;//只要是图一的角点都保存.角点存在矩阵里,所以是从左上角开始需要加dlg.m_nPingYi
for(m=size/2;m
for(n=size/2;n<2*width2/3-size/2;n++)
if(CV_MAT_ELEM(*mat_corner2,int,m,n)==255)
{
pt2[k].x=n;
pt2[k].y=m+dlg.m_nPingYi;
Dist=Distance(mobanImage1,pt1[k],mobanImage2,pt2[k]);
/*lpSrc1=(BYTE *)junheng1->imageData+junheng1->widthStep*j+i;
lpSrc2=(BYTE *)junheng2->imageData+junheng2->widthStep*m+n;
Dist=abs(*lpSrc1-*lpSrc2);*///这个是绝对值,要不是的话,下面用Dist
//求最小欧氏距离
if (Dist
{
Dmin=Dist;
pt3[k].x=width1+n;//3*3以前不成功是因为这里面的以前为pt2,他由循环可能被上面的pt2改变
pt3[k].y=m;
numofJD++;//进行匹配连线的角点数
}
}
//cvLine(PingYiImage,pt1[k], pt3[k], cvScalar(255,0,0),1);
k++;
}
}
}
/***********************************************3:全等三角形精匹配******************************************************/
int t,p,s;
double x11,y11,x12,y12,x13,y13;
double x21,y21,x22,y22,x23,y23;
double d11,d12,d13;
double d21,d22,d23;
CvPoint pt11;
CvPoint pt31;
CvPoint pt12;
CvPoint pt32;
CvPoint pt13;
CvPoint pt33;
for (t=0;t<=k-3;t++)
{
x11=pt1[t].x;
y11=pt1[t].y;
x21=pt3[t].x;
y21=pt3[t].y;
for(p=t+1;p<=k-2;p++)
{
x12=pt1[p].x;
y12=pt1[p].y;
x22=pt3[p].x;
y22=pt3[p].y;
for(s=p+1;s<=k-1;s++)
{
x13=pt1[s].x;
y13=pt1[s].y;
x23=pt3[s].x;
y23=pt3[s].y;
d11=(x12-x11)*(x12-x11)+(y12-y11)*(y12-y11);
d12=(x13-x12)*(x13-x12)+(y13-y12)*(y13-y12);
d13=(x13-x11)*(x13-x11)+(y13-y11)*(y13-y11);
d21=(x22-x21)*(x22-x21)+(y22-y21)*(y22-y21);
d22=(x23-x22)*(x23-x22)+(y23-y22)*(y23-y22);
d23=(x23-x21)*(x23-x21)+(y23-y21)*(y23-y21);
if (d11==d21&&d12==d22&&d13==d23)
{
pt11=pt1[t];//保存好第一幅图像的全等三角形的第一个点
pt31=pt3[t];//保存好第二幅图像的全等三角形的第一个点
pt12=pt1[p];//保存好第一幅图像的全等三角形的第一个点
pt32=pt3[p];
pt13=pt1[s];//保存好第一幅图像的全等三角形的第一个点
pt33=pt3[s];
}
}
}
}
cvLine(PingYiImage,pt11, pt12, cvScalar(0,255,0),3);
cvLine(PingYiImage,pt12, pt13, cvScalar(0,255,0),3);
cvLine(PingYiImage,pt13, pt11, cvScalar(0,255,0),3);
cvLine(PingYiImage,pt31, pt32, cvScalar(0,255,0),3);
cvLine(PingYiImage,pt32, pt33, cvScalar(0,255,0),3);
cvLine(PingYiImage,pt33, pt31, cvScalar(0,255,0),3);
cvNamedWindow("匹配之后的图像",1);
cvShowImage("匹配之后的图像",PingYiImage);
DrawPicToHDC(PingYiImage,IDC_img6);
}