OpenCV imread和getFundamentalMatrix

时间:2014-03-13 05:24:35

标签: python ruby opencv

无法完成这项工作:

img1 = cv::imread('glassL.jpg')
img2 = cv::imread('glassR.jpg')

img1g = cv::Mat.new
cv::cvtColor(img1, img1g, CV_BGR2GRAY);
img2g = cv::Mat.new
cv::cvtColor(img2, img2g, CV_BGR2GRAY);

F = cv::findFundamentalMat(img1g, img2g, cv::FM_RANSAC, 0.1, 0.99)

它抛出了这个错误:

OpenCV Error: Assertion failed (npoints >= 0 && points2.checkVector(2) == npoints && points1.type() == points2.type()) in findFundamentalMat, file /tmp/opencv-XbIS/opencv-2.4.8.2/modules/calib3d/src/fundam.cpp, line 1103
/usr/local/var/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/ropencv-0.0.15/lib/ropencv/ropencv_types.rb:10509:in `find_fundamental_mat': /tmp/opencv-XbIS/opencv-2.4.8.2/modules/calib3d/src/fundam.cpp:1103: error: (-215) npoints >= 0 && points2.checkVector(2) == npoints && points1.type() == points2.type() in function findFundamentalMat (RuntimeError)

我正在使用ropencv(Ruby + FFI),但我尝试使用Python cv2并得到完全相同的错误。我找不到任何关于此的文件,我迷路了。 checkVector(2)会在灰度图像和彩色图像上返回-1,我不知道如何转换它们以使它们与findFundamentalMat一起使用。请帮助。

1 个答案:

答案 0 :(得分:0)

您将图像直接传递给计算基本矩阵的函数,这是不正确的。在文档中,它说:

  • points1 - 来自第一张图像的N个点的数组。点坐标应为浮点(单精度或双精度)。
  • points2 - 与points1具有相同大小和格式的第二个图像点的数组。

因此,您不能简单地放置图像。使用OpenCV有一个完整的示例here。但是有一个很好的解释here一步一步使用matlab,这样你就可以理解你将使用哪些点(例如哈里斯角)。