2014-09-21 11 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 

의 일부입니다. 주로 Point2f 대신 Point2d를 정의하기 때문입니다. 나는 그 이상을 찾을 수 없었다. 나는이 지역을 처음 다. 여러분이 제가이 문제를 해결하도록 도울 수 있다면 정말 감사 할 것입니다. 고마워.

+0

Point2f를 사용하는 것처럼 보이는 부분은 어설 션의 절반 부분입니다. ncorners가> = 0 인지도 확인해야합니다. 나는 n 코너가'cornersA'를 언급한다고 가정하고 이것은 비어 있습니다 (어떤 특징도 발견되지 않았습니까?). 'cornerSubPix'를 호출하기 전에'cornersA.size()'를 검사하십시오. – Thomas

답변

0

OpenCV의 Android/Java 버전에서 같은 오류가 발생했습니다. 나는 심지어 그것을 체크 아웃하는 ncorners의 가치를 버리고 심지어 괜찮은 것 같았다.

OLD 이미지에서 goodFeaturesToTrack 및 cornerSubPix를 실행하지 않고 마침내 사라져서 새 이미지에서 실행했습니다.

그래서 어쩌면

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) 반환 음수 ->_corners 배열이 비어 있는지 확인하십시오 (제 경우).