opencv多摄像头配准_关于OpenCV图像配准角点匹配求助!!!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值