首页 文章

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

提问于
浏览
14

我的电脑正在运行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

So everything seems to be in order, except when I start running some actual OpenCV functions such as:

#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 tocv :: imread(cv :: String const&,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:在functioncv :: String :: String(char const )':io.cpp :( . text._ZN2cv6StringC2EPKc [_ZN2cv6StringC5EPKc] 0x40):未定义引用cv :: String :: allocate(unsigned long)'CMakeFiles /cv_io.dir/io.cpp.o:在functioncv :: String :: ~String()':io.cpp :( . text._ZN2cv6StringD2Ev [_ZN2cv6StringD5Ev] 0x10):对cv :: String :: deallocate的未定义引用( )'CMakeFiles / cv_io.dir / io.cpp.o:在functioncv :: String :: operator =(cv :: String const&)':io.cpp :( . text.ZN2cv6StringaSERKS0 [ZN2cv6StringaSERKS0] 0x2c):undefined reference to `cv :: String :: deallocate()'collect2:错误:ld返回1退出状态CMakeFiles / cv_io.dir / build.make:121:目标'cv_io'的配方失败make2: [cv_io]错误1 CMakeFiles / Makef ile2:67:目标'CMakeFiles / cv_io.dir / all'的配方make1失败:* [CMakeFiles / cv_io.dir / all]错误2 Makefile:83:目标'all'失败的食谱make:*** [all]错误2

有谁知道如何解决这个问题?我认为问题是我仍然没有在 CMakeLists.txt 中正确链接所有库 . 另外,我发现a comment below this article提到类似于我正在经历的东西,但我不明白the page containing the solution它指的是什么 . I'm very new to OpenCV and CMake, so hopefully you can provide me instructions that are as explicit as possible. I've been stuck on this for forever, so any help is highly appreciated! Thank you very much!

3 回答

  • 1

    我有一个工作 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})
    

    如果您不想将安装OpenCV 3.2的硬编码路径提交到存储库,则可以通过将 find_package 行更改为:来优化此 CMakeList.txt

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

    然后你必须在运行cmake之前定义变量 OPENCV_INSTALL_DIR . 我通过从 .bashrc 导出它来做到这一点

  • 4

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

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

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

  • 1

    实际上,您正在链接系统默认版本的OpenCV .

    通过使用正确的路径调用CMake来重新配置项目OpenCVConfig.cmake .

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

    在您的构建目录中查找文件 CMakeCache.txt . 它包含内部CMake变量,OpenCV路径也在那里 .

    此外,硬编码路径也不正确 . 使用 include_directories(${OPENCV_INCLUDE_DIRS})

    并引用 OpenCVConfig.cmake

    • OpenCV_LIB_DIR:lib文件所在的目录 . 致电LINK_DIRECTORIES
      不需要这条路径 .

相关问题