目录
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时提示一些模块因为冲突而未安装
如果是安装了的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
cmake findpackage会根据这四个cmake文件寻找Opencv的所有变量,例如include lib
具体内容可以查看OpenCVConfig.cmake文件
Config.cmake设置了一堆变量用于findpackage
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
# 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
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;
}
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} )
This part is easy, just proceed as with any other project using CMake:
cd
cmake .
make
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:
这里,我们修改一下步骤,在build的时候,不执行sudo make install,直接在build下make.同时,在cmakelist.txt中
find_package前,加一步
set(OpenCV_DIR xxx)
记得前面说过,xxx是四个cmake文件所在路径,因此,我们查看我们的build文件夹,找到OpenCVConfig.cmake文件,发现在build的根目录下
因此,我们设置xxx为~/home/opencv/build即可
经由同事介绍cmake的gui版本,发现gui确实好用且简单,交叉编译的时候用gui试试
apt install -y crossbuild-essential-arm64
# 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
sudo apt-get install cmake cmake-qt-gui
cmake-gui
设置source build
添加变量
Add Entry
NAME=CMAKE_AR;
Type=FILEPATH;
Value= /usr/local/arm/ext-toolchain/bin/aarch64-linux-gnu-ar
这个ar是交叉编译时候需要的一个工具,一般在/usr/bin下,如果不知道在哪里,可以使用which指令
点击configure,选择交叉编译工具链
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
由于是交叉编译,我需要确定他安装在哪里,搜索
建议不安装,如果不执行install,这个文件夹不会产生,如果使用命令行,他会默认安装在usr/local下面,导致和系统opencv冲突,所以gui还是蛮智能的,安装路径在这里
确认以下变量是否设置
rknn需要opencv静态库,因此选择静态编译,反选BUILD_SHARED_LIBS
点击configure
点击generate
查看我们的build文件,发现已经生成好了
执行make -j4 (我给虚拟机分配了四个内核,所以这里选择了-j4)
为了不和我们本机使用的opencv冲突,我们选择不安装的方式(当然其实安装也可以,因为他是安装在./install下,不会冲突)
以rknn为例,找到CMakeLists.txt中定义Opencv的地方,进行替换
为了debug方便,我们使用MESSAGE打印这几个变量的地址,看看是否正确。
自己编译的opencv,完整了许多
rknn官方提供的opencv,模块缺了很多
找到了rknn没有提供的video模块~
我们修改为错误版本的opencv,这里使用/opencv/builddebug,是一个错误的路径,debug~
由于在builddebug下找不到对应的config.cmake文件,因此转而使用系统变量/usr/local下的opencv,然而这个opencv是x86架构,后面交叉编译会引起报错
因此,建议不安装使用opencv,即使是x86架构的opencv ,改正后交叉编译
成功!
注意,opencv在cmake后就已经生成了一些路径变量,因此cmake后移动文件夹会导致报错,如果需要,应该重新在待使用路径下使用cmake重新生成build文件夹。
到这里其实已经结束了,在这里整理一下另外一些想要额外说明的东西。
其实不管是指令也好,gui也好,安装其实只是把文件拷贝到另一个地方,并没有windows中所谓的注册表或者配置文件这样的说法,因此其实是不需要安装的,但是不安装是有点乱,有强迫症的话,还是安装一下好的,但是依旧不建议安装在默认路径,即系统变量下,使用gui的话,他默认安装在build/install下,使用命令行的话,则是默认安装在/usr/local下,这是很不友好的 所以建议使用
sudo make install DESTDIR=./install
但是他实际安装在了./install/usr/local。。。。。。
无妨,无妨,继续找我们需要的config.cmake文件
同样使用即可。
set(OpenCV_DIR /home/white/opencv/build/install/usr/local/lib/cmake/opencv4)
此时,我们可以删除不安装模式下的臃肿文件。
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使用指定编译器
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’未定义的引用
这个是在编译时报的错误,编译指令添加参数
cmake -DBUILD_TIFF=ON --build .