编译OpenCV4.4测试运行
编译安装流程
前提准备
1、去github下载opencv4.4.0源码注意下载release版本的
2、去github下载opencv_contrib4.4.0源码注意下载release版本的
3、电脑安装必须的软件(cmake、mingw)具体可参考另一篇博客地址
使用cmake生成Makefile文件
1、打开cmake_gui软件,linux与windows上都有这个工具
2、第一行输入源码路径,第二行输入编译及生成的路径(自己建立个文件夹即可)
修改编译配置
-
勾选
WITH_QT
-
配置
Qt_DIR
路径信息:C:\Qt\Qt5.13.2\5.13.2\mingw73_64\lib\cmake\Qt5
这个根据个人安装路径不同进行修改,同时跟选择的编译器要一致 -
勾选
WITH_OPENGL
-
取消勾选
WITH_IPP
、WITH_MSMF
ENABLE_PRECOMPILED_HEADERS
-
配置好安装路径
CMAKE_INSTALL_PREFIX
:
-取消勾选WITH_OPENCL_D3D11_NV
-
取消所有
TEST
字样配置,不进行编译及安装
-
勾选
OPENCV_ENABLE_NONFREE
-
配置
CMAKE_CONFIGURATION_TYPES
为Release
-
配置
CMAKE_BUILD_TYPE
为Release
对于无法生成opencv_traincascade和opencv_createsamples工具问题处理
取消默认的屏蔽
生成静态库文件
- 配置项
BUILD_SHARED_LIBS
取消勾选(不要共享库即动态库)即可编译成静态库
QT中链接静态库方法
- 方法1,QT参考文章
总结:.pro文件中增加CONFIG += static
指定静态编译即可,这是唯一与链接动态库不同的地方 - 方法2,在.pro文件中鼠标右键,选择添加库一步步走即可
GCC参考文章
总结:编译链接增加-static
同样指定静态编译即可,否则优先寻找动态库编译链接
添加扩展模块opencv_contrib
- 配置
OPENCV_EXTRA_MODULES_PATH
为opencv_contrib/modules路径
可能出现的问题
glGenBuffers’ was not declared in this scope
问题解决参考地址
FFMPEG配置未成功启用问题
问题的原因,下载动态库文件未能成功,其大小为0KB
-
处理:
手动下载dll文件
,参考本文最后的问题处理项 -
最后点击配置并生成Makefile文件(build目录下),使用make命令进行编译
成功生成Makefile文件
编译
- 确认已安装make工具,并加入了环境变量
- 在Makefile目录下执行编译安装工作
make
make install
最后将opencv的install目录下的动态库文件所在路径加入系统环境变量
还是不清楚的情况,可以搜索一下库文件名字定位到那里。
测试运行
使用QT建立一个窗口工程
- .pro文件修改如下
#动态库
INCLUDEPATH += H:\My_Workspace\C_File\GitHub\opencv\build\install\include\opencv2 \
H:\My_Workspace\C_File\GitHub\opencv\build\install\include
LIBS += H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_calib3d440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_core440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_dnn440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_features2d440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_flann440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_gapi440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_highgui440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_imgcodecs440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_imgproc440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_ml440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_objdetect440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_photo440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_stitching440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_video440.dll.a \
H:\My_Workspace\C_File\GitHub\opencv\build\install\x64\mingw\lib\libopencv_videoio440.dll.a
- 运行代码,打开一个图片
#include "mainwindow.h"
#include <QApplication>
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
Mat img = imread("C://Users//47282//Desktop//281118.jpg" ,IMREAD_GRAYSCALE);
namedWindow("111");
imshow("111", img);
return a.exec();
}
注意:如果没有添加环境变量 ,则会出现编译通过,但是无法运行问题(异常结束问题)
使用QTcreator进行编译安装
-
使用QTcreator打开CMakelist文件,打开效果类似于打开.pro文件
-
选择编译工具链
-
在构建配置进行选择,配置的修改参考上文,修改完成注意应用保存
-
注意保存,修改后的配置
-
构建步骤,点开详情后展开,选择
install
-
增加多线程编译选项加快编译速度
填入如下
-
make一下
可能出现的问题zlib找不到
- 处理方式1:勾选
BUILD_ZLIB
再次编译 - 处理方式2:自己编译zlib
参考这里的脚本来安装,最后将头文件放到编译工具链中,动态库放到lib目录中即可
undefined reference to `png_init_filter_functions_neon’问题
带FPU的编译器优化问题,可以看到文件中的说明
修改文件,位于源码目录下3rdparty/libpng/pngpriv.h
# if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
//改为:
# if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \
安装出现问题权限不够
- 处理方式1 :因为编译已经成功Makefile已经有了,直接到Makefile的目录打开终端
sudo make install
- 处理方式2:以超级管理员权限打开qtcreator再次执行编译(点击小锤子)即可。
sudo ./qtcreator
#输入root用户密码即可
已正常安装成功!
linux端的编译
linux中的编译后安装目录里pkgconfig目录.pc文件路径加入PKG_CONFIG_PATH
环境变量中便于系统编译时查找使用
将以下加入到/etc/bash.bashrc中
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:.pc文件的路径信息加到此处
验证
pkg-config --cflags --libs opencv
先安装FFMPEG
参考地址
x264编译
#下载x264
wget -c http://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20191217-2245.tar.bz2
#解压后,进入源码目录配置编译
./configure --enable-static --enable-shared --disable-asm
make
sudo make install
#更新源
sudo apt update
sudo apt install ffmpeg --fix-missing
源码编译,脚本
#!/bin/sh
#下载
wget -c https://github.com/FFmpeg/FFmpeg/archive/n4.3.1.zip
#解压后,进入源码目录配置编译
unzip FFmpeg-n4.3.1.zip
cd FFmpeg-n4.3.1
./configure \
--target-os=linux \
--enable-shared \
--enable-static \
--enable-pic \
--enable-gpl \
--enable-nonfree \
--enable-ffmpeg \
--disable-ffplay \
--enable-swscale \
--enable-avresample \
--enable-pthreads \
--disable-armv5te \
--disable-armv6 \
--disable-armv6t2 \
--disable-yasm \
--disable-stripping \
--enable-libx264
make clean
make -j4 && sudo make install
交叉编译版本的FFMPEG
先编译x264
#下载x264
wget -c http://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20191217-2245.tar.bz2
#解压后,进入源码目录配置交叉编译
./configure --enable-static --enable-shared --host=arm-linux-gnueabihf --cross-prefix=arm-linux-gnueabihf- --enable-pic --disable-asm --prefix=/opt/x264_INSTALL_7_2HF
#编译
make
#安装
sudo make install
若编译出现如下错误,取消--disable-asm
如果在sudo make install
出现找不到命令情形,可能编译器的路径没有放置在/etc/bash.bashrc中,尝试使用su 输入密码后再次make install进行安装
编译ffmpeg
#下载
wget -c https://github.com/FFmpeg/FFmpeg/archive/n4.3.1.zip
#解压后,进入源码目录配置交叉编译
将一下脚本复制,修改其中的编译工具链,添加可执行权限后复制到ffmpeg的源码目录执行即可,注意arch项的配置要配合编译器
#!/bin/sh
BASE=/opt/FFMPEG_INSTALL_7_2HF
BUILD_HOST=arm-linux-gnueabihf
OUTPUT_PATH=${BASE}
OTHER_LIB=/opt/x264_INSTALL_7_2HF
./configure \
--cross-prefix=${BUILD_HOST}- \
--enable-cross-compile \
--target-os=linux \
--cc=${BUILD_HOST}-gcc \
--arch=arm \
--prefix=${OUTPUT_PATH}/ffmpeg \
--enable-shared \
--enable-static \
--enable-pic \
--enable-gpl \
--enable-nonfree \
--enable-ffmpeg \
--disable-ffplay \
--enable-swscale \
--enable-avresample \
--enable-pthreads \
--disable-armv5te \
--disable-armv6 \
--disable-armv6t2 \
--disable-x86asm \
--disable-stripping \
--enable-libx264 \
--extra-cflags=-I${OTHER_LIB}/include \
--extra-ldflags=-L${OTHER_LIB}/lib
#--disable-neon 依据平台是否添加此项
make clean
make -j4 && sudo make install
编译带x265的FFMPEG
不过增加x265后的需编译xcb和x11两个库
增加的链接项目如下:
-lx265 -lz -lxcb -lxcb-shm -lxcb-xfixes -lXau -lxcb-shape
x11和xcb编译方法查看地址
x265编译方法查看地址
在目录opencv-4.4.0/cmake/checks/
测试编译:
aarch64-linux-gnu-g++ ffmpeg_test.cpp -o ffmpeg -lavcodec -lavformat -lswscale -lavdevice -lavfilter -lavresample -lavutil -lpostproc -lswresample -lx264 -lx265 -lz -lxcb -lxcb-shm -lxcb-xfixes -lXau -lxcb-shape -L/opt/FFMPEG_INSTALL/ffmpeg/lib -L/opt/x264_INSTALL/lib -L/opt/x265/lib -L/usr/local/toolchain/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/lib -I/opt/FFMPEG_INSTALL/ffmpeg/include -L/opt/XCB_INSTALL/lib -L/opt/X11_INSTALL/lib
可能的问题:无法找到ffmpeg的库文件,也就是配置列表ffmpeg无法编译进去
解决:粗暴的方式(1、搜索关键字HAVE_FFMPEG
找到detect_ffmpeg.cmake
文件,增加如下段落 2、再将库文件复制到ffmpeg目录 3、重新编译安装)其中第二步应该可以不做,我没有测试
cmake增加的段落如下:
#这里只是为了set HAVE_FFMPEG 为 ON 配置打印信息骗骗人
if(NOT HAVE_FFMPEG AND NOT WIN32 AND NOT OPENCV_FFMPEG_SKIP_DOWNLOAD)
message(STATUS "===============Required DOWNLOAD==============")
include("${OpenCV_SOURCE_DIR}/3rdparty/ffmpeg/ffmpeg.cmake")
download_win_ffmpeg(FFMPEG_CMAKE_SCRIPT)
if(FFMPEG_CMAKE_SCRIPT)
include("${FFMPEG_CMAKE_SCRIPT}")
set(FFMPEG_libavcodec_VERSION "58.91.100" PARENT_SCOPE) # info
set(FFMPEG_libavformat_VERSION "58.45.100" PARENT_SCOPE) # info
set(FFMPEG_libavutil_VERSION "56.51.100" PARENT_SCOPE) # info
set(FFMPEG_libswscale_VERSION "5.7.100" PARENT_SCOPE) # info
set(FFMPEG_libavresample_VERSION "4.0.0" PARENT_SCOPE) # info
set(HAVE_FFMPEG TRUE)
set(HAVE_FFMPEG_WRAPPER TRUE)
endif()
endif()
#以下个人调试用,输出HAVE_FFMPEG 等等变量的状态,可以删除
if(NOT HAVE_FFMPEG)
message(STATUS "===============NOT HAVE_FFMPEG==============")
endif()
if(NOT HAVE_FFMPEG_WRAPPER)
message(STATUS "===============NOT HAVE_FFMPEG_WRAPPER==============")
endif()
if(NOT OPENCV_FFMPEG_SKIP_BUILD_CHECK)
message(STATUS "===============NOT OPENCV_FFMPEG_SKIP_BUILD_CHECK==============")
endif()
if(NOT OPENCV_FFMPEG_USE_FIND_PACKAGE)
message(STATUS "===============NOT OPENCV_FFMPEG_USE_FIND_PACKAGE==============")
endif()
if(FFMPEG_CMAKE_SCRIPT)
message(STATUS "==============="${FFMPEG_CMAKE_SCRIPT}"==============")
endif()
#实际作用:测试编译,若无法通过说明库文件放置错误,或者编译错误
if(HAVE_FFMPEG AND HAVE_FFMPEG_WRAPPER AND NOT OPENCV_FFMPEG_SKIP_BUILD_CHECK)
message(STATUS "===============try_compile==============")
set(FFMPEG_INCLUDE_DIRS "/usr/local/include")#这里根据自己的安装目录修改
set(FFMPEG_LIBRARIES "-lavcodec -lavformat -lswscale -lavdevice -lavfilter -lavresample -lavutil -lpostproc -lswresample -lx264")#这里根据自己的安装目录修改
set(HAVE_FFMPEG_WRAPPER FALSE)
message(STATUS "FFMPEG_INCLUDE_DIRS->:${FFMPEG_INCLUDE_DIRS}")
message(STATUS "FFMPEG_LIBRARIES->:${FFMPEG_LIBRARIES}")
try_compile(__VALID_FFMPEG
"${OpenCV_BINARY_DIR}"
"${OpenCV_SOURCE_DIR}/cmake/checks/ffmpeg_test.cpp"
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${FFMPEG_INCLUDE_DIRS}"
"-DLINK_LIBRARIES:STRING=${FFMPEG_LIBRARIES}"
OUTPUT_VARIABLE TRY_OUT
)
if(NOT __VALID_FFMPEG)
# message(FATAL_ERROR "FFMPEG: test check build log:\n${TRY_OUT}")
message(STATUS "WARNING: Can't build ffmpeg test code")
set(HAVE_FFMPEG FALSE)
endif()
endif()
#修改添加编译链接项,这个比较重要,上面只是判断库对不对,这个是加入编译了
if(HAVE_FFMPEG_WRAPPER)
ocv_add_external_target(ffmpeg "" "" "HAVE_FFMPEG_WRAPPER")
elseif(HAVE_FFMPEG)
message(STATUS "OK: Can build LIB With ffmpeg code link:${FFMPEG_INCLUDE_DIRS}+${FFMPEG_LIBRARIES}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FFMPEG_INCLUDE_DIRS} ${FFMPEG_LIBRARIES}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FFMPEG_INCLUDE_DIRS} ${FFMPEG_LIBRARIES}")
ocv_add_external_target(ffmpeg "${FFMPEG_INCLUDE_DIRS}" "${FFMPEG_LIBRARIES}" "HAVE_FFMPEG")
endif()
set(HAVE_FFMPEG ${HAVE_FFMPEG} PARENT_SCOPE)
配置输出没有出现以下测试编译错误,则说明库正确。
交叉编译的版本则指定连接路径即可
set(FFMPEG_LIBRARIES "-lavcodec -lavformat -lswscale -lavdevice -lavfilter -lavresample -lavutil -lpostproc -lswresample -lx264 -L/opt/FFMPEG_INSTALL_7_2HF/ffmpeg/lib -L/opt/x264_INSTALL_7_2HF/lib")
- 当编译测试通过,编译过程中找不到
libavxx
库时也可以强制指定(当然在依据上面修改了cmake后,这边会正常会直接有的不需要写,确认下最好不过):
- 当编译后无法找到libxxx库文件,检查确认/etc/ld.so.conf中是否将ffmpeg的库文件路径加入
重新加入后使用:sudo ldconfog
载入配置即可。
成功样式
错误处理
-
错误:gcc: error: long: No such file or directory
C:\msys64\mingw64\bin\windres.exe: preprocessing failed.
make[2]: *** [modules\core\CMakeFiles\opencv_core.dir\build.make:1475: modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1
make[1]: *** [CMakeFiles\Makefile2:1379: modules/core/CMakeFiles/opencv_core.dir/all] Error 2
make: *** [Makefile:162: all] Error 2
-
解决:在cmake的UI界面中搜索:
OPENCV_ENABLE_ALLOCATOR_STATS
取消勾即可解决错误!
命令行下处理:cmake -DOPENCV_ENABLE_ALLOCATOR_STATS=OFF
-
错误:error: boostdesc_bgm.i: No such file or directory
-
解决方式1:搜索文件
CMakeDownloadLog.txt
在此文件中搜索boostdesc_bgm.i
找到它的下载地址,手动下载,再复制到缺失的文件夹中
-
解决方式2:当然可能由于某一时刻网络的问题导致未能下载成功,也可以再次点击配置,让他再次下载
参考博客地址