通过Homography矩阵转换矢量时出错 - C ++ OpenCV

时间:2013-04-18 11:09:57

标签: opencv

我有2帧视频流由移动(非常慢)的相机完成;在使用(通过OpenCV)SIFT算法和findHomography OpenCv函数之后,我有一个转换矩阵,它描述了摄像机在2帧之间完成的移动。 我想做的是在第二帧中找到第一帧的一个点: 所以我的代码是:

H = findHomography( point1, point2, CV_RANSAC );  //compute the transformation matrix using the
                                       // matching points (the matrix is correct, i checked it)
Mat dstMat(3, 1, H.type());    
vector<Point3f> vec;
Mat srcMat(3, 1, H.type());
vec.push_back(Point3f(Ptx,Pty,-1));   // fill the 3x1 vector with the coordinate
                                         // of the interest point in frame 1
srcMat= Mat(vec).reshape(1).t();     //conversion of vec in Mat (the vector is correct, i checked it)
dstMat = H*srcMat;     //compute the arrival point in frame 2  // ERROR

但是,如果写入错误,我会收到以下错误: OpenCV错误:断言失败(类型== B.type()&amp;&amp;(type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2))gemm,file / tmp / buildd / ros-fuerte-opencv2-2.4.2-1precise-20130312-1306 / modules / core / src / matmul.cpp,第711行 在抛出'cv :: Exception'的实例后终止调用   what():/ tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/matmul.cpp:711:错误:(-215)type == B.type( )&amp;&amp; (函数gemm中键入== CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)

中止(核心倾销)

为什么?

1 个答案:

答案 0 :(得分:0)

您的代码有点费解。特别是,它不确定reshape方法的大小条目,以及转置的效果,因为您还在srcMat的大小之前指定了。

您可以尝试以下方法:

cv::Mat srcMat(3, 1, CV_32F); // Allocate a 3x1 column vector (floating point)

srcMat.at<float>(0,0) = Ptx;
srcMat.at<float>(1,0) = Pty;
srcMat.at<float>(2,0) = -1.0;

dstMat = H * srcMat;  // Perform matrix-vector multiplication

请注意,您事先并不需要分配dstMat;它由OpenCV自动完成 Yuu也许应该检查H的类型,我不确定cv::findHomography是否返回单精度矩阵或双精度矩阵,在这种情况下你必须用{{1}替换float {}}和double CV_32F;