2012-01-05 3 views
0

대학 프로젝트 용 Android 용 수작업 알고리즘 포트를 만들고 있습니다. 알게. 주로 OpenCV 기능을 사용합니다. 솔직히 나는 그 녀석이 정말로 무엇인지 이해하지 못한다. 하지만 이건 내 문제가 아니야. 그래서 alg를 포팅합니다. 작업중인 Windows Visual Studio 프로젝트의 모든 파일을 안드로이드 프로젝트에 추가하여 여기저기서 일부 컴파일러 경고 및 오류를 수정했습니다. 주로 성공과 함께 ... 불행히도 여러 시간 동안 나를 걱정하는 파일이 있습니다. 이 파일을 컴파일 는 다음과 같은 오류가 발생합니다 :신비한 "정의되지 않은 참조"링커 오류

./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvFindChessBoardCornerGuesses': 
compat.cpp:(.text.cvFindChessBoardCornerGuesses+0x18): undefined reference to `cvFindChessboardCorners' 
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLines': 
compat.cpp:(.text.cvHoughLines+0x46): undefined reference to `cvHoughLines2' 
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLinesSDiv': 
compat.cpp:(.text.cvHoughLinesSDiv+0x54): undefined reference to `cvHoughLines2' 
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvHoughLinesP': 
compat.cpp:(.text.cvHoughLinesP+0x52): undefined reference to `cvHoughLines2' 
./obj/local/armeabi-v7a/libopencv_legacy.a(compat.o): In function `cvCalcEMD': 
compat.cpp:(.text.cvCalcEMD+0x44): undefined reference to `cvCalcEMD2' 
collect2: ld returned 1 exit status 

그것에 대해 재미있는 것은이 오류를 일으키는 유일한 라인

nPointsConnected ++; 

이 줄을 논평 또는 nPointsConnected을 감소시키는 또는 = 1 nPointsConnected 같은 값을 설정이라는 것이다 링커 오류가 사라집니다.

같은 OpenCV 헤더를 포함하여 프로젝트에 다른 파일들이 잘 컴파일되어 있습니다. 아무도 나에게 이것을 설명 할 수 있 었는가? 다른 구현이 파일 위임하는 경우 -lopencv_legacy에서와 같이 compat.o 오브젝트 파일 당기는 결국 것처럼

if (minK > FINGERTIP_ANGLE_THRESHOLD && minDir > 0) 
    { 
     nPointsGap = 0; 
     if (nPointsConnected == 0) 
      { 
       startIndex = i; 
      } 

     nPointsConnected ++; 
     if (minAngle < minK) 
     { 
      minAngle = minK; 
      minPointIndex = i; 
     } 
     fConnected = true; 
     mediumIndex += (minK * i); 
     meanPointX += (minK * contour[i].x); 
     meanPointY += (minK * contour[i].y); 
     sumAngle += minK; 
     if (fScreenshot) 
     { 
      cvCircle(pScreenshot_curvature, cvPoint(contour[i].x*2, contour[i].y*2), 
       4, CV_RGB(255,255,0), -1, 8, 0); 
      cvCircle(pScreenshot_ellipse, cvPoint(contour[i].x*2, contour[i].y*2), 
       4, CV_RGB(255,255,0), -1, 8, 0); 
     } 
    } 
+0

올바른 CV 버전의 CV를 사용하고 있지 않은 것 같습니다. 이 질문을 C + ° + 태그로 시도하십시오. – Snicolas

+0

이 프로젝트는 작동하는 OpenCV 샘플 프로젝트를 기반으로하기 때문에 나는 그렇게 생각하지 않습니다. – crizztus

+0

문제가되는 줄 주위에 좀 더 코드를 게시 할 수 있습니까? –

답변

1

이 보인다 : 제발 ...

편집 이 서라운드 코드입니다. 즉, -lopencv_legacy 뒤에 -lopencv을 지정해야 할 수 있습니다.

Android 또는 OpenCV에 대해 알지는 못하지만 오류 메시지가 표시되는 방식입니다. 이 어떤 클래스 유형이 아니면 문제를 일으킨 원인에 대한 설명이 조금 이상합니다. 이 경우 증분 연산자는 호환성 라이브러리에서만 구현되지만 다른 연산은 "실제"구현에서 사용할 수 있습니다. 오브젝트 파일에 nm을 사용하면 변경된 추가 기호로 인해 정의되지 않은 것을 발견 한 다음 정의 된 라이브러리에서 볼 수 있습니다.

+0

안녕하세요, 귀하의 제안에 감사드립니다. nPointsDisconnected는 단순한 정수입니다. – crizztus

+0

어떤 파일에 nm이 적용됩니까? – crizztus

+0

바이너리 (오브젝트 파일 (.o), 라이브러리 (.a), 공유 라이브러리 (.so) 및 실행 파일)와 함께 작동합니다. 나는 상징 정보를 쓴다. 나는 일반적으로 "nm -po foo.o | less"와 같이 사용합니다. "U"문자는 정의되지 않은 기호를 나타내며, 다른 기호는 다른 종류의 정의입니다. 변경 전후에 기호를 가져 오는 것은 새로 정의되지 않은 기호를 표시해야합니다. 이것들을 C++ filt에 보내면 C++이 어떻게 보이는지에 대한 정보를 얻을 수 있습니다 (일반적으로 [return] 형식이 없음) –

0

그냥 명확히하기 위해, 여기에 어떤 사람들은이 오류를 일으키는 증가 된 정수가 아니라고 가정하기 때문에 라고 가정합니다. 또한 그것은 내의 메소드 호출이었던 경우 나

OPENCV_MODULES := contrib legacy objdetect calib3d features2d video highgui imgproc ml flann core 

OPENCV_MODULES := contrib calib3d objdetect features2d video imgproc highgui ml legacy flann core ts 

에서 OpenCV의 메이크 에서 OpenCV의 모듈의 순서를 변경하고 수행 해야하는지 조건

(nPointsConnected > SOMEVALUE) 

레거시 모듈은 교체 할 모듈입니다. (android-opencv 메일 링리스트의 사람에게 많은 감사의 말을 전했습니다.)