【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】

原创 2016年08月30日 00:18:26

【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4—共享库中嵌套库带路径【已解决】

标签:【Linux开发】


紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交叉编译ARM-Linux,opencv,好像刚开始make install路径的问题,让我宿主机Ubuntu14.04上的opencv链接库被交叉编译库给冲掉,然后在宿主机上运行本机的Opencv程序时候居然报错了,imread似乎运行不正确。后来重新编译OpenCv,结果原来的可以运行namedWindow的程序已经不能运行了,爆出的错误就是GTK没有移植上去,所以highgui的imshow等不能用了,不过还好,这样就保持跟ARM板卡上的opencv一样的配置。


接着就是解决交叉编译后的共享库嵌套包含../../lib/路径的问题,其实真的是无话可说,查看了这么多的技术博文,最后就找到了一个能够解决问题的,而且他也是犯了一大堆的错误,最后发现问题就是在设置configure CMake的时候,操作系统不要跟着网上的走填写什么arm-linux,直接填写Linux就好,仍然使用交叉编译工具,然后configure之后就不会出现CMake不识别系统的问题。这样将信将疑的配置了下去,中间也是出现了一堆的问题,当然主要是有些东西没有屏蔽掉,比如1394的,cuda的,tiff的,ocl的,opencl的等,同时为了保证opencv移植后能够进行capture.read(frame),选中了WITH_V4L。具体的配置如下:

这里写图片描述

这里写图片描述

当然这里参考了《ARM + OpenCV 抓取摄像头图像 && 一点感想
中的内容,同时把他的内容粘贴过来如下:

使用前一篇中所述的配置方法,搭建出的基于arm-linux 的 OpenCV 对USB摄像头进行图像抓取,后面进一步会抓取视频。一开始抓取不了视频,VideoCapture 对象无法获取 /dev/video0 的设备。解决问题的思路贴下来,无耐心可跳过直接看最后:

VideoCapture打不开 isOpened 返回 false。
查看开发板的系统是否支持V4L2, multimedia -- > 内核配置
查看OpenCV编译的时候是否勾选了V4L2选项
初步定位到 OpenCV编译 cmake时选择 WITH_V4L 
OpenCV 2.4.9 + Ubuntu 12.04 : cmake-gui 中没有 WITH_V4L 或者 WITH_LIBV4L 这个选项
/usr/include/linux/ videodev.h videdev2.h 这个貌似没问题(待定)

OpenCV 2.4.3 在我的机器上试验,cmake-gui中依然没有 WITH_V4L选项,但是室友的机器上是有的,排除OpenCV安装包版本的问题,可能存在机器配置差异的问题。
安装libv4l-dev试试 —— 重新配置cmake-gui中的Cache,找不到V4L相关的值
安装 libv4l* —— 重新配置cmake-gui中的Cache,找不到V4L相关的值

opencv-2.4.9/cmake/OpenCVCmakeFindLibsVideo.cmake :
ocv_clear_vars(HAVE_LIBV4L HAVE_CAMV4L HAVE_CAMV4L2 HAVE_VIDEOIO)
if(WITH_V4L)
    if(WITH_LIBV4L)
        CHECK_MUDULE(libv4l1 HAVE_LIBV4L)
    endif()
    CHECK_INCLUDE_FILE(linux/videodev.h HAVE_CAMV4L)
    CHECK_INCLUDE_FILE(linux/videodev2.h HAVE_CAMV4L2)
    CHECK_INCLUDE_FILE(sys/videoio.h HAVE_VIDEOIO)
endif(WITH_V4L)

opencv-2.4.9/modules/highgui/src/ 下有 cap_v4l.cpp:
#ifdef HAVE_CAMV4L2
#include<asm/types.h>
#include<linux/videodev2.h>
#endif

配置PC机端OpenCV的cmake-gui,具有WITH_LIBV4L和WITH_V4L选项,推测和指定的交叉编译器有关。
换了交叉编译器 arm-2011.03 依然无效。
cmake-gui 进行 configure 的时候,选择第三项 Specify toolchain file for cross-compiling 时,出现了 V4L 选项。但编译生成出来的是PC端的文件。

拷贝一个videodev.h到交叉工具链中的/lib,然后删除并重新建立编译目录,重新配置即可 ——不通过
v4l-utils 可能还需要在开发板上配置该 lib

配置MX53,menuconfig 发现缺少 V4L2 的支持,只有V4L 的支持


cmake-gui 配置,target-system :Linux version:2.6.35

最后,配置target-system 时,以前受网上文章误导,写的是 arm-linux,这就导致 cmake 无法识别目标系统的类型,只有写 Linux 时,cmake 才识别出目标系统的类型,使得cmake-gui出现和PC端相同的选项,带有WITH_V4L和WITH_LIBV4L 。这里只需要勾选WITH_V4L 即可。勾选WITH_LIBV4L 后面交叉编译时可能会出现错误,暂时还未解决。在仅勾选WITH_V4L 的情况下,交叉编译时可能会出现缺少头文件的错误,将本机的 libv4l1.h libv4l1-videodev.h libv4l2,h libv4lconvert,h 四个文件拷贝到交叉编译工具的include 文件目录下即可。

感想:包括CSDN在内的网上有很多技术文章都具有很好的学习和参考价值,但是大部分人在写技术文章的同时可能只是记录一下整个过程,对于一些技术细节不能全部掌握,这样读者在看文章的时候跟着照做就可能出现文章中未指出或作者未遇到的问题。比如cmake的一些东西不太懂,导致摄像头采集图像的实验拖了很久,非常浪费时间。所以更需要看一些讲述原理性的文章,有利于举一反三,想想在实际做的时候是否涉及到,对于少遇到问题,解决问题都有很大的好处。

我是从我的宿主机的/usr/include路径把这几个文件copy到了我的交叉编译工具链中的include文件夹中:

root@huty-virtual-machine:~# cd /usr/include/
root@huty-virtual-machine:/usr/include# ls
af_vfs.h       complex.h     dlg_config.h      fstab.h             highgui.h       ldap_features.h     libyasm-stdint.h  netax25         pcrecpp.h           sched.h        tar.h         wait.h
aio.h          cpio.h        dlg_keys.h        fts.h               ibus-1.0        ldap.h              limits.h          netdb.h         pcre.h              scsi           tbb           wchar.h
aliases.h      crypt.h       drm               ftw.h               ibus-anthy-1.0  ldap_schema.h       link.h            neteconet       pcreposix.h         SDL            termcap.h     wctype.h
alloca.h       ctype.h       elf.h             _G_config.h         ibus-qt         ldap_utf8.h         linux             netinet         pcre_scanner.h      search.h       term_entry.h  wordexp.h
alsa           cucul.h       endian.h          gconv.h             iconv.h         ldif.h              locale.h          netipx          pcre_stringpiece.h  semaphore.h    term.h        X11
argp.h         curl          envz.h            gcrypt.h            idna.h          libavcodec          ltdl.h            netiucv         php5                setjmp.h       termio.h      x264-10bit
argz.h         cursesapp.h   err.h             gcrypt-module.h     idn-free.h      libavformat         lzma              netpacket       pixman-1            sgtty.h        termios.h     x264_config.h
ar.h           cursesf.h     errno.h           gdk-pixbuf-2.0      idn-int.h       libavutil           lzma.h            netrom          pngconf.h           shadow.h       tgmath.h      x264.h
arpa           curses.h      error.h           getopt.h            ifaddrs.h       libdrm              malloc.h          netrose         png.h               signal.h       theora        x86_64-linux-gnu
asm-generic    cursesm.h     esd.h             gettext-po.h        inttypes.h      libgen.h            math.h            nfs             poll.h              slang.h        thread_db.h   xcb
assert.h       cursesp.h     et                gio-unix-2.0        jasper          libintl.h           mcheck.h          nl_types.h      pr29.h              slcurses.h     tic.h         xen
atk-1.0        cursesw.h     eti.h             GL                  jbig85.h        libio.h             memory.h          nss.h           printf.h            sound          time.h        xf86drm.h
audiofile.h    cursslk.h     etip.h            glib-2.0            jbig_ar.h       libltdl             menu.h            numpy           profile.h           spawn.h        tld.h         xf86drmMode.h
aupvlist.h     cvaux.h       execinfo.h        glob.h              jbig.h          libpng              mirclient         obstack.h       protocols           stab.h         ttyent.h      xine
autosprintf.h  cvaux.hpp     expat_external.h  gnu                 jerror.h        libpng12            mircommon         ogg             pthread.h           stdc-predef.h  turbojpeg.h   xine.h
avahi-client   cv.h          expat.h           gnutls              jmorecfg.h      libraw1394          mit-krb5          opencore-amrnb  pty.h               stdint.h       uapi          xlocale.h
avahi-common   cv.hpp        faaccfg.h         gnu-versions.h      jpegint.h       librtmp             ml.h              opencore-amrwb  pulse               stdio_ext.h    uchar.h       xorg
bits           cvwimage.h    faac.h            google              jpeglib.h       libswscale          mntent.h          opencv          punycode.h          stdio.h        ucontext.h    xvid.h
byteswap.h     cxcore.h      fcntl.h           gpg-error.h         kadm5           libtasn1.h          monetary.h        opencv2         pwd.h               stdlib.h       ulimit.h      zlib.h
c++            cxcore.hpp    features.h        grp.h               kdb.h           libv4l1.h           mqueue.h          opencv.hpp      python2.7           string.h       unctrl.h
caca0.h        cxeigen.hpp   fenv.h            gshadow.h           krb5            libv4l1-videodev.h  mtd               OpenEXR         qt4                 stringprep.h   unistd.h
caca_conio.h   cxmisc.h      FlexLexer.h       gssapi              krb5.h          libv4l2.h           nautilus-sendto   openssl         rdma                strings.h      ustat.h
caca.h         dbus-1.0      fmtmsg.h          gssapi.h            lame            libv4l2rds.h        nc_tparm.h        p11-kit-1       re_comp.h           stropts.h      utime.h
caca++.h       dc1394        fnmatch.h         gssrpc              langinfo.h      libv4lconvert.h     ncurses_dll.h     panel.h         regex.h             sudo_plugin.h  utmp.h
caca_types.h   dialog.h      fontconfig        gstreamer-0.10      lastlog.h       libv4l-plugin.h     ncurses.h         pango-1.0       regexp.h            sys            utmpx.h
cairo          dirent.h      form.h            gtk-2.0             lber.h          libxml2             net               paths.h         resolv.h            syscall.h      values.h
cifsidmap.h    dlfcn.h       fpu_control.h     gtk-unix-print-2.0  lber_types.h    libyasm             netash            pciaccess.h     rpc                 sysexits.h     video
com_err.h      dlg_colors.h  freetype2         harfbuzz            ldap_cdefs.h    libyasm.h           netatalk          pcrecpparg.h    rpcsvc              syslog.h       vorbis

具体的路径是:

root@huty-virtual-machine:/opt/Ti-Am4378/Toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf/include/c++/4.7.3# ls
algorithm            cassert   cinttypes  condition_variable  cstdint  cwctype    fenv.h            ios                 libv4l2.h        mutex     random            stdexcept     tr2            utility
arm-linux-gnueabihf  ccomplex  ciso646    csetjmp             cstdio   cxxabi.h   forward_list      iosfwd              libv4lconvert.h  new       ratio             streambuf     tuple          valarray
array                cctype    climits    csignal             cstdlib  debug      fstream           iostream            limits           numeric   regex             string        typeindex      vector
atomic               cerrno    clocale    cstdalign           cstring  decimal    functional        istream             list             ostream   scoped_allocator  system_error  typeinfo
backward             cfenv     cmath      cstdarg             ctgmath  deque      future            iterator            locale           parallel  set               tgmath.h      type_traits
bits                 cfloat    complex    cstdbool            ctime    exception  initializer_list  libv4l1.h           map              profile   sstream           thread        unordered_map
bitset               chrono    complex.h  cstddef             cwchar   ext        iomanip           libv4l1-videodev.h  memory           queue     stack             tr1           unordered_set
root@huty-virtual-machine:/opt/Ti-Am4378/Toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf/include/c++/4.7.3# 

不管怎样,通过上面的方法,真的解决了libopencv_highgui.so中的../../lib/路径的问题。


下面是我的Ubuntu14.04宿主机自己的opencv CMake时候的配置。做一下备份,回头在不同的宿主机上上编译源码时可以作为参考。不然就得一个一个的试着来,每次发现一个错误,编译了一半,然后重新ccmake .,导致浪费时间。

这里写图片描述

这里写图片描述

这里写图片描述


2016-8-30 0:17
张朋艺 pyZhangBIT2010@126.com

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/lg1259156776/。

相关文章推荐

ARM + OpenCV 抓取摄像头图像 && 一点感想

使用前一篇中所述的配置方法,搭建出的基于arm-linux 的 OpenCV 对USB摄像头进行图像抓取,后面进一步会抓取视频。一开始抓取不了视频,VideoCapture 对象无法获取 /dev/v...

Opencv2.4.9交叉编译

参考:http://blog.csdn.net/stihy/article/details/51288743  经过一个多星期苦逼中,终于把Opencv交叉编译通过了。废话不多说,把我过程分享出来,...

Linux下Opencv的安装及配置使用

一、安装 1 安装cmake及一些依赖库 sudo apt-get install cmake sudo apt-get install build-essential libgtk2.0-dev l...

Ubuntu14.04 Opencv2.4.9交叉编译

opencv2.4.9 ubuntu14.04 cmake 交叉编译
  • stihy
  • stihy
  • 2016年05月01日 00:00
  • 3282

openssl交叉编译记录

本次任务是要完成嵌入式Linux下对openssl程序的支持。     我的开发环境:ARM9开发板 和 嵌入式Linux操作系统。装有Linux系统(我的是ubuntu9.04)的PC机一台。串口...

编译OpenCV for arm-linux

OpenCV是Intel支持的开源计算机视觉库。它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。它不依赖于其它的外部库—尽管也可以使用某些外部库。 OpenCV...
  • noodies
  • noodies
  • 2010年08月09日 11:41
  • 21366

【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题

问题描述: 这个实际上是最后一部的问题,将生成的共享库文件放入到了/usr/local/opencv-arm/lib下,并且设置了LD_LIBRARY_PATH中为/usr/local/open...

Linux下安装opencv并移植至ARM

目的:OpenCV是Intel支持的开源计算机视觉库。它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。它不依赖于其它的外部库—尽管也可以使用某些外部库。OpenCV使...

初尝linux——arm-linux移植之动态库问题

我一直在做zigbee的项目,因为这次zigbee主机方案需要用到arm,之前花了几个月的时间在PC linux上将主机程序调通了,现在的问题是将程序移植到arm linux。因为之前完全没有嵌入式l...

Ubuntu系统下嵌入式inux动态库的开发

Ubuntu系统下图像处理动态库的生成,opencv,arm-linux-gcc
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】
举报原因:
原因补充:

(最多只允许输入30个字)