我使用OpenCV和两个网络摄像头进行立体声设置。使用BM对应算法计算了基本矩阵和基本矩阵,介绍了提取等。现在我想找到左边图像中一个像素在另一张图像中的匹配点。为了做到这一点,我定义了以下函数,这是不完整的,因为我的主要目的是计算现实世界的距离。
void StereoVision::findEpipolarLineForXY(int x, int y ,int lr)
{
if(calibrationDone)
{
CvPoint3D32f p1={x,y,1};
qDebug("%d,_,_,%d",p1.x,p1.y);
CvMat pt1=cvMat(3,1,CV_64FC1,&p1);
qDebug("-");
CvMat e=_E;
qDebug("pt1:");
PrintMat(&pt1);
qDebug("e:");
PrintMat(&e);
//CvMat * corLine;
//CvMat* pt2=e*pt1;
CvMat *pt2 = cvCreateMat( e.rows, pt1.cols, CV_64FC1);
qDebug("pt2:");
PrintMat(pt2);
qDebug("--%d--->%d",pt2->rows,pt2->cols);
cvMatMul( &e, &pt1, pt2 );
qDebug("--%d--->%d",pt2->cols,pt2->data);
//const CvMat* f=&_F;
qDebug("---");
//cvComputeCorrespondEpilines(&mat,lr,f,corLine);
qDebug("----");
//qDebug("%d,,,%d",corLine->height,corLine->rows);
}
}
void StereoVision::PrintMat(CvMat *A)
{
int i, j;
for (i = 0; i < A->rows; i++)
{
QDebug dbg(QtDebugMsg);
dbg<<"n";
switch (CV_MAT_DEPTH(A->type))
{
case CV_32F:
case CV_64F:
for (j = 0; j < A->cols; j++)
dbg <<"%8.3f "<< ((float)cvGetReal2D(A, i, j));
break;
case CV_8U:
case CV_16U:
for(j = 0; j < A->cols; j++)
dbg <<"%6d"<<((int)cvGetReal2D(A, i, j));
break;
default:
break;
}
dbg.~QDebug();
}
qDebug("");
}
我想知道为什么本质矩阵是坏矩阵?所有输出如下:
350年, , 317
0 1081466880
pt1:
%8.3f 350
%8.3f 317
%8.3f 1
e:
%8.3f 0 %8.3f f 0
%8.3f 0 %8.3f 0 %8.3f 0
%8.3f 0 %8.3f 0 %8.3f 0
pt2:
%8.3f -inf
%8.3f -inf
%8.3f -inf
1——3——>
- 1 -> 44201616
我也想知道我是否在正确的路径上找到像素的三维距离在现实世界的坐标?
你应该查一下立体声测距。
如果你有视差像素值,即两帧中两点之间的水平像素距离,你可以找出该点的真实世界深度(相对于相机基线)。
focal_length_pixels = focal_length_mm * sensor_pixels_per_mm;
distance_mm = baseline_mm * focal_length_pixels / disparity_pixels;
disparity_pixels
-两帧之间的水平像素距离(该点)。如。左图点为(100, 150)
,第二图点为(125, 160)
,则disparity_pixel = 25
你可以从你的相机规格得到focal_length_mm
。
focal_length_pixels = distance_mm * disparity_pixels / baseline_mm;
sensor_pixels_per_mm = focal_length_pixels / focal_length_mm;
保持物体距离摄像机基线x mm
。并获得如上所示的disparity_pixels
。你知道baseline_mm
。这将给出focal_length_pixels
和sensor_pixels_per_mm
。读这。