2013-06-30 3 views
0

파일에서 일부 데이터를 읽는 응용 프로그램을 실행하는 중에 다음 오류가 발생하고 이미지의 기능을 추출하고 사전 훈련 된 분류 자 ​​세트를 사용하여 결과를 예측합니다.OpenCV free() : 유효하지 않은 포인터 :

> *** glibc detected *** ./SVMread: free(): invalid pointer: 0xbfeb2670 *** 
> ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb5fe8ee2] 
> /usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb61e451f] 
> ./SVMread(_ZN2cv17FlannBasedMatcherD0Ev+0x1c)[0x804b214] 
> ./SVMread[0x804ca96] ./SVMread[0x804c0e1] 
> ./SVMread(_ZN2cv3PtrINS_17DescriptorMatcherEED1Ev+0x11)[0x804b6e9] 
> ./SVMread[0x804a8cc] 
> /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb5f8c4d3] 
> ./SVMread[0x8049ef1] 
> ======= Memory map: ======== 08048000-08050000 r-xp 00000000 00:14 101213  /home/srt/OpenCV-2.4.2/samples/cpp/SVMread 
> 08050000-08051000 r--p 00007000 00:14 101213  
> /home/srt/OpenCV-2.4.2/samples/cpp/SVMread 08051000-08052000 rw-p 
> 00008000 00:14 101213  /home/srt/OpenCV-2.4.2/samples/cpp/SVMread 
> ... 

나는 충돌 부분이 코드의 다음 섹션 중 하나에 있다고 생각하지만 실제로 웹이나 OpenCV 설명서에서 해결책을 찾을 수 없습니다.

CvFileStorage* storage = cvOpenFileStorage("svm1.yml", 0, CV_STORAGE_READ); 

const char * c; 
string clase; 
CvFileNode* cFN; 

for (unsigned int i = 0; i<Vclases.size(); i++) {    
    clase = Vclases[i]; 
    c = (clase).c_str();      
    cFN = cvGetFileNodeByName(storage , 0, c);   
    cout << "reading " << clase << endl; 
    classes_classifiers[clase].read(storage, cFN);   

} 

편집 :

 SurfDescriptorExtractor extractor1; 
    Ptr<DescriptorExtractor> extractor = &extractor1; 
    FlannBasedMatcher matcher1; 
    Ptr<DescriptorMatcher> matcher = &matcher1; 

    BOWImgDescriptorExtractor bowide(extractor,matcher); 

또는

CvFileStorage* storage = cvOpenFileStorage("svm1.yml", 0, CV_STORAGE_READ); 

Valgrind의 :

> Conditional jump or move depends on uninitialised value(s) 
> ==23398== at 0x56585C0: ____strtod_l_internal (strtod_l.c:1659) 
> ==23398== by 0x5653FAE: strtod (strtod.c:70) 
> ==23398== by 0x41425B1: icv_strtod(CvFileStorage*, char*, char**) (in /usr/local/lib/libopencv_core.so.2.4.2) 
> ==23398== by 0x415875F: icvYMLParseValue(CvFileStorage*, char*, CvFileNode*, int, int) (in /usr/local/lib/libopencv_core.so.2.4.2) 
> ==23398== by 0x804A377: main (SVMread.cpp:64) 
> ==23398== Uninitialised value was created by a stack allocation 
> ==23398== at 0x56575E4: ____strtod_l_internal (strtod_l.c:424) 

난을 해요 Valgrind의 출력에 문제가 있음을 확인 초보자 포인터와 메모리 할당 그래서 어떤 h 엘프는 감사하겠습니다. 미리 감사드립니다.

답변

0

해결책을 찾았습니다. 문제는 cv : Ptr이 dinamically 할당 된 객체와 함께 작동하기 때문에 참조로 초기화 된 포인터를 해제하려고 시도하는 동안 오류가 발생했기 때문입니다. 따라서 올바른 포인터 선언은 다음과 같습니다.

Ptr<DescriptorMatcher > matcher = new FlannBasedMatcher; 
Ptr<DescriptorExtractor > extractor(new SurfDescriptorExtractor()); 

세그먼트 화 오류가 사라졌습니다.

(참고 : 여기에 나온 답변 덕분에 해결책을 찾았습니다. OpenCV/C++ - How to free pointers

관련 문제