ndk-build дает мне «ошибку: неопределенная ссылка» на cv :: CascadeClassifier :: load (std :: string const &) даже после того, как я скомпоновал библиотеки - PullRequest
0 голосов
/ 30 января 2019

Я использую openCV в своей родной программе Android с C ++.

Моя версия ndk-build - 14, и я использую Android Studio 3.3 RC3 и OpenCV 4.0.

Пока я пыталсяЧтобы добавить простую программу распознавания лиц для камеры и попытаться построить ее с помощью ndk-build, выдается следующая ошибка:

ошибка: неопределенная ссылка на 'cv :: CascadeClassifier :: load (std:: string const &) '

Вот мой код:

void *frameRetriever(void *p){
 ...

 const std::string face_cascade_name = "/data/local/tmp/haarcascade_frontalface_alt.xml";
 cv::CascadeClassifier face_cascade;
 face_cascade.load(face_cascade_name);
 ...
}


Я пытался использовать

cv::CascadeClassifier face_cascade = cv::CascadeClassifier(face_cascade_name)

вместо функции загрузки,или даже попробуйте

void loadCascade(std::string filepath){

  cv::CascadeClassifier face_cascade;
  if ( !face_cascade.load(filepath) ){
    LOGE("--Error Loading face cascade\n");
  }

}

, это все еще дает мне неопределенную ссылку на ошибку в ndk-build.(Файл в face_cascade_name является rwx для всех пользователей)

Я связал все библиотеки в моем Android.mk файле:

...

LOCAL_LDLIBS += -L$(OPENCV_ANDROID_SDK)/libs/armeabi-v7a/
LOCAL_LDLIBS += -lopencv_core
LOCAL_LDLIBS += -lopencv_calib3d
LOCAL_LDLIBS += -lopencv_imgproc
LOCAL_LDLIBS += -lopencv_objdetect
LOCAL_LDLIBS += -lopencv_features2d
LOCAL_LDLIBS += -lopencv_flann
LOCAL_LDLIBS += -lopencv_stitching
LOCAL_LDLIBS += -lopencv_video
LOCAL_LDLIBS += -lopencv_dnn
LOCAL_LDLIBS += -lopencv_highgui
LOCAL_LDLIBS += -lopencv_imgcodecs
LOCAL_LDLIBS += -lopencv_ml
LOCAL_LDLIBS += -lopencv_photo
LOCAL_LDLIBS += -lopencv_videoio

...

, и у меня есть все эти библиотеки OpenCV как.so файл в <myProject>/app/src/main/libs/armeabi-v7a/

Что касается сборки библиотек OpenCV, я использую следующий скрипт bash:

#!/bin/bash

if [ ! -d "./android_build/" ]; then
  mkdir android_build
fi
if [ ! -d "./build/" ]; then
  mkdir build
fi

rm -rf android_build/out/

cd build

cmake .. \
    -DCMAKE_TOOLCHAIN_FILE=../platforms/android/android.toolchain.cmake \
    -DCMAKE_BUILD=Release \
    -DBUILD_DOCS=OFF \
    -DBUILD_JAVA=OFF \
    -DBUILD_ANDROID_EXAMPLES=OFF \
    -DBUILD_ANDROID_PROJECTS=OFF \
    -DBUILD_SHARED_LIBS=ON \
    -DANDROID_NDK=${ANDROID_NDK} \
    -DANDROID_NATIVE_API_LEVEL=android-19 \
    -DANDROID_SDK_TARGET=19 \
    -DANDROID_ABI="armeabi-v7a with NEON" \
    -DANDROID_TOOLCHAIN=clang \
    -DANDROID_STL=c++_shared \
    -DCV_TRACE=OFF \
    -DWITH_IPP=OFF \
    -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
    -DBUILD_opencv_core=ON \
    -DBUILD_opencv_imgproc=ON \
    -DBUILD_opencv_calib3d=ON \
    -DBUILD_opencv_imgcodecs=ON \
    -DBUILD_opencv_dnn=ON \
    -DBUILD_opencv_flann=ON \
    -DBUILD_opencv_ml=ON \
    -DBUILD_opencv_objdetect=ON \
    -DBUILD_opencv_photo=ON \
    -DBUILD_opencv_stiching=ON \
    -DBUILD_opencv_videoio=ON \
    -DBUILD_opencv_highgui=ON \
    -DCMAKE_INSTALL_PREFIX:PATH=$(pwd)/../android_build/out \
    -DWITH_CUDA=OFF \
    -DWITH_TBB=OFF \
    -DHAVE_OPENCL=ON \
    -DOPENCL_FOUND=ON \
    -DWITH_OPENCL=ON \
    -DHAVE_OPENCL_STATIC=ON \
    -DOPENCL_LIBRARY=$(pwd)/../libopencl-stub/libOpenCL.so \
    -DOPENCL_INCLUDE_DIRS=$(pwd)/../libopencl-stub/include \

cmake -LA
make -j4
make install

После тестирования нескольких вещей я заметил, что другие функции OpenCV, которыеимеет "const String &" в своем параметре дает мне ту же ошибку на ndk-build .(другие функции OpenCV, такие как cvtColor, работают отлично).

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 31 января 2019

Очевидно, что изменение некоторых значений в make-файле решает проблему.

В Application.mk изменен обмен APP_STL := gnustl_shared на c ++ _ и закомментировано NDK_TOOLCHAIN_VERSION.В Android.mk закомментируйте несколько LOCAL_CPPFLAG.

Построил его, и он решил проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...