编译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_IPPWITH_MSMF ENABLE_PRECOMPILED_HEADERS

  • 配置好安装路径CMAKE_INSTALL_PREFIX
    在这里插入图片描述
    -取消勾选WITH_OPENCL_D3D11_NV
    在这里插入图片描述

  • 取消所有TEST字样配置,不进行编译及安装
    在这里插入图片描述

  • 勾选OPENCV_ENABLE_NONFREE
    在这里插入图片描述

  • 配置CMAKE_CONFIGURATION_TYPESRelease
    加粗样式

  • 配置CMAKE_BUILD_TYPERelease
    在这里插入图片描述

对于无法生成opencv_traincascade和opencv_createsamples工具问题处理

取消默认的屏蔽
在这里插入图片描述

在这里插入图片描述

生成静态库文件

  • 配置项BUILD_SHARED_LIBS取消勾选(不要共享库即动态库)即可编译成静态库

QT中链接静态库方法

  • 方法1,QT参考文章
    总结:.pro文件中增加 CONFIG += static 指定静态编译即可,这是唯一与链接动态库不同的地方
  • 方法2,在.pro文件中鼠标右键,选择添加库一步步走即可
    GCC参考文章
    总结:编译链接增加 -static 同样指定静态编译即可,否则优先寻找动态库编译链接

添加扩展模块opencv_contrib

  • 配置OPENCV_EXTRA_MODULES_PATHopencv_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后,这边会正常会直接有的不需要写,确认下最好不过):
    在这里插入图片描述

此问题参考
参考2

  • 当编译后无法找到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:当然可能由于某一时刻网络的问题导致未能下载成功,也可以再次点击配置,让他再次下载
    参考博客地址

猜你喜欢

转载自blog.csdn.net/weixin_42892101/article/details/107467524