Mat :: checkVector在OpenCV中做了什么?

时间:2015-05-06 20:35:59

标签: c++ opencv mat assertion

我尝试在OpenCV(C ++)中使用以下函数

calcOpticalFlowPyrLK(prev_frame_gray, frame_gray, points[0], points[1], status, err, winSize, 3, termcrit, 0, 0.001);

我收到此错误

OpenCV Error: Assertion failed ((npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0) in calcOpticalFlowPyrLK,
file /home/rohit/OpenCV_src/opencv-2.4.9/modules/video/src/lkpyramid.cpp, line 845
terminate called after throwing an instance of 'cv::Exception'
what():  /home/rohit/OpenCV_src/opencv-2.4.9/modules/video/src/lkpyramid.cpp:845:
error: (-215) (npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0 in function calcOpticalFlowPyrLK

以下两个都返回-1

frame_gray.checkVector(2, CV_32F, true)
prev_frame_gray.checkVector(2, CV_32F, true)

我想知道checkVector实际上做了什么,因为它会导致断言错误,如上所示。

2 个答案:

答案 0 :(得分:14)

官方OpenCV的文档说:

  如果矩阵是1通道(,则

cv::Mat::checkVector()返回N.   ptdim)或ptdim-channel(1 x N)或(N x 1);否则为负数

OpenCV认为某些函数的某些数据类型是等价的,即cv::solvePnP()objectPoints可以是:

  • 1xN / Nx1 1-channel cv::Mat
  • 3xN / Nx3 3通道cv::Mat
  • std::vector<cv::Point3f>

使用checkVector,您可以确保传递正确的数据表示。

答案 1 :(得分:0)

我在cv2.projectPoints函数中也遇到了类似的问题(-215:断言失败),因为openCV期望使用nx3矩阵,并且我传递了长度为3的一维数组。

points[0].reshape(-1,3)

作为函数的参数。它将形状(3,)更改为形状(1,3)。