目录
写在前面:
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所致
只需要分别输入上面图下部分的四行命令就可解决
-
sudo mv /usr/lib/nvidia-375/libEGL.so.1 /usr/lib/nvidia-375/libEGL.so.1.org
-
sudo mv /usr/lib32/nvidia-375/libEGL.so.1 /usr/lib32/nvidia-375/libEGL.so.1.org
-
sudo ln -s /usr/lib/nvidia-375/libEGL.so.375.39 /usr/lib/nvidia-375/libEGL.so.1
-
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
在最末尾添加
-
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
-
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})