主的羊Lord`s Sheep » 日志 » 极线显示opencv程序
极线显示opencv程序
Lord's Sheep 发表于 2009-06-18 03:27:17
说明:
u‘Pv = 0; 从数学解上可以知道一条极线上所有的点一定会出现在另外一条极线上。物理意义也是这样,是有两个光心和空间一点形成的平面和像平面的交线,因此极线成对出现,即对极线。
//程序在基础矩阵计算好的前提下,用鼠标交互选择图像点,
//则在对应的另一幅图像上画出极线(左右图像都可以这样操作)
const int MUlTIPLES = 4;
IplImage *image1,*image2;
char* wndName = "left Image";
char* wndName2="right Image";
int main(int argc, char* argv[])
{
......
//计算F矩阵-基本矩阵
int result=cvFindFundamentalMat(fts1,fts2,fm,CV_FM_RANSAC,1.0,0.99,status);
if(result==0) return 0;
CvSize imgSize=cvGetSize(img1);
int w=imgSize.width/MUlTIPLES,h=imgSize.height/MUlTIPLES;
IplImage* image = cvCreateImage(cvSize(w,h),8,1);
cvResize(img1,image,CV_INTER_CUBIC );
cvNamedWindow(wndName);
cvShowImage(wndName,image);
cvNamedWindow(wndName2);
cvResize(img2,image,CV_INTER_CUBIC );
cvShowImage(wndName2,image);
cvSetMouseCallback( wndName, on_mouse1, (void*)fm);
cvSetMouseCallback( wndName2, on_mouse2, (void*)fm);
cvWaitKey(-1);
......
}
void DrawEpilines(char* wndName0,IplImage*image0,CvMat* cl)
{
double a=cvmGet(cl,0,0); //得到直线方程系数
double b=cvmGet(cl,1,0);
double c=cvmGet(cl,2,0);
CvPoint pt1,pt2;
pt1.x=cvRound(-c/a); pt1.y=0;
pt2.x=cvRound(-(c+image0->height*b)/a); pt2.y=image0->height;
cvLine(image0,pt1,pt2,cvRealScalar(255),2,CV_AA);
CvSize imgSize=cvGetSize(image0);
int w=imgSize.width/MUlTIPLES,h=imgSize.height/MUlTIPLES;
IplImage* image = cvCreateImage(cvSize(w,h),8,1);
cvResize(image0,image,CV_INTER_CUBIC );
cvShowImage(wndName0,image);
// cvWaitKey(-1);
cvReleaseImage(&image);
}
void on_mouse1(int event, int x, int y, int flags, void* param)
{
CvMat* fm = (CvMat*)param;
if(event != CV_EVENT_LBUTTONUP ) return;
CvMat* point=cvCreateMat(3,1,CV_32FC1);
CvMat* cl=cvCreateMat(3,1,CV_32FC1);
cvmSet(point,0,0,float(x*4));
cvmSet(point,1,0,float(y*4));
cvmSet(point,2,0,1);
//计算极线
cvMatMul(fm,point,cl);
DrawEpilines(wndName2,image2,cl);
cvReleaseMat(&point);
cvReleaseMat(&cl);
}
void on_mouse2(int event, int x, int y, int flags, void* param)
{
CvMat* fm = (CvMat*)param;
if(event != CV_EVENT_LBUTTONUP ) return;
CvMat* point=cvCreateMat(3,1,CV_32FC1);
CvMat* cl=cvCreateMat(3,1,CV_32FC1);
cvmSet(point,0,0,float(x*4));
cvmSet(point,1,0,float(y*4));
cvmSet(point,2,0,1);
//计算极线,须先转置
CvMat* fm2=cvCreateMat(3,3,CV_32FC1);
cvTranspose( fm,fm2 );
cvMatMul(fm2,point,cl);
DrawEpilines(wndName,image1,cl);
cvReleaseMat(&point);
cvReleaseMat(&cl);
cvReleaseMat(&fm2);
}
