【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开发板交叉编译opencv249错误汇总

在linux下,编译链接的时候,经常会遇到这样一个问题,undefined reference to.....,引起这个问题的原因在于在链接的时候缺少选项。下面举几个例子,并给出解决办法。 1、  ...

针对arm,opencv编译完成后执行时提示找不到库情况;

针对arm,opencv编译完成后执行时提示找不到库情况; Shared library: [../../lib/libopencv_core.so]解决办法 1.配置好编译器等路径; 2.进入...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

OpenCV ARM移植(交叉编译opencv)

部分内容来自下面2编文章: http://www.cnblogs.com/emouse/archive/2013/04/01/2993842.html http://blog.csdn.net/sat...

ARM opencv 找不到动态链接库的解决

在PC机上能够成功运行QT程序,但是移植到ARM开发板上,运行程序时出现段错误,这和调用opencv的函数有关,在网上看了看,最终决定调用V4L2来打开摄像头,但是又出现找不到opencv的动态链接库...

Linux下安装opencv并移植至ARM

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

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

【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4—共享库中嵌套库带路径【已解决】标签:【Linux开发】紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交叉编...

OpenCV在ARM-linux上的移植过程遇到的问题3---共享库中嵌套库居然带路径【未解决】

【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题3—共享库中嵌套库居然带路径【未解决】标签(空格分隔): 【Linux开发】移植opencv到tq2440一、下载opencv及...

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

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

Linux移植过程遇到的问题

原文地址:希望今天能完成linux3.3.8在OK6410上的部分移植作者:always_std 今天解决仅解决了3个小问题,make zImage 成功,还是值得欣慰的。 但是kernel烧进去...

OPENCV库在DM8148 ARM上的移植

参考文章: 1、http://blog.csdn.net/luotuo44/article/details/8958990 2、http://blog.csdn.net/guo8113/artic...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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