2017-08-10 2 views
12

Mein Computer läuft Ubuntu-16.04-LTS und OpenCV-2.4.13 ist bereits auf dem Computer installiert. Allerdings würde ich gerne die Funktionalitäten neuer OpenCV-Versionen wie OpenCV-3.2.0 nutzen, ohne die ältere Version zu entfernen.Ausführen mehrerer Versionen von OpenCV auf demselben Computer

Bisher habe ich OpenCV-3.2.0 heruntergeladen und kompiliert und installiert. Ich bin uing CMake OpenCV zu kompilieren, also habe ich meine CMakeLists.txt-Datei:

cmake_minimum_required (VERSION 3.2) 

project(io) 

find_package(OpenCV REQUIRED) 

include_directories("/home/ubuntu/opencv-3.2.0/include") # directory of OpenCV-3.2.0 
link_directories("/home/ubuntu/opencv-3.2.0/lib") # directory of OpenCV-3.2.0 

add_executable(cv_io io.cpp) 

target_link_libraries(cv_io ${OpenCV_LIBS}) 

Nun, wenn ich dieses kleine Stück Code ausführen,

#include <iostream> 
#include "opencv2/core/version.hpp" 

int main(int argc, char ** argv) 
{ 
    std::cout << "OpenCV version: " 
      << CV_MAJOR_VERSION << "." 
      << CV_MINOR_VERSION << "." 
      << CV_SUBMINOR_VERSION 
      << std::endl; 
    return 0; 
} 

ich

OpenCV version: 3.2.0

statt

OpenCV version 2.4.13

So scheint alles in Ordnung zu sein, außer wenn ich beginnen, einige tatsächliche OpenCV Funktionen wie Laufen:

#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/opencv.hpp> 

int main() 
{ 
    cv::Mat img = cv::imread("ferrari.jpg"); 

    cv::Mat dst; 
    cv::Sobel(img, dst, CV_32F, 1, 1); 

    cv::imwrite("ferrari_sobel.png", dst); 

    cv::VideoCapture input(0); 
} 

ich alle diese undefinierten Referenzfehler:

CMakeFiles/cv_io.dir/io.cpp.o: In function main': io.cpp:(.text+0x40): undefined reference to cv::imread(cv::String const&, int)' io.cpp:(.text+0xd4): undefined reference to cv::imwrite(cv::String const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)' CMakeFiles/cv_io.dir/io.cpp.o: In function cv::String::String(char const*)': io.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x40): undefined reference to cv::String::allocate(unsigned long)' CMakeFiles/cv_io.dir/io.cpp.o: In function cv::String::~String()': io.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x10): undefined reference to cv::String::deallocate()' CMakeFiles/cv_io.dir/io.cpp.o: In function cv::String::operator=(cv::String const&)': io.cpp:(.text.ZN2cv6StringaSERKS0[ZN2cv6StringaSERKS0]+0x2c): undefined reference to `cv::String::deallocate()' collect2: error: ld returned 1 exit status CMakeFiles/cv_io.dir/build.make:121: recipe for target 'cv_io' failed make 2 : * [cv_io] Error 1 CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/cv_io.dir/all' failed make 1 : * [CMakeFiles/cv_io.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2

Wer weiß, wie zu lösen dieses Problem? Ich denke, das Problem ist, dass ich immer noch nicht alle Bibliotheken richtig in der CMakeLists.txt verknüpfen. Ich fand auch a comment below this article Erwähnung etwas ähnliches zu dem, was ich erfahre, aber ich verstehe nicht the page containing the solution es bezieht sich auf. Ich bin sehr neu zu OpenCV und CMake, also hoffentlich können Sie mir Anweisungen geben, die so explizit wie möglich sind. Ich bin seit Ewigkeiten dabei, also wird jede Hilfe sehr geschätzt! Vielen Dank!

+0

Der Schmerz der Konfiguration von zwei OpenCV-Versionen. Ich kann das gut nachfühlen. – Yotam

+0

Wenn Sie interessiert sind, können Sie zwei Versionen auf Docker-Containern ausführen. Es wäre viel einfacher, mehrere Versionen zu konfigurieren, ohne systemweite Pakete zu beeinflussen – Srinivas

+1

@Srinivas Während das funktionieren sollte, scheint das ein wenig übertrieben und schwer. –

Antwort

3

Ich habe eine funktionierende CMakelist.txt für fast die gleiche Konfiguration wie Sie beschreiben, außer dass ich eine entmutigende alte Ubuntu 12.04 (es ist nicht mein eigener Computer).

Ich glaube, Ihr Problem aus dieser Linie kommt:

find_package(OpenCV REQUIRED) 

Welche Sie OpenCV des 2.4 Zugriff auf Ihre Verteilung gibt. Dann verlinken Sie gegen die manuell installierte Version 3.2.x. Es treten also Probleme auf, sobald sich die Schnittstelle einer von Ihnen verwendeten Funktion zwischen den beiden Versionen geändert hat. Dein erstes Stück Code läuft zufällig, denke ich. Hier

ist mein CMakeList.txt:

cmake_minimum_required(VERSION 2.8) 
project(demo) 

find_package(OpenCV 3.2 REQUIRED PATHS "/path/to/OCV3.2/install/dir/") 

include_directories(${OpenCV_INCLUDE_DIRS}) 
add_executable(main main.cpp) 
target_link_libraries(main ${OpenCV_LIBS}) 

Wenn Sie nicht die fest codierten Pfad zu Ihrem Repository begehen wollen, um Ihre installieren von OpenCV 3.2 können Sie dies verfeinern CMakeList.txt durch Änderung der find_package Linie:

if(DEFINED ENV{OPENCV_INSTALL_DIR}) 
    find_package(OpenCV 3.2 REQUIRED PATHS $ENV{OPENCV_INSTALL_DIR}) 
else() 
    message("OPENCV_INSTALL_DIR not set, searching in default location(s)") 
    find_package(OpenCV 3.2 REQUIRED) 
endif(DEFINED ENV{OPENCV_INSTALL_DIR}) 

Dann müssen Sie nur die Variable OPENCV_INSTALL_DIR definieren, bevor CMake ausgeführt wird. Ich mache das, indem ich es aus meiner .bashrc

+0

Es hat funktioniert !! Vielen Dank! –

1

In der Tat, Sie verknüpfen gegen System-Standard-Version von OpenCV.

Konfigurieren Sie Ihr Projekt neu, indem Sie CMake mit dem richtigen Pfad zur Datei OpenCVConfig.cmake aufrufen.

cmake /path/to/your/sources -DOpenCV_DIR=/home/ubuntu/opencv-3.2.0

Suche Datei CMakeCache.txt in Ihrem Build-Verzeichnis. Es enthält interne CMake-Variablen, OpenCV-Pfade sind ebenfalls vorhanden.

Es ist auch falsch, Pfade zu hardcodieren. Verwenden Sie include_directories(${OPENCV_INCLUDE_DIRS})

Und Zitat aus OpenCVConfig.cmake

- OpenCV_LIB_DIR     : The directory(es) where lib files are. Calling LINK_DIRECTORIES 
            with this path is NOT needed. 
+0

Er hat keine Laufzeitfehler, dies ist während der Verknüpfung. Der CMake-Befehl, den er verwendet, sagt ihm, dass er mit der falschen Version der Bibliotheken verlinken soll. – jhauris

+0

@jhauris, ja, du hast recht, danke, dass du das gezeigt hast. – wl2776

+0

@ wl2776 Ich lief gerade 'cmake .. -DOpenCV_DIR =/home/ubuntu/opencv-3.2.0' dann 'make' aber die undefinierten Referenzfehler sind immer noch da. Außerdem habe ich ursprünglich 'include_directories ($ {OPENCV_INCLUDE_DIRS})' 'verwendet, aber wenn ich den Druckversionscode ausführte, würde es' OpenCV Version: 2.4.13' ausgeben, deshalb bin ich zu dem gewechselt, was ich gerade benutze. –

1

Während Sie die Include-Dateien einrichten, die neu installierten OpenCV-Header zu verwenden, verknüpfen Sie gegen die opencv auf Ihrem Systempfad. Die Version wird nur in den Headern gespeichert, weshalb sie die erwartete Version ausgibt, aber keine Verbindung herstellt. Versuchen Sie, die Variable "OpenCV_DIR" auf den Speicherort der OpenCVConfig.cmake-Datei zu setzen, die Sie verwenden möchten, bevor Sie das Suchmodul ausführen.

Siehe die Dokumentation für Ihre Version von cmake here. Beachten Sie die beiden Modi, in denen find_package ausgeführt werden kann (Modul- oder Konfigurationsmodus).

Wenn Sie nicht mit statischen Bibliotheken verknüpfen, haben Sie weiterhin Probleme beim Ausführen Ihrer Bibliothek/Anwendung. Um das zu beheben, müssen Sie die Bibliotheken zu Ihrem LD_LIBRARY_PATH hinzufügen.

Verwandte Themen