在同一台计算机上运行多个版本的OpenCV

时间:2017-08-10 12:50:09

标签: c++ opencv ubuntu cmake

我的电脑正在运行Ubuntu-16.04-LTS,并且已经安装了OpenCV-2.4.13。但是,我想使用较新版本的OpenCV的功能,例如OpenCV-3.2.0而不删除旧版本。

到目前为止,我已经下载了OpenCV-3.2.0并进行了编译和安装。我正在使用CMake来编译OpenCV,因此我将CMakeLists.txt文件更改为:

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})

现在,当我运行这段代码时,

#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;
}

我得到了

  

OpenCV版本:3.2.0

而不是

  

OpenCV版本2.4.13

所以一切似乎都井然有序,除非我开始运行一些实际的OpenCV函数,例如:

#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);
}

我得到所有这些未定义的引用错误:

  

CMakeFiles / cv_io.dir / io.cpp.o:在函数main': io.cpp:(.text+0x40): undefined reference to cv :: imread(cv :: String)中   const&amp;,int)'io.cpp :(。text + 0xd4):未定义的引用   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 ::字符串::字符串(字符   常量*)“:   。io.cpp :( text._ZN2cv6StringC2EPKc [_ZN2cv6StringC5EPKc] + 0x40的):   对cv::String::allocate(unsigned long)' CMakeFiles/cv_io.dir/io.cpp.o: In function cv :: String :: ~String()'的未定义引用:   io.cpp :(。text._ZN2cv6StringD2Ev [_ZN2cv6StringD5Ev] + 0x10):undefined   对cv::String::deallocate()' CMakeFiles/cv_io.dir/io.cpp.o: In function cv :: String :: operator =(cv :: String const&amp;)'的引用:   。io.cpp :(文本 ZN2cv6StringaSERKS0 [ ZN2cv6StringaSERKS0 ] + 0x2c上):   未定义引用`cv :: String :: deallocate()'collect2:error:ld   返回1退出状态CMakeFiles / cv_io.dir / build.make:121:食谱   目标'cv_io'失败make 2 * [cv_io]错误1   CMakeFiles / Makefile2:67:目标'CMakeFiles / cv_io.dir / all'的配方   失败make 1:* [CMakeFiles / cv_io.dir / all]错误2 Makefile:83:   目标'all'失败的食谱make:*** [all]错误2

有谁知道如何解决这个问题?我认为问题是我仍未在CMakeLists.txt中正确链接所有库。另外,我发现a comment below this article提到了类似于我所遇到的内容,但我不明白the page containing the solution它指的是什么。 我是OpenCV和CMake的新手,所以希望你能尽可能明确地向我提供指示。我一直坚持这个,所以任何帮助都非常感谢!非常感谢你!

2 个答案:

答案 0 :(得分:7)

我有一个工作CMakelist.txt几乎与你描述的配置相同,只是我正在运行一个令人生畏的旧Ubuntu 12.04(它不是我自己的电脑)。

我相信你的问题来自这条线:

find_package(OpenCV REQUIRED)

这使您可以访问您的发行版的OpenCV 2.4。然后,您将链接到手动安装的3.2.x版本。因此,只要您使用的函数的接口在两个版本之间发生更改,就会出现问题。我认为你的第一段代码是偶然的。

这是我的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})

如果您不想通过将CMakeList.txt行更改为:

find_package

然后你必须在运行cmake之前定义变量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}) 。我是通过从OPENCV_INSTALL_DIR

导出它来实现的

答案 1 :(得分:1)

在设置包含文件以使用新安装的OpenCV标头时,您将链接到系统路径上的opencv。该版本只是存储在标题中,这就是它输出预期版本但无法链接的原因。在运行查找模块之前,尝试将变量“OpenCV_DIR”设置为要使用的OpenCVConfig.cmake文件的位置。

请参阅您的cmake here版本的文档。注意find_package可以在(模块或配置模式)中运行的两种模式。

除非您链接到静态库,否则运行库/应用程序时仍会遇到问题。要解决这个问题,您需要将库添加到LD_LIBRARY_PATH。