一、背景
在项目中希望工程能快速地移植到他人的电脑里而不用手动安装配置opencv环境。所以我们需要把opencv放入工程里。
在这里,我第一时间想的就是使用opencv编译静态库:
cmake -D CMAKE_BUILD_TYPE=RELEASE .. \
-D CMAKE_INSTALL_PREFIX=install \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.0/modules \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_SHARED_LIBS=NO \
..
编译完后,我发现静态库太多,一个一个链接入工程太麻烦,于是我在编译的时候又加入了 -D BUILD_opencv_world=ON ,这样所有库都会被整合起来。
但问题也随之而来,在调用这个库时,工程报错了,原因是找不到对应的库文件。查了一番后,发现虽然库文件都被整合起来了,但这个整合起来的静态库文件里没有调用那些库文件的参数。
在思考一番后,我想既然静态库不行,我用动态库可不可以。
一般工程里使用opencv是在CMakeLists.txt文件里利用 find_package(OpenCV REQUIRED) 去找到opencv安装目录里的四个.cmake文件,再通过这些文件找到对应配置的opencv文件。这样只要在CMakeLists.txt里设置.cmake文件的查找路径,再写个自动给配置文件添加lib库文件路径的.sh文件。
具体步骤如下:
二、opencv部署
opencv版本4.5.0
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.下载源码
opencv https://opencv.org/releases/
opencv_contrib https://github.com/opencv/opencv_contrib/tree/4.5.0
将opencv_contrib放到opencv文件夹
3.编译
新建build.sh文件,写入:
#!/bin/bash
if [[ ! -d build ]]; then
mkdir build
fi
cd build
rm -rf *
cmake -D CMAKE_BUILD_TYPE=RELEASE .. \
-D CMAKE_INSTALL_PREFIX=install \
-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.0/modules \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=OFF \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_opencv_java=OFF \
-D BUILD_opencv_world=ON \
-D BUILD_OPENEXR=ON \
-D BUILD_JAVA=OFF \
-D BUILD_ANDROID_EXAMPLES=OFF \
-D WITH_OPENCL=OFF \
-D WITH_IPP=OFF \
-D WITH_TBB=OFF \
-D BUILD_EXAMPLES=OFF \
-D BUILD_TESTS=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_DOCS=OFF \
..
make -j4
make install
可以根据需要增删各个启用参数
4.部署
编译成功后获得一个install文件夹,把文件夹里的lib文件夹和Include文件夹复制到工程文件里。在CMakeLists.txt文件里添加:
# find opencv
set(OpenCV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/cmake/opencv4)
find_package(OpenCV 4.5.0 REQUIRED)
include_directories(./include/opencv4)
target_link_libraries(这里写你设置的工程名 PUBLIC
${OpenCV_LIBS}
)
新建一个EnvironmentalConfiguration.sh:
#!/bin/bash
sudo -s <<EOF
cd ./lib
DIR=$(cd $(dirname $0) && pwd )
cd /etc/ld.so.conf.d/
if [ -d "./opencv.conf" ]; then
touch opencv.conf
fi
echo $DIR >> opencv.conf
ldconfig
EOF
这个将opencv库文件路径加入配置,以防万一配置没启用,EnvironmentalConfiguration.sh文件运行后重启一次电脑。
这样只要将工程文件夹整个打包发给别人,解压后运行EnvironmentalConfiguration.sh,就可以使用opencv了。