2013-05-04 1 views
3

goodFeaturesToTrack 및 calcOpticalFlowPyrLK를 사용하여 프레임 간 기능을 추적하는 프로그램을 작성했습니다. 이 프로그램은 안정적으로 작동하며 이전 프레임의 Android 카메라에서 미리보기 이미지의 옵티컬 플로우를 예측할 수 있습니다. 다음은 일반적인 과정을 설명 일부 조각입니다 :OpenCV에서 연속 프레임의 기능 추적하기

goodFeaturesToTrack(grayFrame, corners, MAX_CORNERS, quality_level, 
     min_distance, cv::noArray(), eig_block_size, use_harris, 0.06); 

...

if (first_time == true) { 
    first_time = false; 
    old_corners = corners; 
    safe_corners = corners; 
    mLastImage = grayFrame; 

} else { 

    if (old_corners.size() > 0 && corners.size() > 0) { 

     safe_corners = corners; 
     calcOpticalFlowPyrLK(mLastImage, grayFrame, old_corners, corners, 
       status, error, Size(21, 21), 5, 
       TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 30, 
         0.01)); 
    } else { 
     //no features found, so let's start over. 
     first_time = true; 
    } 

} 

위의 코드는 새로운 미리보기 프레임이 각 반복에 잡고있다 루프에서 반복해서 실행합니다. Safe_corners, old_corners 및 corner는 모두 클래스 벡터 < Point2f>의 배열입니다. 위의 코드는 훌륭하게 작동합니다.

이제까지 확인한 각 기능에 대해 몇 가지 정보를 할당 할 수있게되었습니다. 발견 된 횟수, 알고있는 기능의 설명자 일 수 있습니다. 내 이 일에 첫 번째 방법이었다 :

class Feature: public Point2f { 
private: 
    //things about a feature that I want to track 
public: 
    //getters and fetchers and of course: 
    Feature() { 
    Point2f(); 
    } 
    Feature(float a, float b) { 
    Point2f(a,b); 
    } 
} 
내 outputArrays의 모든 기능은 하위 클래스로 정의되어 있기 때문에 내 자신의 뒤틀린 세계에서 일할 마땅 < 기능을> 벡터에 벡터 < Point2f>에서 변경

다음, of Point2f. 다형성이 적용되었는데, 내가 뭔가 끔찍한 잘못을 저 지르지 않으면 이것이 왜 나에게 해롭다는 좋은 이유가 있을지 상상할 수 없습니다.

다음은 오류 메시지입니다.

OpenCV 오류 : void cv :: Matrix :: convertTo (cv :: OutputArray, int, double, double) const, 파일/home/reports/ci/slave50-SDK/파일에서 어설 션이 실패했습니다 (func! = 0) opencv/modules/core/src/convert.cpp, line 1095

그래서 포럼에 대한 제 질문은 OpenCV 함수가 실제로 Point2f 벡터를 필요로합니까, 아니면 Point2f의 자손 클래스도 마찬가지로 작동합니까? 다음 단계는 안드로이드 폰에서 모바일 코드로 작업하는 gdb를 얻는 것이고 충돌이 더 정확히 일어나는 곳을 보는 것입니다. 그러나 접근 방식에 근본적인 결함이 있다면 그 길을 따르고 싶지는 않습니다.

위의 방법을 사용하여 여러 프레임에서 기능을 추적하는 경우 각 지점의 메모리 주소가 변경됩니까? 사전에

감사합니다.

답변

0

짧은 대답은 입니다. OpenCV 기능을 사용하려면 인수로 std::vector<cv::Point2f>이 필요합니다. 벡터하지 포인터cv::Point2f에, 자신을 cv::Point2f 객체를 포함, 그래서 다형성 (polymorphic)이 없다는 것을

참고.

또한 Featurecv::Point2f에서 상속받는 것은 이상적인 솔루션이 아닙니다. 이 경우 구성을 사용하는 것이 더 간단 할 것이며 정확한 관계를 모델링하는 것은 말할 필요도 없습니다 (Feature-acv::Point2f).

메모리에서 객체의 위치에 의존하는 것도 좋은 방법이 아닙니다. 오히려 선택한 데이터 구조를 읽으십시오.

+0

'Feature'의 각 요소가 과거의 관찰 인 'Feature :'는 'std :: vector '요소를 포함한다는 점을 제외하고는 거의 다른 경로입니다. 그것이 왜 앞으로의 추진력을지지하는 유일한 접근 이었는지에 관해서는 의미가 있습니다. –

0

난 OpenCV에 익숙해 져서 코드 측면을 다룰 수는 없지만 문제는 코드에서 초기화되지 않은 기본 클래스가 될 수있는 버그 일 수 있습니다. 코드는 다음과 같아야합니다.

Feature() 
    : Point2f() 
{ 
} 
Feature(float a, float b) 
    : Point2f(a,b) 
{ 
} 

구현시 생성자에 두 개의 임시 Point2f 객체가 만들어집니다. 이러한 임시 객체는 Feature 객체의 Point2f 기본 클래스를 초기화하지 않으며 해당 임시 객체는 생성자의 끝에서 삭제됩니다.

관련 문제