내 우분투 16.04 시스템에 두 가지 버전의 openCV가 설치되어 있습니다. 하나는 openCV3이고 다른 하나는 openCV2.4이며 둘 다 필요합니다. 하지만 이제 openCV3용 C++ 코드를 컴파일할 수 없습니다. 내 코드를 컴파일하려고 할 때 수많은 링커 오류가 발생합니다. openvc2.4를 설치하기 전에는 항상 잘 컴파일되었습니다.
내가 받는 오류 유형은 다음과 같습니다.
In file included from main.cpp:10:0:
/usr/local/include/opencv2/imgproc.hpp:4090:5: note: previous declaration ‘cv::ColormapTypes COLORMAP_PINK’
COLORMAP_PINK = 10, //!< ![pink](pics/colormaps/colorscale_pink.jpg)
^
In file included from /usr/local/include/opencv2/opencv.hpp:59:0,
from include/faceDetection.h:6,
from main.cpp:11:
/usr/local/include/opencv2/contrib/contrib.hpp:980:24: error: redeclaration of ‘COLORMAP_HOT’
COLORMAP_HOT = 11
^
In file included from main.cpp:10:0:
/usr/local/include/opencv2/imgproc.hpp:4091:5: note: previous declaration ‘cv::ColormapTypes COLORMAP_HOT’
COLORMAP_HOT = 11, //!< ![hot](pics/colormaps/colorscale_hot.jpg)
^
main.cpp: In function ‘int main(int, char**)’:
main.cpp:89:65: error: call of overloaded ‘createFisherFaceRecognizer()’ is ambiguous
Ptr<BasicFaceRecognizer> model = createFisherFaceRecognizer();
^
In file included from /usr/local/include/opencv2/face.hpp:373:0,
from main.cpp:8:
/usr/local/include/opencv2/face/facerec.hpp:99:39: note: candidate: cv::Ptr<cv::face::BasicFaceRecognizer> cv::face::createFisherFaceRecognizer(int, double)
CV_EXPORTS_W Ptr<BasicFaceRecognizer> createFisherFaceRecognizer(int num_components = 0, double threshold = DBL_MAX);
^
In file included from /usr/local/include/opencv2/opencv.hpp:59:0,
from include/faceDetection.h:6,
from main.cpp:11:
/usr/local/include/opencv2/contrib/contrib.hpp:963:38: note: candidate: cv::Ptr<cv::FaceRecognizer> cv::createFisherFaceRecognizer(int, double)
CV_EXPORTS_W Ptr<FaceRecognizer> createFisherFaceRecognizer(int num_components = 0, double threshold = DBL_MAX);
^
main.cpp:93:48: error: no matching function for call to ‘cv::face::BasicFaceRecognizer::train(std::vector<cv::Mat>&, std::vector<int>&)’
model->train(trainImages, labelsTrainImages);
^
In file included from main.cpp:8:0:
/usr/local/include/opencv2/face.hpp:207:26: note: candidate: virtual void cv::face::FaceRecognizer::train(int, int)
CV_WRAP virtual void train(InputArrayOfArrays src, InputArray labels) = 0;
^
/usr/local/include/opencv2/face.hpp:207:26: note: no known conversion for argument 1 from ‘std::vector<cv::Mat>’ to ‘int’
main.cpp:123:64: error: no matching function for call to ‘cv::face::BasicFaceRecognizer::predict(cv::Mat&, int&, double&)’
model->predict(face, predictedLabel, confidence);
^
In file included from main.cpp:8:0:
/usr/local/include/opencv2/face.hpp:259:35: note: candidate: int cv::face::FaceRecognizer::predict(int) const
CV_WRAP_AS(predict_label) int predict(InputArray src) const;
내 컴파일된 명령:
g++ src/faceDetection.cpp src/faceRecognition.cpp main.cpp -L/usr/local/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dpm -lopencv_fuzzy -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_face -lopencv_plot -lopencv_dnn -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core -o main
/usr/local/include는 다음과 같습니다.
$ ls /usr/local/include/
folly opencv opencv2 wangle
$ls /usr/local/include/opencv
cvaux.h cvaux.hpp cv.h cv.hpp cvwimage.h cxcore.h cxcore.hpp cxeigen.hpp cxmisc.h highgui.h ml.h
$ ls /usr/local/include/opencv2
aruco contrib dpm.hpp fuzzy.hpp imgproc.hpp ocl plot.hpp stereo.hpp text videostab
aruco.hpp core face gpu legacy opencv.hpp reg stitching text.hpp videostab.hpp
bgsegm.hpp core.hpp face.hpp hdf line_descriptor opencv_modules.hpp rgbd stitching.hpp tracking xfeatures2d
bioinspired cvconfig.h features2d hdf.hpp line_descriptor.hpp optflow rgbd.hpp structured_light tracking.hpp xfeatures2d.hpp
bioinspired.hpp cvv features2d.hpp highgui ml optflow.hpp saliency structured_light.hpp ts ximgproc
calib3d cvv.hpp flann highgui.hpp ml.hpp phase_unwrapping saliency.hpp superres video ximgproc.hpp
calib3d.hpp datasets flann.hpp imgcodecs nonfree phase_unwrapping.hpp shape superres.hpp video.hpp xobjdetect.hpp
ccalib dnn freetype.hpp imgcodecs.hpp objdetect photo shape.hpp surface_matching videoio xphoto
ccalib.hpp dnn.hpp fuzzy imgproc objdetect.hpp photo.hpp stereo surface_matching.hpp videoio.hpp xphoto.hpp
/usr/lib/x86_64-linux-gnu의 내용:http://paste.ubuntu.com/25261998/.
답변1
OpenCV3는 헤더를 opencv
버전 3 콘텐츠용 폴더와 opencv2
이전 버전과 호환되는 콘텐츠용 폴더에 설치합니다. OpenCV3 이후에 OpenCV2.4를 빌드하고 설치하면 실제로 헤더를 덮어쓰게 될 수 있습니다. 라이브러리 자체에는 버전이 있지만 헤더에는 없습니다.
두 버전을 모두 설치하는 것이 적합한지 잘 모르겠지만 이유가 있는 경우 혼동을 피하기 위해 두 버전을 모두 제거하고 기본 위치에 OpenCV3을 다시 설치한 다음 OpenCV2에 대해 다른 경로 접두사(예: /opt/opencv2
.
그런 다음 OpenCV2에 대해 무언가를 빌드할 때 /opt/opencv2/include
포함 경로와 설정 LD_LIBRARY_PATH=/opt/opencv2/lib
(빌드 및 실행을 위한)을 제공합니다.
이를 사용하여 cmake
프로젝트를 빌드하는 경우 스크립트를 조정(또는 생성)해야 합니다 FindOpencv.cmake
.
답변2
젠투에서는 슬롯을 지원합니다... 이는 동일한 시스템에 서로 다른 버전의 패키지가 공존할 수 있음을 의미합니다.
이는 패키지 관리자(포티지)가 패키지의 공통 이름과 다양한 버전 이름을 사용하여 심볼릭 링크를 생성하기 때문에 가능합니다.
예를 들어, Python 2와 3이 있는 경우... python
특정 버전(2 또는 3)을 가리키는 심볼릭 링크라는 하나만 있고 심볼릭 링크가 가리키는 버전을 처리하는 스크립트가 있습니다.
헤더에 대해 동일한 작업을 수행하고 하나를 만들고 opencv.h
두 개의 서로 다른 헤더 파일을 가질 수 있을 것 같습니다. 그런 다음 원본 파일을 .h 파일 중 하나에 연결할 수 있습니다.
직접 만들고 싶지 않고 이미 가지고 있는 것과 동일한 논리를 만들고 싶다면 gentoo를 시도해 볼 수 있습니다.
답변3
공유 라이브러리 폴더에는 so 파일의 두 버전이 모두 설치됩니다. -l을 지정하면 gcc
기본값은 더 높은 SONAME으로 설정됩니다. 귀하의 경우에는 2.4인 것 같습니다. 아마도이것Stack Overflow에 대한 답변이 도움이 될 수 있습니다(두 번째 답변이 최고의 IMHO입니다).