一.关于Opencv GUI显示库,
opencv 中,可以调用imshow 之类方法把mat 数据直接显示的窗口之上.
这一些是由 highgui 模块来实现. 其中在Linux下,默认采用GTK作为底层窗口显示模块.但是在ARM-Linux 情况下,是没有GTK库的,所以在ARM-Linux 下需要把显示库设为QT支持. 否则一运行类似于cvWaitKey,imshow之类方法就失败.
Opencv 生成Makefile 是工具不是常见configure .而是cmake.
增加QT支持需要做两点
- 在是调用cmake 增加参数 -D WITH_QT=ON
- 让cmake 能找到QT的开发库所在目录.
以下总结,Ubuntu和imx6 yocto 环境增加QT支持方法.
二.ubuntu Opencv 增加QT支持.
首先安装cmake
sudo apt-get install cmake
sudo apt-get install cmake-qt-gui #cmake 图形界面版,可选
桌面版opencv ,最简捷的方法是使用Ubuntu官方的 opencv安装脚本,可以下载,配置,编译安装一个脚本搞掂.
介绍网页在此
https://help.ubuntu.com/community/OpenCV
脚本下载地址,可以这里选择下载脚本
https://github.com/jayrambhia/Install-OpenCV/tree/master/Ubuntu/2.4
我们选择 https://github.com/jayrambhia/Install-OpenCV/blob/master/Ubuntu/2.4/opencv2_4_10.sh
他的内容是
rch=$(uname -m)
if [ "$arch" == "i686" -o "$arch" == "i386" -o "$arch" == "i486" -o "$arch" == "i586" ]; then
flag=1
else
flag=0
fi
echo "Installing OpenCV 2.4.10"
mkdir OpenCV
cd OpenCV
echo "Removing any pre-installed ffmpeg and x264"
sudo apt-get -y remove ffmpeg x264 libx264-dev
echo "Installing Dependenices"
sudo apt-get -y install libopencv-dev
sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm
sudo apt-get -y install libtiff4-dev libjpeg-dev libjasper-dev
sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev
sudo apt-get -y install python-dev python-numpy
sudo apt-get -y install libtbb-dev libeigen3-dev
sudo apt-get -y install libqt4-dev libgtk2.0-dev
sudo apt-get -y install libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev
sudo apt-get -y install x264 v4l-utils ffmpeg
sudo apt-get -y install libgtk2.0-dev
echo "Downloading OpenCV 2.4.10"
if ! [ -f "OpenCV-2.4.10.zip" ]; then
wget -O OpenCV-2.4.10.zip http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip/download
fi
echo "Installing OpenCV 2.4.10"
if ! [ -d "opencv-2.4.10" ]; then
unzip OpenCV-2.4.10.zip
fi
rm OpenCV-2.4.10.zip
cd opencv-2.4.10
rm -rf build
mkdir build
cd build
cmake -D CUDA_ARCH_BIN=3.2 -D CUDA_ARCH_PTX=3.2 -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D BUILD_TIFF=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
make -j
sudo make install
sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
echo "OpenCV 2.4.10 ready to be used"
注意-WITH_QT=ON已经打开.
这里分两种情,如果qt安装系统缺省目录,则直接可以编译通过
sudo apt-get install qt5-default
如果Qt库安装在非标准目录,比如使用Qt 离线安装程序安装.,需要手工指明路径,否则会报找不到Qt5库的错误
CMake Warning at cmake/OpenCVFindLibsGUI.cmake:18 (find_package):
By not providing "FindQt5Core.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "Qt5Core", but
CMake did not find one.
按Qt官方介绍的方法,在源码目录下的CMakeLists.txt的
在81行
if(UNIX AND NOT ANDROID)
下面加入
list(APPEND CMAKE_PREFIX_PATH /home/hxy/Qt5.6.3/5.6.3/gcc_64)
其中CMAKE_PREFIX_PATH 指向Qt5安装目录.
然后手工执行
cmake -D CUDA_ARCH_BIN=3.2 -D CUDA_ARCH_PTX=3.2 -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D BUILD_TIFF=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..
生成Makefile成功后,可以用cmake-gui 打开build/CMakeCache.txt
里面显示

然后执行编译安装
make -j
sudo make install
三. imx6 yocto 环境 opencv增加QT
在imx6系统中,一般采用yocto 集成编译,各个库依赖编译.类似于Android 框架编译,一条指令完成所有软件(bootloader ,编译器,ARM-Linux ,各个开发库,以及根文件系统编译),如果何在yocto编译下,也相当复杂,请需参考相关教程.这里只增加opencv,以及
让opencv 支持QT.
3.1 增加opencv 库
在yocto 目录下
build/conf/local.conf 增加如下一句,编译器的开发库和根文件系统会增加opencv相关库.
CORE_IMAGE_EXTRA_INSTALL += "libopencv-core-dev libopencv-highgui-dev \
libopencv-imgproc-dev libopencv-objdetect-dev libopencv-ml-dev"
3.2 缺省opencv报错
但此时opencv的底层gui库是空的.一调用highgui的库相关函数会提示
ARM-Linux OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or
Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvWaitKey, file /home/hxy/imx6/fsl-new-bsp/build/tmp/work/cort
exa9hf-vfp-neon-poky-linux-gnueabi/opencv/2.4.11+gitAUTOINC+2c9547e314-r0/git/modules/highgui/src/window.cpp, line 567
terminate called after throwing an instance of 'cv::Exception'
what(): /home/hxy/imx6/fsl-new-bsp/build/tmp/work/cortexa9hf-vfp-neon-poky-linux-gnueabi/opencv/2.4.11+gitAUTOINC+2c9547e314-r0/git/modules/highgui/
src/window.cpp:567: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or
Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvWaitKey
这里提示window.cpp, line 567 ,cvWaitKey 出错,即下面代码报错,这里实际上进入无底层gui的状态.
CV_IMPL int cvWaitKey( int )
{
CV_NO_GUI_ERROR( "cvWaitKey" );
return -1;
}
3.3 opencv-2.4.bb 增加支持
打开源码目录下build/CMakeCache.txt ,发现在WITH_QT=OFF
注意直接修改下载源码目录下的CMakeLists.txt是无法编译的,因此需要依赖yocto其它库,也无法加入统一编译安装方法.
因此标准做法是修改yocto的对应库的bb文件.此时的opencv 库bb文件在
<you yocto dir>/sources/meta-openembedded/meta-oe/recipes-support/opencv/opencv_2.4.bb
修改地方如下
EXTRA_OECMAKE = "-DPYTHON_NUMPY_INCLUDE_DIR:PATH=${STAGING_LIBDIR}/${PYTHON_DIR}/site-packages/numpy/core/include \
-DBUILD_PYTHON_SUPPORT=ON \
-DWITH_GSTREAMER=OFF \
-DWITH_1394=OFF \
-DWITH_QT=ON \
-DOE_QMAKE_PATH_EXTERNAL_HOST_BINS=${STAGING_DIR}/${BUILD_SYS}/${bindir}/qt5 \
-DCMAKE_SKIP_RPATH=ON \
${@bb.utils.contains("TARGET_CC_ARCH", "-msse3", "-DENABLE_SSE=1 -DENABLE_SSE2=1 -DENABLE_SSE3=1 -DENABLE_SSSE3=1", "", d)} \
${@base_conditional("libdir", "/usr/lib64", "-DLIB_SUFFIX=64", "", d)} \
${@base_conditional("libdir", "/usr/lib32", "-DLIB_SUFFIX=32", "", d)} \
"
PACKAGECONFIG ??= "eigen jpeg png tiff v4l libv4l qt \
${@bb.utils.contains("DISTRO_FEATURES", "x11", "gtk", "", d)} \
${@bb.utils.contains("LICENSE_FLAGS_WHITELIST", "commercial", "libav", "", d)}"
PACKAGECONFIG[eigen] = "-DWITH_EIGEN=ON,-DWITH_EIGEN=OFF,libeigen,"
PACKAGECONFIG[gtk] = "-DWITH_GTK=ON,-DWITH_GTK=OFF,gtk+,"
PACKAGECONFIG[jpeg] = "-DWITH_JPEG=ON,-DWITH_JPEG=OFF,jpeg,"
PACKAGECONFIG[libav] = "-DWITH_FFMPEG=ON,-DWITH_FFMPEG=OFF,libav,"
PACKAGECONFIG[png] = "-DWITH_PNG=ON,-DWITH_PNG=OFF,libpng,"
PACKAGECONFIG[tiff] = "-DWITH_TIFF=ON,-DWITH_TIFF=OFF,tiff,"
PACKAGECONFIG[v4l] = "-DWITH_V4L=ON,-DWITH_V4L=OFF,v4l-utils,"
PACKAGECONFIG[libv4l] = "-DWITH_LIBV4L=ON,-DWITH_LIBV4L=OFF,v4l-utils,"
PACKAGECONFIG[jasper] = "-DWITH_JASPER=ON,-DWITH_JASPER=OFF,jasper,"
PACKAGECONFIG[qt] = "-DWITH_QT=ON,-DWITH_QT=OFF,qtbase,"
,其中EXTRA_OCCMAKE是执行cmake参数, 加入的如下两行,其中WITH_QT好理解解,OE_QMAKE_PATH_EXTERNAL_HOST_BINS是让cmake能找到yocto编译好的QT5库,没有这一句执行报错找不到qmake
CMake Error at /home/hxy/imx6/fsl-new-bsp/build/tmp/sysroots/imx6solosabresd/usr/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:27 (message):
| The imported target "Qt5::Core" references the file
|
| "/qmake"
另外增加两处是qt库的引用
PACKAGECONFIG ??= "eigen jpeg png tiff v4l libv4l qt
PACKAGECONFIG[qt] = "-DWITH_QT=ON,-DWITH_QT=OFF,qtbase,"
修改后,执行整体的bitbake命令,即可编译出支持Qt版本的opencv
bitbake fsl-image-qt5 -v
网友评论