2014-09-21 56 views
1

我正在研究使用Opencv的LK Optical Flow方法。当我试图执行我的代码时,我收到以下错误。Mat.Depth()Opencv

Assertion failed (ncorners >= 0 && corners.depth() == CV_32F) in cornerSubPix, file /tmp/buildd/ros-hydro-opencv2-2.4.9-2precise-20140819-1745/modules/imgproc/src/cornersubpix.cpp, line 257 terminate called after throwing an instance of 'cv::Exception' what(): /tmp/buildd/ros-hydro-opencv2-2.4.9-2precise-20140819-1745/modules/imgproc/src/cornersubpix.cpp:257: error: (-215) ncorners >= 0 && corners.depth() == CV_32F in function cornerSubPix

这里是我的代码

vector<Point2f> cornersA; 
cornersA.reserve(maxCorners); 
vector<Point2f> cornersB; 
cornersB.reserve(maxCorners); 


goodFeaturesToTrack(imgA,cornersA,maxCorners,qualityLevel,minDistance,cv::Mat(),blockSize,0,k); 


cornerSubPix(imgA, cornersA, Size(win_size, win_size), Size(-1, -1), 
       TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03)); 


// Call Lucas Kanade algorithm 

我在网上查了一下我收到了错误的部分。它主要是因为定义Point2d而不是Point2f。我找不到比这更多的东西。我是这个领域的新手。如果你们能帮我解决这个问题,我将非常感激。谢谢..

+0

看起来像使用Point2f只是断言的一半。你必须确保ncorners> = 0。我假设ncorners指的是'角落A',这是空的(没有找到功能?)。在调用'cornerSubPix'之前检查'cornersA.size()'。 – Thomas 2014-09-21 14:23:53

回答

0

我与OpenCV的Android/Java版本有同样的错误。我甚至放弃了ncorner的价值来检查它,它似乎没问题。

当我停止在老图像上运行goodFeaturesToTrack和cornerSubPix时,它终于消失了,并在NEW图像上运行它们。

所以也许尝试

goodFeaturesToTrack(imgB,cornersA,maxCorners,qualityLevel,minDistance,cv::Mat(),blockSize,0,k); 


cornerSubPix(imgB, cornersA, Size(win_size, win_size), Size(-1, -1), 
      TermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03)); 

或任何你打电话给你的新形象。如果任何人都可以弄清楚为什么会发生这种情况,我很想知道。

0

刚刚得到了同样的错误。看看cornerSubPix()源代码:

void cv::cornerSubPix(InputArray _image, InputOutputArray _corners, 
        Size winSize, Size zeroZone, 
        TermCriteria criteria) 
{ 
    Mat corners = _corners.getMat(); 
    int ncorners = corners.checkVector(2); 
    CV_Assert(ncorners >= 0 && corners.depth() == CV_32F); 
    Mat image = _image.getMat(); 
      ... 
} 

所以,这只是两个可能的原因。

  1. _corners是不适合的类型。
  2. _corners.checkVector(2) return negative - >检查你是否有空的_corners数组(这是我的情况)。