【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】
【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
【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】的更多相关文章
- OpenCV在ARM-linux上的移植过程遇到的问题3---共享库中嵌套库居然带路径【未解决】
[Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题3-共享库中嵌套库居然带路径[未解决] 标签(空格分隔): [Linux开发] 移植opencv到tq2440 一.下载open ...
- 【Linux开发】如何查看Linux kernel的内置模块驱动列表和进程ID
[Linux开发]如何查看Linux kernel的内置模块驱动列表和进程ID 标签:[Linux开发] 命令: cat /lib/modules/$(uname -r)/modules.builti ...
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题2---CMAKE配置问题
实际上这里说的是移植的第一步,下载到源码后,我用的是opencv2.4.9,解压缩,然后可以利用cmake-gui来进行configure配置,这里面需要设置交叉编译的工具链,具体的可以参考[Linu ...
- Linux 安装 go 以及 arm linux 移植 go
背景 Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. 从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码 ...
- opencv在arm和x86在移植
一个.开发环境 操作系统:fedora14 Opencv版本号:2.0 Qt版本号:4.7 arm:mini6410 交叉编译工具:arm-linux-gcc-4.5.1 二.安装与配置 Linux系 ...
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题
问题描述: 这个实际上是最后一部的问题,将生成的共享库文件放入到了/usr/local/opencv-arm/lib下,并且设置了LD_LIBRARY_PATH中为/usr/local/opencv- ...
- 【DSP开发】【Linux开发】基于ARM+DSP进行应用开发
针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算 ...
- Linux开发工具之Makefile(上)
二.makefile(上) 01.make工具 利用make工具可以自动完成编译工作.这些工作包括:如果修改了某几 个源文件,则只重装新编译这几个源文件:如果某个头文件被修改了,则 重新编译所有包 ...
- Linux开发工具之gdb(上)
三.gdb调试(上) 01.gdb:gdb是GNU debugger的缩写,是编程调试工作. 功能: 启动程序,可以按照用户自定义的要求随心所欲的运行程序: 可让被调试的程序在用户所指定的调试 ...
随机推荐
- regsvr32 驱动
1.将SYS驱动文件放到系统目录的SYSTEM32目录中.2.按WIN+R组合键,在运行框中输入:regsvr32 sys所在全路径,点击确定即可.
- 移动端适配 后篇(rem+vm)
涉及到的一些名词, 详细解释可参考 移动端适配前篇--移动端适配 rem 名词解释 [英寸Inch]英寸表示屏幕斜对角线的长度 [像素Pixel]像素是图像的基本采样单位,它不是一个确定的物理量,因为 ...
- 【hiho1041】国庆出游 dfs+bitset
题目大意:给定一棵 N 个节点的有根树,1 号节点为根节点,现遍历整棵树,要求每条边仅被经过两次,问是否存在一种特定的遍历方式使得 dfs 序中节点的相对前后关系符合给定的顺序. 题解: 首先,由于要 ...
- Ubuntu中linux虚拟机全屏
登录客户机操作系统.在虚拟机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools. 1.进入文件界面,找到左侧“设备”右击“安装VM ...
- luogu P1352 没有上司的舞会 x
P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员 ...
- 买SD卡和TF卡要买U3和A2协议的
A3 最低平稳写入30M/s
- [CSP-S模拟测试]:数对(线段树优化DP)
题目传送门(内部题96) 输入格式 第一行一个整数$n$,接下来$n$行每行三个整数$a_i,b_i,w_i$. 输出格式 一行一个整数表示最大权值和. 样例 样例输入: 54 4 12 3 31 5 ...
- zabbix监控惠普打印机
http://www.ttlsa.com/zabbix/zabbix-monitor-hp-printer/
- [论文笔记] Fine-Grained Head Pose Estimation Without Keypoints
Fine-Grained Head Pose Estimation Without Keypoints 简介 head pose estimation 经典论文,使用CNN预测三个角度值,pitch, ...
- 配置 setting镜像在nexus私服上下载
在你的本地仓库上 setting文件中配置,一旦nexus服务关闭是无法下载的 1 配置nexus镜像 <mirror> <id>central1</id> < ...