2012-08-08 2 views
4

Google에 cvCalcPGH()를 사용하는 좋은 예나 윤곽 일치에 프리맨 코드를 사용하는 좋은 예가 없습니다. 문서화하지만 cvCalcPGH()가 실패로 실행됩니다cvCalcPGH with cvFindContours 사용

#include "opencv2/opencv.hpp" 
#include "opencv2/legacy/legacy.hpp" 

int 
main(int argc, char* argv[]) { 

     IplImage* g_gray = cvLoadImage("lisa.png",CV_LOAD_IMAGE_GRAYSCALE); 
     cvThreshold(g_gray, g_gray, 100, 255, CV_THRESH_BINARY); 

     CvMemStorage* storage=cvCreateMemStorage(0); 
     CvSeq* firstContour=NULL; 

     int a=cvFindContours(g_gray, storage, &firstContour,sizeof(CvChain),CV_RETR_LIST, CV_CHAIN_CODE); 

     CvHistogram *hist; 
     int h_bins = 30, s_bins = 30; 
     float h_ranges[] = { 0, 180 }; 
     float s_ranges[] = { 0, 255 }; 
     int hist_size[] = { h_bins, s_bins }; 
     float* ranges[] = { h_ranges, s_ranges }; 

     hist = cvCreateHist(2, hist_size, CV_HIST_ARRAY, ranges, 1); 
     if(CV_SEQ_ELTYPE(firstContour) != CV_32SC2) { 
       printf(":(\n"); 
     } 

     cvCalcPGH((CvSeq *)firstContour,hist); 
     return 0; 

} 

cvFindContours() : 그래서 나는 그것을 만들려고

$ ./calcpgh 
:(
OpenCV Error: Unsupported format or combination of formats (The contour is not valid or the point type is not supported) in cvCalcPGH, file /Users/tonu-samuel/OpenCV-2.4.2/modules/legacy/src/pgh.cpp, line 351 
terminate called throwing an exceptionAbort trap: 6 
$ 

OpenCV의이 2.4.2입니다 내가 확인 CV_SEQ_ELTYPE(contour) != CV_32SC2입니다) (어설 표시 내 코드에서도. 어떻게 고칠 수 있는지.

답변

6

Google이 좋은 예를 제공하지 않는 이유는 사용자가 말하는 모든 것이 사용되지 않기 때문입니다.

cvCalcPGH은 새로운 opencv에서 더 이상 사용할 수 없으며 기존 라이브러리를 포함하고 있으므로 이미 알고있을 것입니다.

또한 CV_CHAIN_CODEremoved이며 새로운 opencv에서는 사용할 수 없습니다.

여러분의 코드를 인기있는 새로운 opencv로 이식 할 시간을 찾아야하며 다른 사람들로부터 도움을 얻을 수 있습니다.

그러나 기존의 문서가 말한대로, 현재 코드를 논의 :

CV_CHAIN_CODE - 프리먼 체인 코드 출력 윤곽. 다른 모든 방법 출력 다각형 (정점의 순서)

cvFindContours의 출력은 항상 정점의 순서이며, CV_CHAIN_CODE는 예외입니다. 그렇기 때문에 cvCalcPGH이이 코드를 이해하지 못했습니다.

다른 근사 방법을 사용하여 코드를 이미 테스트 한 적이 있으므로 cvCalcPGH이 다각형과 잘 작동하는지 확인해야합니다.

Freeman 코드를 직접 다각형으로 변환해야합니다. 그런 다음 원하는 모든 opencv 메서드를 사용할 수 있습니다. 그러나 그것없이 Freeman 코드 자체를 해석 할 수있는 단일 방법을 보지 못했습니다.

CvChainPtReader reader; 

cvStartReadChainPoints((CvChain*) firstContour, &reader); 
for (int i = 0; i < firstContour->total; i++) { 
    CV_READ_SEQ_ELEM(reader.code, (*((CvSeqReader*)&(reader)))); 
    printf("%d \n", reader.code); 
} 

그러나 다시 :

나는 당신이 코드를 추출하여 직접 해석 시작할 수 있습니다,이 변환이 수행하지만, 뻔뻔 Sara Maher Mohammad에서 도난 아래의 코드를 사용하는 방법을 정확히 모르겠어요 , 나는 더 이상 사용되지 않는 메소드와 함수에 대해 작업하는 것을 권장하지 않는다. 당신이 원하는 것을 할 수있는 더 좋은 방법을 찾을 수있다.

프리맨 코드 두 개 사이의 거리를 찾고 싶다면 PGH를 계산하지 말고 here과 같은 다른 거리 함수를 사용하면됩니다.