2015-02-03 2 views
1

OpenCV의 해리스 코너 감지 알고리즘을 사용하여 이미지의 코너를 찾으려고합니다. Lucas-Kanade Pyramidal Optical flow을 사용하여 연속 프레임에서 추적하려고합니다. 나는이 C 어떤 이유로 작동하지 않는 것 ++ 코드를 가지고 :OpenCV 해리스 코너 감지 충돌

#include <stdio.h> 
#include "opencv2/core/core.hpp" 
#include "opencv2/calib3d/calib3d.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/contrib/contrib.hpp" 
#include "opencv2/opencv.hpp" 

using namespace cv; 
using namespace std; 

void main() 

{ 
    Mat img1, img2; 
    Mat disp1, disp2; 
int thresh = 200; 

vector<Point2f> left_corners; 
vector<Point2f> right_corners; 
vector<unsigned char> status; 
vector<float> error; 

Size s; 
s.height = 400; 
s.width = 400; 

img1 = imread("D:\\img_l.jpg",0); 
img2 = imread("D:\\img_r.jpg",0); 

resize(img2, img2, s, 0, 0, INTER_CUBIC); 
resize(img1, img1, s, 0, 0, INTER_CUBIC); 


disp1 = Mat::zeros(img1.size(), CV_32FC1); 
disp2 = Mat::zeros(img2.size(), CV_32FC1); 

int blockSize = 2; 
int apertureSize = 3; 
double k = 0.04; 

cornerHarris(img1, disp1, blockSize, apertureSize, k, BORDER_DEFAULT); 
    normalize(disp1, disp1, 0, 255, NORM_MINMAX, CV_32FC1, Mat()); 

    for(int j = 0; j < disp1.size().height ; j++) 
    { 
     for(int i = 0; i < disp1.size().width; i++) 
      { 
      if((int) disp1.at<float>(j,i) > thresh) 
       { 
       left_corners.push_back(Point2f(j, i)); 
       } 
      } 
    } 

    right_corners.resize(left_corners.size()); 

    calcOpticalFlowPyrLK(img1,img2,left_corners,right_corners,status,error, Size(11,11),5);  
    printf("Vector size : %d",left_corners.size()); 


    waitKey(0); 
} 

내가 그것을 실행하면, 나는 다음과 같은 오류 메시지가 얻을 :

마이크로 소프트 비주얼 스튜디오 C 런타임 라이브러리가 감지를 OpenCVTest.exe에서 치명적인 오류가 발생했습니다. 내가 어제이를 디버깅하려고하지만, 헛된 된

OpenCV Error: Assertion failed ((npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0) in unknown function, file ..\..\OpenCV-2.3.0-win-src\OpenCV-2.3.0\modules\video\src\lkpyramid.cpp, line 71 

(OpenCVTest 내 프로젝트의 이름이다). 도와주세요.

답변

3

이전의 포인트 배열에 오류가있는 경우 source code에서 볼 수 있듯이이 오류가 발생합니다. checkVector에 대한 문서가 약간 개략적이기 때문에 정확히 무엇이 나쁜 것인지는 말하기 어렵습니다. 당신은 여전히 ​​the code을 찾을 수 있습니다. 하지만 내 생각에 left_corners 변수의 유형이 CV_32F가 아닌 잘못된 유형이거나 잘못된 모양입니다.

+0

확인. 나는 오류가 던져지고있는 방법을 얻는다. 매우 감사. 그러나 이것이 작동하게하는 방법에 대한 여전히 생각이 없습니다. – metsburg

+0

'requireContiguous' 매개 변수가'True'로 설정 되었기 때문에 (어떤 이유로) Point2f의 벡터를 전달하는 것이 허용되지 않을 수 있습니다. –

+0

"Point2f의 벡터를 전달하는 것이 허용되지 않습니다." – metsburg