zoukankan      html  css  js  c++  java
  • linux环境下编译安装opencv

    获取opencv源码
    git clone git@github.com:opencv/opencv.git
    获取opencv_contrib源码
    git clone git@github.com:opencv/opencv_contrib.git
    列举所有tag
    git tag -l

    这里以安装3.4.7为例
    git checkout tags/3.4.7

    opencv_contrib同样使用此方法检出对应的版本源码,注意版本号严格一致,否则会出现问题

    为了避免污染文件,首先创建一个用于存放编译产生文件的目录
    mkdir build
    cd build

    在该目录下运行cmake
    cmake -DCMAKE_BUILD_TYPE=Release -DOPENCV_GENERATE_PKGCONFIG=ON -DCMAKE_INSTALL_PREFIX=/usr/local/opencv347 -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ ..

    • -DOPENCV_GENERATE_PKGCONFIG=ON opencv4默认不生产pc文件,需要开启此项
    • -DCMAKE_INSTALL_PREFIX=/usr/local/opencv347 opencv的安装路径,可以省略,将安装到默认/usr/local目录
    • -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ 将 opencv 和 opencv_contrib 一起编译,如果不需要 opencv_contrib 可以将此项去掉

    然后是一段等待

    成功后执行如下命令开始编译,这里开启了8个线程
    make -j8

    可能会出现如下错误

    [  8%] Building CXX object 3rdparty/protobuf/CMakeFiles/libprotobuf.dir/src/google/protobuf/util/type_resolver_util.cc.o
    [  8%] Building CXX object 3rdparty/protobuf/CMakeFiles/libprotobuf.dir/src/google/protobuf/wire_format.cc.o
    [  8%] Building CXX object 3rdparty/protobuf/CMakeFiles/libprotobuf.dir/src/google/protobuf/wrappers.pb.cc.o
    [  8%] Linking CXX static library ../lib/liblibprotobuf.a
    make[2]: 离开目录“/home/explorer/workbench/opensource/opencv/opencv/build”
    [  8%] Built target libprotobuf
    make[1]: 离开目录“/home/explorer/workbench/opensource/opencv/opencv/build”
    make: *** [Makefile:163:all] 错误 2
    

    以及gcc fatal error

    [  1%] Building C object 3rdparty/ippiw/CMakeFiles/ippiw.dir/src/iw_image.c.o
    In file included from /home/explorer/workbench/opensource/opencv/opencv/modules/core/src/precomp.hpp:55,
                     from /home/explorer/workbench/opensource/opencv/opencv/build/modules/core/opencv_core_pch_dephelp.cxx:1:
    /home/explorer/workbench/opensource/opencv/opencv/modules/core/include/opencv2/core/private.hpp:66:12: 致命错误:Eigen/Core:没有那个文件或目录
       66 | #  include <Eigen/Core>
          |            ^~~~~~~~~~~~
    编译中断。
    make[2]: *** [modules/core/CMakeFiles/opencv_core_pch_dephelp.dir/build.make:63:modules/core/CMakeFiles/opencv_core_pch_dephelp.dir/opencv_core_pch_dephelp.cxx.o] 错误 1
    make[2]: 离开目录“/home/explorer/workbench/opensource/opencv/opencv/build”
    make[1]: *** [CMakeFiles/Makefile2:3978:modules/core/CMakeFiles/opencv_core_pch_dephelp.dir/all] 错误 2
    make[1]: *** 正在等待未完成的任务....
    [  1%] Building C object 3rdparty/ippiw/CMakeFiles/ippiw.dir/src/iw_image_color_convert_all.c.o
    cc1: 警告:‘-Werror=’ argument ‘-Werror=non-virtual-dtor’ is not valid for C
    cc1: 警告:‘-Werror=’ argument ‘-Werror=non-virtual-dtor’ is not valid for C
    In file included from /home/explorer/workbench/opensource/opencv/opencv/modules/core/test/test_precomp.hpp:12,
                     from /home/explorer/workbench/opensource/opencv/opencv/build/modules/core/opencv_test_core_pch_dephelp.cxx:1:
    /home/explorer/workbench/opensource/opencv/opencv/modules/core/include/opencv2/core/private.hpp:66:12: 致命错误:Eigen/Core:没有那个文件或目录
       66 | #  include <Eigen/Core>
          |            ^~~~~~~~~~~~
    编译中断。
    make[2]: *** [modules/core/CMakeFiles/opencv_test_core_pch_dephelp.dir/build.make:63:modules/core/CMakeFiles/opencv_test_core_pch_dephelp.dir/opencv_test_core_pch_dephelp.cxx.o] 错误 1
    make[2]: 离开目录“/home/explorer/workbench/opensource/opencv/opencv/build”
    make[1]: *** [CMakeFiles/Makefile2:3868:modules/core/CMakeFiles/opencv_test_core_pch_dephelp.dir/all] 错误 2
    [  1%] Building C object 3rdparty/ippiw/CMakeFiles/ippiw.dir/src/iw_image_color_convert_rgbs.c.o
    cc1: 警告:‘-Werror=’ argument ‘-Werror=non-virtual-dtor’ is not valid for C
    In file included from /home/explorer/workbench/opensource/opencv/opencv/modules/ts/src/precomp.hpp:4,
                     from /home/explorer/workbench/opensource/opencv/opencv/build/modules/ts/opencv_ts_pch_dephelp.cxx:1:
    /home/explorer/workbench/opensource/opencv/opencv/modules/core/include/opencv2/core/private.hpp:66:12: 致命错误:Eigen/Core:没有那个文件或目录
       66 | #  include <Eigen/Core>
          |            ^~~~~~~~~~~~
    编译中断。
    

    解决办法
    sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen

    https://github.com/opencv/opencv/issues/14868

    编译到50%左右可能会遇到

    libopencv_core.so.3.4.7: undefined reference to `cblas_dgemm'
    

    https://github.com/opencv/opencv/issues/14323

    cmake -D CMAKE_EXE_LINKER_FLAGS=-lcblas -D WITH_TBB=ON -D WITH_OPENMP=ON -D WITH_IPP=ON -D WITH_CUDA=OFF -D ENABLE_CXX11=1 -D BUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DOPENCV_GENERATE_PKGCONFIG=ON -DCMAKE_INSTALL_PREFIX=/usr/local/opencv347 -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ ..

    然后执行
    sudo make install

    配置

    cd /etc/ld.so.conf.d/
    sudo touch opencv347.conf
    # 根据安装位置
    sudo sh -c 'echo "/usr/local/opencv347/lib" > opencv347.conf' 
    sudo ldconfig
    

    复制pc文件
    sudo cp -f /usr/local/opencv347/lib/pkgconfig/opencv.pc /usr/lib/pkgconfig/opencv347.pc

    测试一下
    pkg-config --modversion opencv347

    测试程序

    cpp

    #include <opencv2/core.hpp>
    #include <iostream>
    
    using namespace std;
    using namespace cv;
    
    int main(int argc, char **argv) {
        cout << "OpenCV version : " << CV_VERSION << endl;
        cout << "Major version : " << CV_MAJOR_VERSION << endl;
        cout << "Minor version : " << CV_MINOR_VERSION << endl;
        cout << "Subminor version : " << CV_SUBMINOR_VERSION << endl;
        return 0;
    }
    

    cmake

    cmake_minimum_required(VERSION 3.14)
    project(opencvhelloworld)
    
    set(CMAKE_CXX_STANDARD 14)
    
    find_package( OpenCV 3.4.7 REQUIRED )
    add_executable(opencvhelloworld main.cpp)
    target_link_libraries( opencvhelloworld ${OpenCV_LIBS} )
    

    运行后可以看到opencv版本号

    cmakelist文件修改find_package( OpenCV 3.4.7 REQUIRED )可以引入其他版本

    cmake

    cmake_minimum_required(VERSION 3.14)
    project(opencvhelloworld)
    
    set(CMAKE_CXX_STANDARD 14)
    
    find_package( OpenCV 4 REQUIRED )
    add_executable(opencvhelloworld main.cpp)
    target_link_libraries( opencvhelloworld ${OpenCV_LIBS} )
    

    这个是通过pacman安装的4.1.1,同样可以使用此方法引入

    参考文献

    -- found Intel IPP (ICV version): 2019.0.0 [2019.0.0 Gold]
    -- at: /home/explorer/workbench/opensource/opencvfromgit/opencv/build/3rdparty/ippicv/ippicv_lnx/icv
    -- found Intel IPP Integration Wrappers sources: 2019.0.0
    -- at: /home/explorer/workbench/opensource/opencvfromgit/opencv/build/3rdparty/ippicv/ippicv_lnx/iw
    -- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
    -- Could NOT find Atlas (missing: Atlas_BLAS_LIBRARY) 
    -- Looking for sgemm_
    -- Looking for sgemm_ - not found
    -- Looking for pthread.h
    -- Looking for pthread.h - found
    -- Performing Test CMAKE_HAVE_LIBC_PTHREAD
    -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
    -- Found Threads: TRUE  
    -- Looking for sgemm_
    -- Looking for sgemm_ - found
    -- Found BLAS: /lib64/libblas.so  
    -- Looking for cheev_
    -- Looking for cheev_ - not found
    -- Looking for cheev_
    -- Looking for cheev_ - found
    -- A library with LAPACK API found.
    -- LAPACK(LAPACK/Generic): LAPACK_LIBRARIES: /lib64/liblapack.so;/lib64/libblas.so
    -- LAPACK(LAPACK/Generic): Support is enabled.
    
    Scanning dependencies of target opencv_phase_unwrapping
    Scanning dependencies of target opencv_imgcodecs
    /usr/bin/ld: ../../lib/libopencv_core.so.3.4.7: undefined reference to `cblas_zgemm'
    /usr/bin/ld: ../../lib/libopencv_core.so.3.4.7: undefined reference to `cblas_sgemm'
    /usr/bin/ld: ../../lib/libopencv_core.so.3.4.7: undefined reference to `cblas_dgemm'
    /usr/bin/ld: ../../lib/libopencv_core.so.3.4.7: undefined reference to `cblas_cgemm'
    collect2: 错误:ld 返回 1
    make[2]: *** [apps/version/CMakeFiles/opencv_version.dir/build.make:87:bin/opencv_version] 错误 1
    make[2]: 离开目录“/home/explorer/workbench/opensource/opencvfromgit/opencv/build”
    make[1]: *** [CMakeFiles/Makefile2:20743:apps/version/CMakeFiles/opencv_version.dir/all] 错误 2
    make[1]: *** 正在等待未完成的任务....
    make[2]: 离开目录“/home/explorer/workbench/opensource/opencvfromgit/opencv/build”
    make[2]: 进入目录“/home/explorer/workbench/opensource/opencvfromgit/opencv/build”
    [ 29%] Building CXX object modules/phase_unwrapping/CMakeFiles/opencv_phase_unwrapping.dir/src/histogramphaseunwrapping.cpp.o
    make[2]: 离开目录“/home/explorer/workbench/opensource/opencvfromgit/opencv/build”
    make[2]: 进入目录“/home/explorer/workbench/opensource/opencvfromgit/opencv/build”
    [ 29%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/loadsave.cpp.o
    [ 29%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/utils.cpp.o
    [ 29%] Building CXX object modules/imgcodecs/CMakeFiles/opencv_imgcodecs.dir/src/grfmt_base.cpp.o
    
  • 相关阅读:
    js + html 实现视频截图
    检测浏览器版本是否支持webp
    【安装系统】win8装win7遇到的一些坑
    《说文解字》与程序设计
    朝花夕拾——更新两个开源项目
    js发送和接收二进制字节流数据
    字符编码--丛起原到代码
    JavaScript进行WebSocket字节流通讯示例
    JavaScript进行UTF-8编码与解码
    JS字符串与二进制的相互转化
  • 原文地址:https://www.cnblogs.com/zbqhc/p/11550307.html
Copyright © 2011-2022 走看看