opencv在 Cmakelist的写法以及编译详解

目录

1. 预备知识

2.实战测试,官网下载opencv编译不安装

2.1. 准备工作

2.2. 官方安装教程

2.3.官方测试用例

2.3.1 Create a program using OpenCV

2.3.2 Create a CMake file

2.3.3Generate the executable

2.3.4Result

3.交叉编译opencv并使用

3.1第一步同样获取opencv

3.2安装gui

3.3配置

3.4生成opencv

3.5 在cmakelist中配置使用

4.结束

5.安装?

6.BUG速查

6.1cmake时提示一些模块因为冲突而未安装

  1. 预备知识

如果是安装了的opencv,可以直接用findpackage

find_package(OpenCV REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS})
target_link_libraries(dataprocess ${OpenCV_LIBS})

有时候不能安装,例如需要交叉编译一些项目时,opencv需要编译为其他版本(例如aarch64)不会安装在系统变量下。那么就不能直接用这个,因为find_package是在系统变量下寻找,安装opencv的操作实际就是把文件复制到/usr/local下面。在不安装的情况下,需要手动设置opencv的寻找路径

set(OpenCV_DIR /home/white/CLionProjects/RKNN/examples/3rdparty/opencv/opencv-linux-aarch64/share/OpenCV)
find_package(OpenCV REQUIRED)
include_directories( ${OpenCV_INCLUDE_DIRS})
target_link_libraries(dataprocess ${OpenCV_LIBS})

使用set设置后,相当于告诉cmake,在OpenCV_DIR下寻找满足规则的包,

此OpenCV_DIR下应该至少包括OpenCVConfig.cmake,OpenCVConfig-version.cmake,OpenCVModules.cmake,OpenCVModules-relase.cmake这四个文件,但是不一定只有这四个,如下图的三方OpenCV

opencv在 Cmakelist的写法以及编译详解

opencv在 Cmakelist的写法以及编译详解

官方的Opencv

cmake findpackage会根据这四个cmake文件寻找Opencv的所有变量,例如include lib

具体内容可以查看OpenCVConfig.cmake文件

opencv在 Cmakelist的写法以及编译详解

Config.cmake设置了一堆变量用于findpackage

2.实战测试,官网下载opencv编译不安装

2.1. 准备工作

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

2.2. 官方安装教程

Install minimal prerequisites (Ubuntu 18.04 as reference)
sudo apt update && sudo apt install -y cmake g++ wget unzip
Download and unpack sources
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.x.zip
unzip opencv.zip
unzip opencv_contrib.zip
Create build directory and switch into it
mkdir -p build && cd build
Configure
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.x/modules ../opencv-4.x
Build
cmake --build .
#这里会安装opencv,我们不执行这个install ,下面的指令用make代替
sudo make install

2.3.官方测试用例

2.3.1 Create a program using OpenCV

Let’s use a simple program such as DisplayImage.cpp shown below.

​
#include

#include

using namespace cv;

int main(int argc, char** argv )

{

if ( argc != 2 )

{

printf("usage: DisplayImage.out \n");

return -1;

}

Mat image;

image = imread( argv[1], 1 );

if ( !image.data )

{

printf("No image data \n");

return -1;

}

namedWindow("Display Image", WINDOW_AUTOSIZE );

imshow("Display Image", image);

waitKey(0);

return 0;

}

​

2.3.2 Create a CMake file

Now you have to create your CMakeLists.txt file. It should look like this:

cmake_minimum_required(VERSION 2.8)

project( DisplayImage )

find_package( OpenCV REQUIRED )

include_directories( ${OpenCV_INCLUDE_DIRS} )

add_executable( DisplayImage DisplayImage.cpp )

target_link_libraries( DisplayImage ${OpenCV_LIBS} )

2.3.3Generate the executable

This part is easy, just proceed as with any other project using CMake:

cd

cmake .

make

2.3.4Result

By now you should have an executable (called DisplayImage in this case). You just have to run it giving an image location as an argument, i.e.:

./DisplayImage lena.jpg

You should get a nice window as the one shown below:

opencv在 Cmakelist的写法以及编译详解

这里,我们修改一下步骤,在build的时候,不执行sudo make install,直接在build下make.同时,在cmakelist.txt中

find_package前,加一步

set(OpenCV_DIR xxx)

记得前面说过,xxx是四个cmake文件所在路径,因此,我们查看我们的build文件夹,找到OpenCVConfig.cmake文件,发现在build的根目录下

opencv在 Cmakelist的写法以及编译详解

因此,我们设置xxx为~/home/opencv/build即可

3.交叉编译opencv并使用

经由同事介绍cmake的gui版本,发现gui确实好用且简单,交叉编译的时候用gui试试

apt install -y crossbuild-essential-arm64

3.1第一步同样获取opencv

Install minimal prerequisites (Ubuntu 18.04 as reference)
sudo apt update && sudo apt install -y cmake g++ wget unzip
Download and unpack sources
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.x.zip
unzip opencv.zip
unzip opencv_contrib.zip
Create build_aarch64 directory and switch into it
mkdir -p build_aarch64 && cd build_aarch64

3.2安装gui

sudo apt-get install cmake cmake-qt-gui

3.3配置

cmake-gui

设置source build

opencv在 Cmakelist的写法以及编译详解

添加变量

Add Entry

NAME=CMAKE_AR;

Type=FILEPATH;

Value= /usr/local/arm/ext-toolchain/bin/aarch64-linux-gnu-ar

opencv在 Cmakelist的写法以及编译详解

这个ar是交叉编译时候需要的一个工具,一般在/usr/bin下,如果不知道在哪里,可以使用which指令

opencv在 Cmakelist的写法以及编译详解

点击configure,选择交叉编译工具链

opencv在 Cmakelist的写法以及编译详解

next选择aarch64-gnu.toolchain.cmake。这个文件在你解压的opencv文件夹下

you/opencv/path/platforms/linux/aarch64-gnu.toolchain.cmake,例如

/home/white/opencv/opencv-4.x/platforms/linux/aarch64-gnu.toolchain.cmake

由于是交叉编译,我需要确定他安装在哪里,搜索

opencv在 Cmakelist的写法以及编译详解

建议不安装,如果不执行install,这个文件夹不会产生,如果使用命令行,他会默认安装在usr/local下面,导致和系统opencv冲突,所以gui还是蛮智能的,安装路径在这里

确认以下变量是否设置

opencv在 Cmakelist的写法以及编译详解

rknn需要opencv静态库,因此选择静态编译,反选BUILD_SHARED_LIBS

opencv在 Cmakelist的写法以及编译详解

点击configure

3.4生成opencv

点击generate

opencv在 Cmakelist的写法以及编译详解

查看我们的build文件,发现已经生成好了

opencv在 Cmakelist的写法以及编译详解

执行make -j4 (我给虚拟机分配了四个内核,所以这里选择了-j4)

为了不和我们本机使用的opencv冲突,我们选择不安装的方式(当然其实安装也可以,因为他是安装在./install下,不会冲突)

3.5 在cmakelist中配置使用

opencv在 Cmakelist的写法以及编译详解

为了debug方便,我们使用MESSAGE打印这几个变量的地址,看看是否正确。

opencv在 Cmakelist的写法以及编译详解

自己编译的opencv,完整了许多

opencv在 Cmakelist的写法以及编译详解

rknn官方提供的opencv,模块缺了很多

找到了rknn没有提供的video模块~

我们修改为错误版本的opencv,这里使用/opencv/builddebug,是一个错误的路径,debug~

opencv在 Cmakelist的写法以及编译详解

opencv在 Cmakelist的写法以及编译详解

由于在builddebug下找不到对应的config.cmake文件,因此转而使用系统变量/usr/local下的opencv,然而这个opencv是x86架构,后面交叉编译会引起报错

opencv在 Cmakelist的写法以及编译详解

因此,建议不安装使用opencv,即使是x86架构的opencv ,改正后交叉编译

opencv在 Cmakelist的写法以及编译详解

成功!

4.结束

注意,opencv在cmake后就已经生成了一些路径变量,因此cmake后移动文件夹会导致报错,如果需要,应该重新在待使用路径下使用cmake重新生成build文件夹。

5.安装?

到这里其实已经结束了,在这里整理一下另外一些想要额外说明的东西。

其实不管是指令也好,gui也好,安装其实只是把文件拷贝到另一个地方,并没有windows中所谓的注册表或者配置文件这样的说法,因此其实是不需要安装的,但是不安装是有点乱,有强迫症的话,还是安装一下好的,但是依旧不建议安装在默认路径,即系统变量下,使用gui的话,他默认安装在build/install下,使用命令行的话,则是默认安装在/usr/local下,这是很不友好的 所以建议使用

sudo make install DESTDIR=./install

但是他实际安装在了./install/usr/local。。。。。。

opencv在 Cmakelist的写法以及编译详解

无妨,无妨,继续找我们需要的config.cmake文件

opencv在 Cmakelist的写法以及编译详解

同样使用即可。

set(OpenCV_DIR /home/white/opencv/build/install/usr/local/lib/cmake/opencv4)

此时,我们可以删除不安装模式下的臃肿文件。

6.BUG速查

6.1cmake时提示一些模块因为冲突而未安装

CMake Warning at cmake/OpenCVUtils.cmake:1547 (add_library):
Cannot generate a safe runtime search path for target opencv_highgui
because files in some directories may conflict with libraries in implicit
directories:

runtime library [libpangocairo-1.0.so.0] in /usr/lib/x86_64-linux-gnu may be hidden by files in:
/home/white/anaconda3/lib

这是因为你安装了anaconda,导致anaconda和opencv冲突,解决方案:

退出anaconda

conda deactivate

查看你的环境变量

echo $PATH
/home/white/anaconda3/bin:/home/white/anaconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

临时将PATH环境变量取消和anaconda相关的变量,复制echo的结果中不包含anaconda的内容并export

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

如果这种方案不能解决问题

那就强制cmake使用指定编译器

opencv在 Cmakelist的写法以及编译详解

cmake -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++ -DCMAKE_C_COMPILER:PATH=/usr/bin/gcc ../opencv-4.x/

如果还没有解决,那可能是缓存的问题,删掉整个build文件夹重新创建build文件夹重新编译。

6.2 ../../lib/libopencv_imgcodecs.so.4.5.5:对’TIFFReadDirectory@LIBTIFF_4.0’未定义的引用

opencv在 Cmakelist的写法以及编译详解

这个是在编译时报的错误,编译指令添加参数

cmake -DBUILD_TIFF=ON --build .

Original: https://blog.csdn.net/qq_41612863/article/details/122149124
Author: 天天向上的小白白~
Title: opencv在 Cmakelist的写法以及编译详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/701524/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球