OpenCV 源码编译 Linux C++ & Clion


目录

1. 开始

1.去官网下载opencv

2.解压下载下来的zip包

3.进入到解压后的文件包中

4.安装依赖库和cmake

6.cmake构建

7.编译

8.编译完成

9.将OpenCV的库添加到路径

10.配置路径生效

11.配置bash

2. 查看

查看opencv版本信息

查看linux下的opencv安装库

3. Clion 测试OpenCV

Example

官方CMakeLists配置opencv


 

 

写在前面:

1. Linux 源码编译OpenCV之前请卸载Anaconda3及其组件。

卸载方法参考https://blog.csdn.net/qq_22474567/article/details/54984257

2. 如果当中安装的一些库不明白是干嘛的,请参考博客

https://blog.csdn.net/hjxu2016/article/details/82390434


1. 开始

1.去官网下载opencv

在本教程中选用的时opencv3.4.7,其他版本如4.0+ 的配置方法异曲同工。 下载链接http://opencv.org/releases.html,选择sources 源码版本

2.解压下载下来的zip包

如果没有unzip命令可以自行百度安装。当然你如果有图形界面,直接右击文件,就会有解压选项。

解压之后包内容如下。

unzip opencv-3.4.0.zip

3.进入到解压后的文件包中

4.安装依赖库和cmake

如果提醒需要apt-get update,那就先sudo su进入root权限(创建超级用户不会请自行百度),再sudo apt-get update,然后在执行下面命令

sudo apt-get install cmake

安装依赖包和工具

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev

5.安装完cmake之后执行命令 ,创建编译文件夹,不创建的会提示(如下图) 
In-source builds are not allowed.

解决方法:在opencv目录下新建build文件夹

mkdir build 
cd build


6.cmake构建

cmake 开始编译前的校验(其实后面-D等等都是可选项,具体想了解是干嘛的,请参考博客:https://blog.csdn.net/u013066730/article/details/79411730

解决办法:     在cmake编译opencv时候加参数编译-DBUILD_TIFF=ON

cmake -D CMAKE_BUILD_TYPE=Release -D BUILD_TIFF=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..

注意:如果已经在新的文件夹中编译,但是还会出现之前的报错,把cmakecache.txt删了再编译就可

期间可能会下载一个东西,等待一会儿就OK 

7.编译

执行命令,漫长的编译过程

make -j4

注:编译报错

/opencv-3.4.7/modules/core/include/opencv2/core/private.hpp:66:12: fatal error: Eigen/Core: 没有那个文件或目录
 #  include <Eigen/Core>
            ^~~~~~~~~~~~

解决办法:

  • eigen库未安装

执行命令:$ sudo apt-get install libeigen3-dev进行安装。

  • eigen库已安装

如果安装好的话会出现eigen库的所有文件,那么我们还需要检查CMakelist文件是否包含了eigen库的头文件,即
include_directories("/usr/include/eigen3")。

如果仍未成功,则需要链接对应的文件,即进行以下命令:

sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen

执行此命令是因为 eigen 库默认安装在了 /usr/include/eigen3/Eigen 路径下,需使用下面命令映射到 /usr/include 路径下。


8.编译完成

执行命令

sudo make install

9.将OpenCV的库添加到路径

sudo make install 执行完毕后OpenCV编译过程就结束了,接下来就需要配置一些OpenCV的编译环境首先将OpenCV的库添加到路径,从而可以让系统找到

sudo gedit /etc/ld.so.conf.d/opencv.conf

执行此命令后打开的可能是一个空白的文件,不用管,只需要在文件末尾添加

/usr/local/lib 

10.配置路径生效

执行如下命令使得刚才的配置路径生效

sudo ldconfig 

这个时候可能会提示错误如下图所示(上部分) 

sbin/ldconfig.real: /usr/lib/nvidia-375/libEGL.so.1 不是符号连接 
/sbin/ldconfig.real: /usr/lib32/nvidia-375/libEGL.so.1 不是符号连接 
出现这个错误可能是由于系统BUG所致

只需要分别输入上面图下部分的四行命令就可解决 

  1. sudo mv /usr/lib/nvidia-375/libEGL.so.1 /usr/lib/nvidia-375/libEGL.so.1.org

  2. sudo mv /usr/lib32/nvidia-375/libEGL.so.1 /usr/lib32/nvidia-375/libEGL.so.1.org

  3. sudo ln -s /usr/lib/nvidia-375/libEGL.so.375.39 /usr/lib/nvidia-375/libEGL.so.1

  4. sudo ln -s /usr/lib32/nvidia-375/libEGL.so.375.39 /usr/lib32/nvidia-375/libEGL.so.1

11.配置bash

sudo gedit /etc/bash.bashrc

在最末尾添加

  1. PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig

  2. export PKG_CONFIG_PATH

保存,执行如下命令使得配置生效

source /etc/bash.bashrc 

更新

sudo updatedb 

2. 查看

查看opencv版本信息

命令如下:

pkg-config --modversion opencv

库文件一般放在:

   /usr/local/lib

查看linux下的opencv安装库

pkg-config opencv --libs

  • L/usr/local/lib -lopencv_dnn
  • -lopencv_highgui
  • -lopencv_ml
  • -lopencv_objdetect
  • -lopencv_shape
  • -lopencv_stitching
  • -lopencv_superres
  • -lopencv_videostab
  • -lopencv_calib3d
  • -lopencv_videoio
  • -lopencv_imgcodecs
  • -lopencv_features2d
  • -lopencv_video
  • -lopencv_photo
  • -lopencv_imgproc
  • -lopencv_flann
  • -lopencv_viz
  • -lopencv_core
     

3. Clion 测试OpenCV

Example

这时如果cd到opencv-3.4.0/smaples/cpp/example_cmake目录下 可以看到这个目录里官方已经给出了一个cmake的example我们可以拿来测试和参考学习。

使用Clion打开这个cmake工程,

测试代码:注意修改图片路径

/**
 * @file Morphology_3(Extract_Lines).cpp
 * @brief Use morphology transformations for extracting horizontal and vertical lines sample code
 * @author OpenCV team
 */

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

void show_wait_destroy(const char* winname, cv::Mat img);

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    //! [load_image]
    CommandLineParser parser(argc, argv, "{@input | /home/haowang/opencv-3.4.7/samples/data/opencv-logo.png | input image}");
    Mat src = imread(parser.get<String>("@input"), IMREAD_COLOR);
    if (src.empty())
    {
        cout << "Could not open or find the image!\n" << endl;
        cout << "Usage: " << argv[0] << " <Input image>" << endl;
        return -1;
    }

    // Show source image
    imshow("src", src);
    //! [load_image]

    //! [gray]
    // Transform source image to gray if it is not already
    Mat gray;

    if (src.channels() == 3)
    {
        cvtColor(src, gray, COLOR_BGR2GRAY);
    }
    else
    {
        gray = src;
    }

    // Show gray image
    show_wait_destroy("gray", gray);
    //! [gray]

    //! [bin]
    // Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol
    Mat bw;
    adaptiveThreshold(~gray, bw, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);

    // Show binary image
    show_wait_destroy("binary", bw);
    //! [bin]

    //! [init]
    // Create the images that will use to extract the horizontal and vertical lines
    Mat horizontal = bw.clone();
    Mat vertical = bw.clone();
    //! [init]

    //! [horiz]
    // Specify size on horizontal axis
    int horizontal_size = horizontal.cols / 30;

    // Create structure element for extracting horizontal lines through morphology operations
    Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontal_size, 1));

    // Apply morphology operations
    erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));
    dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));

    // Show extracted horizontal lines
    show_wait_destroy("horizontal", horizontal);
    //! [horiz]

    //! [vert]
    // Specify size on vertical axis
    int vertical_size = vertical.rows / 30;

    // Create structure element for extracting vertical lines through morphology operations
    Mat verticalStructure = getStructuringElement(MORPH_RECT, Size(1, vertical_size));

    // Apply morphology operations
    erode(vertical, vertical, verticalStructure, Point(-1, -1));
    dilate(vertical, vertical, verticalStructure, Point(-1, -1));

    // Show extracted vertical lines
    show_wait_destroy("vertical", vertical);
    //! [vert]

    //! [smooth]
    // Inverse vertical image
    bitwise_not(vertical, vertical);
    show_wait_destroy("vertical_bit", vertical);

    // Extract edges and smooth image according to the logic
    // 1. extract edges
    // 2. dilate(edges)
    // 3. src.copyTo(smooth)
    // 4. blur smooth img
    // 5. smooth.copyTo(src, edges)

    // Step 1
    Mat edges;
    adaptiveThreshold(vertical, edges, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);
    show_wait_destroy("edges", edges);

    // Step 2
    Mat kernel = Mat::ones(2, 2, CV_8UC1);
    dilate(edges, edges, kernel);
    show_wait_destroy("dilate", edges);

    // Step 3
    Mat smooth;
    vertical.copyTo(smooth);

    // Step 4
    blur(smooth, smooth, Size(2, 2));

    // Step 5
    smooth.copyTo(vertical, edges);

    // Show final result
    show_wait_destroy("smooth - final", vertical);
    //! [smooth]

    return 0;
}

void show_wait_destroy(const char* winname, cv::Mat img) {
    imshow(winname, img);
    moveWindow(winname, 500, 0);
    waitKey(0);
    destroyWindow(winname);
}

 

显示结果:

 

官方CMakeLists配置opencv

ocv_install_example_src(cpp *.cpp *.hpp CMakeLists.txt)

set(OPENCV_CPP_SAMPLES_REQUIRED_DEPS
  opencv_core
  opencv_imgproc
  opencv_flann
  opencv_imgcodecs
  opencv_videoio
  opencv_highgui
  opencv_ml
  opencv_video
  opencv_objdetect
  opencv_photo
  opencv_features2d
  opencv_calib3d
  opencv_stitching
  opencv_videostab
  opencv_shape
  ${OPENCV_MODULES_PUBLIC}
  ${OpenCV_LIB_COMPONENTS})
ocv_check_dependencies(${OPENCV_CPP_SAMPLES_REQUIRED_DEPS})

if(NOT BUILD_EXAMPLES OR NOT OCV_DEPENDENCIES_FOUND)
  return()
endif()

project(cpp_samples)
ocv_include_modules_recurse(${OPENCV_CPP_SAMPLES_REQUIRED_DEPS})
file(GLOB_RECURSE cpp_samples RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
if(NOT HAVE_opencv_cudaarithm OR NOT HAVE_opencv_cudafilters)
  ocv_list_filterout(cpp_samples "/gpu/")
endif()
if(NOT BUILD_opencv_viz OR NOT VTK_USE_FILE)
  ocv_list_filterout(cpp_samples "/viz/")
endif()
ocv_list_filterout(cpp_samples "real_time_pose_estimation/")
foreach(sample_filename ${cpp_samples})
  if(sample_filename MATCHES "/viz/")
    include(${VTK_USE_FILE})
    if(COMMAND ocv_warnings_disable)  # eliminate warnings from VTK headers (include directory is not "SYSTEM")
      ocv_warnings_disable(CMAKE_CXX_FLAGS -Winconsistent-missing-override -Wsuggest-override)
    endif()
  endif()
  set(package "cpp")
  if(sample_filename MATCHES "tutorial_code")
    set(package "tutorial")
  endif()
  ocv_define_sample(tgt ${sample_filename} ${package})
  ocv_target_link_libraries(${tgt} LINK_PRIVATE ${OPENCV_LINKER_LIBS} ${OPENCV_CPP_SAMPLES_REQUIRED_DEPS})
  if(sample_filename MATCHES "/gpu/" AND HAVE_opencv_cudaarithm AND HAVE_opencv_cuda_filters)
    ocv_target_link_libraries(${tgt} LINK_PRIVATE opencv_cudaarithm opencv_cudafilters)
  endif()
  if(sample_filename MATCHES "/viz/")
    ocv_target_link_libraries(${tgt} LINK_PRIVATE ${VTK_LIBRARIES})
    target_compile_definitions(${tgt} PRIVATE -DUSE_VTK)
  endif()
  if(HAVE_OPENGL AND sample_filename MATCHES "detect_mser")
    target_compile_definitions(${tgt} PRIVATE HAVE_OPENGL)
  endif()
  if(sample_filename MATCHES "simd_")
    # disabled intentionally - demonstation purposes only
    #target_include_directories(${tgt} PRIVATE "${CMAKE_CURRENT_LIST_DIR}")
    #target_compile_definitions(${tgt} PRIVATE OPENCV_SIMD_CONFIG_HEADER=opencv_simd_config_custom.hpp)
    #target_compile_definitions(${tgt} PRIVATE OPENCV_SIMD_CONFIG_INCLUDE_DIR=1)
    #target_compile_options(${tgt} PRIVATE -mavx2)
  endif()
endforeach()

include("tutorial_code/calib3d/real_time_pose_estimation/CMakeLists.txt" OPTIONAL)
# cmake needs this line
cmake_minimum_required(VERSION 2.8)

# Define project name
project(opencvTest)

# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)

# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

# Add OpenCV headers location to your include paths
include_directories(${OpenCV_INCLUDE_DIRS})

# Declare the executable target built from your sources
add_executable(main main.cpp)

# Link your application with OpenCV libraries
target_link_libraries(main ${OpenCV_LIBS})

 

 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Techblog of HaoWANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值