通过单应矩阵转换向量时出错 - C++ OpenCV

Posted

技术标签:

【中文标题】通过单应矩阵转换向量时出错 - C++ OpenCV【英文标题】:Error transforming a vector via Homography matrix - C++ OpenCV 【发布时间】:2013-04-18 11:09:57 【问题描述】:

我有 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 错误:断言失败 (type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) 在 gemm,文件 /tmp/buildd/ros -fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/matmul.cpp,第 711 行 在抛出 'cv::Exception' 的实例后调用终止 什么():/tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/matmul.cpp:711:错误:(-215)类型== B.type( ) && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2) 在函数gemm中

中止(核心转储)

为什么?

【问题讨论】:

【参考方案1】:

您的代码有点复杂。特别是,不确定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

请注意,您实际上并不需要分配 dstMatbeforehand ;它由 OpenCV 自动完成。 Yuu 可能还应该检查 H 的类型,我不确定 cv::findHomography 返回单精度还是双精度矩阵,在这种情况下,您必须将 floatby doubleCV_32F 替换为 @ 987654330@;

【讨论】:

以上是关于通过单应矩阵转换向量时出错 - C++ OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

矩阵到向量 C++

SLAM入门之视觉里程计:单应矩阵

Rcpp:通过引用列出<->矩阵转换?? + 使用矩阵编程时优化内存分配

C++ 将大量向量转换为字符向量的最有效方法

如何在 C++ 中将一组整数转换为 3D 向量?

在 C++ 向量中存储指针时出错