完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
8.15
使用arm-none-linux-gnueabi-gcc交叉编译qt源码和opencv源码,生成的可执行文件到开发板运行会出现bus error错误 于是决定使用5.4.0的arm-linux-g++编译opencv源码和qt4.7.1源码。因为使用4.3.2的arm-linux-g++版本太低,虽然编译qt不会出错,但编译opencv会出错。 下面开始烧的是qte5.7的根文件系统 (超级终端的用户名显示为青色) cd /lib,再 strings libstdc++.so.6 |grep GLIBCXX 查看libstdc++的版本 可以看到只到了GLIBCXX_3.4.10,所以需要更高版本的libstdc++.so.6 查看虚拟机/usr/lib32下的版本,如下,把libstdc++.so.6和其链接的库(右键查看)都复制到lib,上面的错误没有 了,却出现了illegal instruction,查了一下原因是qt4.7编译时设置的问题,不能设置优化 关于illegal instruction的一些心得 重新编译器qt4.7 更改configure文件,CFG_ENDIAN=Q_LITTLE_ENDIAN (小端,默认是 auto ) 还是不行。。。。 由于编译Qt的arm-linux-gcc版本与编译内核与文件系统的版本不一致 ls -l /lib/libc.so.6 echo $LD_LIBRARY_PATH 可以查看动态链接库的环境变量 qt的开源社区 8.16 现在只剩下一个问题需要解决,libc.so的版本过低,需要2.19,而网盘上的qte4.7系统的版本只有2.8,所以决定自己编译一个新内核的qte系统 特别注意: libc.so.6不能随便更改,否则系统许多命令都不能运行 zImage是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息 又试了一次开发板烧录qte5.7的根文件系统,把opencv和qt4-7的链接库都复制到lib后,虽然没有报关于链接库的错误了,但还是报了非法指令illegal instruction的错误。 光盘里有提供了qt5.7的例程,去看一下是里面的kit是怎么设置的,还有把可执行文件复制到开发板上(5.7系统)运行,看是否有报非法指令的错误。 arm-none-linux-gnueabi交叉工具链与arm-linux-gcc 有区别吗 一般来说 arm-linux-gcc 是 arm-none-linux-gnueabi 的一个软链接。 可用 ls -l 命令查看链接对象 光盘提供的qt5例程下载到开发板执行还是显示Illegal instruction 的错误 回去看了一下技术文档,qt5.7的运行系统是ubuntu16.04!!! 终于用arm-linux-gcc 4.3.2编译成功了opencv2 (opencv3不能使用arm-linux-gcc 4.3.2 编译,版本太低,会报错) 使用cmake-gui 去掉with eigen with tiff 去掉openCL这几项 ,configure,generate,关掉cmake-gui,用gedit打开CmakeCache.txt, CMAKE_EXE_LINKER_FLAGS,加上-lpthread -lrt 打开终端,make,make install完成 虽然之前也是这么操作,但却 一直编译出错。或许问题出在下面这里,这个路径有的博客是按下面这样设置,有的是**/usr/local/arm/4.3.2/**,之前我一直是按照前者设置,这次按后者设置,就编译成功了。。。 不是上面的原因,我又按这个设置编译了一次还是成功了。。。未解之谜 qt creator中build 工程时出现 warning: …/…/lib/libopencv_core.so, needed by /usr/local/arm/lib/libopencv_highgui.so, not found (try using -rpath or -rpath-link) 这个问题是因为交叉编译器没有找到这个库(网上是这么说的)。我将libopencv_core.so,这个库拷贝到了交叉编译器的lib中就没有警告了。 无法打开摄像头 编译opencv时cmake-gui没有with_V4L的选型,是因为Operating System写成arm-linux,应该是Linux才支持V4L,改正后再编译一次,出现了很多报错,如当前的glic库并不适合交叉编译,意思就是的把这些库全都交叉编译,再用来交叉编译opencv的源码,很复杂,直接放弃。 直接调用V4L2的库来读取相机图像,通过拔插u***相机的前后对比,得到了相机的设备号是/dev/video2 int fd; fd = open("/dev/video2", O_RDWR); // 注意查看摄像头设备名 if (-1 == fd) { perror("open /dev/video2"); } /* 查询打开的设备是否属于摄像头:设备video不一定是摄像头*/ struct v4l2_capability cap; int ret = ioctl(fd, VIDIOC_QUERYCAP, &cap); if (-1 == ret) { perror("ioctl VIDIOC_QUERYCAP"); //close(fd); } if (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) { /* 如果为摄像头设备则打印摄像头驱动名字 */ printf("Driver Name: %sn", cap.driver); } else { printf("open file is not videon"); //close(fd); } /* 查询摄像头可捕捉的图片类型,VIDIOC_ENUM_FMT: 枚举摄像头帧格式 */ struct v4l2_fmtdesc fmt; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; // 指定需要枚举的类型 for (int i = 0; ; i++) // 有可能摄像头支持的图片格式不止一种 { fmt.index = i; ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmt); if (-1 == ret) // 获取所有格式完成 { break; } /* 打印摄像头图片格式 */ printf("Picture Format: %sn", fmt.description); /* 查询该图像格式所支持的分辨率 */ struct v4l2_frmsizeenum frmsize; frmsize.pixel_format = fmt.pixelformat; for (int j = 0; ; j++) // 该格式支持分辨率不止一种 { frmsize.index = j; ret = ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize); if (-1 == ret) // 获取所有图片分辨率完成 { break; } /* 打印图片分辨率 */ printf("width: %d height: %dn", frmsize.discrete.width,frmsize.discrete.height); } } 成功获取了相机的设备信息接下来就是采集图像 V4L2采集图像基本流程 按照上面这篇博客的程序成功获取了相机的图像,但运行一会系统就会奔溃重启,报错 Unable to handle kernel paging request at virtual address 806a7add之类的,主要是内存访问的问题,于是按照下面这篇文章重新修改了一些部分。 uchar *buffer; //buffers 指针记录缓冲帧 将原始数据缓存改成下面这个形式 struct buffer { void * start; unsigned int length; } * buffers; USB摄像头(V4L2接口)的图片采集 还是一直报内存错误,然后就是重启,增加队列数到30就持续运行了1000多帧,但开启图像处理, 用时增加从25ms到186ms, 再进行几十帧就崩溃重启了。 而且存在一个问题就是明明帧率有20,但qt显示却很卡,一两秒刷新一次!!!但我刚成功获取图像时并不卡。 我应该在虚拟机上先把代码调通了,再移植到板子上,主要的代码是V4L2, Linux系统共有的。 |
|
|
|
Qt
泛指 Qt software的所有版本的图像界面库,包括 Qt/X11(Unix/Linux),Qt Windows, Qt Mac 等,但这只是相对于二进制来说的。Qt作为一个跨平台的GUI 框架,在源码上对所有平台都是一致的。Unix/Linux上最流行的桌面环境之一KDE就是采用Qt来写的。 Nokia 在2008年收购 Trolltech 后,将 Qt 更名为 Qt Software,随后改为 Qt Development Frameworks。而后 Nokia 开发了 IDE 工具 Qt Creator,于是Qt FrameWork + Qt Creator = Qt SDK。 Qte:Qt/Embeded for linux 它是用于嵌入式 Linux 系统的 Qt 版本,也是一套界面库,Qt/Embeded 也简称 Qte 或 Qt/E,Qte 去掉了 X Lib 的依赖而直接工作在 Framebuffer 上,而且Qte在此基础上实现了自己的窗口管理系统QWS(Qt Windows System),这是Qte与Qt/X11最大的区别。因此Qte可以在嵌入式Linux系统中没有X11库的环境下构建独立的图形用户界面,而且不会占用太多的嵌入式系统资源。 Qte为方便嵌入式Qt应用的开发,还提供qvfb工具和makeqpf工具。qvfb工具可以实现Qte的应用能在PC上进行调试和测试,避开X11库的干扰。makeqpf工具则是用来制作qpf字体文件,用来在嵌入式界面中显示特殊渲染字体。 Qtopia Qtopia 是一个基于 Qte 的类似桌面系统的应用环境,同时又为开发者为嵌入式设备编写程序提供了一套面向对象的API,包含有 PDA 版本和 Phone 版本。请注意是基于Qte 的应用环境,Qtopia 是用 Qte 这个库开发出来的应用程序,实际上Qtopia就相当于是嵌入式设备上的桌面环境,也就是类似于PC上的KDE,提供有自己的窗口管理、控制等GUI接口,简化了其上Qte应用的开发。就算不使用Qtopia也可以使用Qte创建自己的图形界面。 Qtopia早期是一个sf.net上的开源项目,构建于Qte之上。从Qt4.1开始,Qt/Embedded改名为Qtopia Core,又从Qt4.4.1开始,Qtopia Core又改名为Qt for Embedded Linux,就是现在的Qte(eveywhere)。 在ARM开发板的嵌入式linux系统上运行的QT程序,必须得要在linux里用QT编吗 嵌入式Linux应用程序开发-(1)第一个嵌入式QT应用程序 iTOP-i.MX6开发板之全能版使用手册_V2.7.1 355页 (1)QtE4.7编译器安装 1、在/usr/local建立arm文件夹,解压编译器文件到该目录下 tar -zxvf arm-linux-gcc-4.3.2.tar.gz -C /usr/local/arm 2、设置环境变量 root 用户下cd,然后输入vim ./bashrc,按i插入,在文件的最后输入 export PATH=$PATH:/usr/local/arm/4.3.2/bin 按Esc, 再输入:wq保存退出,source ./bashrc 测试一下,编译器路径设置的对不对。输入命令arm, 然后按键盘"Tab",出现编译器“arm-none-linux-gnueabi-gcc-4.3.2”,这就说明编译 器路径设置正确 arm-none-linux-gnueabi-gcc -v **报错:**bash: /usr/local/arm/4.4.1/bin/arm-none-linux-gnueabi-gcc: 没有那个文件或目录 64位的系统得安装32位的兼容程序,但用了很久一直报错没装成功,先放着,使用开发板配的虚拟机系统Ubuntu14.04 8.9 iTOP-iMX6 开发板镜像的烧写 镜像,是一种文件形式,可以把许多文件做成一个镜像文件。说到底,镜像就是源代码编译并连接以后生成的可执行文件包,把这些镜像文件烧写到开发板的存储芯片 eMMC 里,开机就可以运行了。 iMX6 可以使用 OTG 接口烧写镜像,OTG 烧写也可以叫 USB 烧写 使用了搭载好环境的Ubuntu14, 按教程文档安装好编译器和编译好qte的源码,再用网盘中给的qt creater 安装包安装qt creater,创建一个新的项目。 在项目文件夹qmake“#/opt/qt-4.7.1/bin/qmake”,出现报错找不到qmake, 把路径添加到环境变量也没用。后来直接qmake,生成了Makefile 文件,再make就生成了可执行文件,不知在开发板上能不能运行,明天再试。 关于qmake qt中qmake的详解 8.11 虚拟机安装opencv并配置qt 1、官网下载源码,选择source 2、安装必要的依赖 sudo apt-add-repository universe sudo apt-get update sudo apt-get install -y build-essential make cmake cmake-curses-gui g++ sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev 3、解压源码unzip opencv-3.1.0.zip 进入文件夹,mkdir build,再cd build, cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. 接着make,这一步需要比较久,完成后再sudo make install ,就可以使用opencv了 编译好的OpenCV库会默认安装到 /usr/local/文件夹下 编辑库连接配置文件 cd /etc/ld.so.conf.d sudo gedit opencv.conf 添加如下内容: /usr/local/lib (libopencv所在的路径,要检查一下) sudo ldconfig 添加环境变量 sudo gedit /etc/bash.bashrc 在文件最后添加 PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH 保存之后,执行 (这个路径得确认一下是不是,我的就多了一级目录x86_64-linux-gnu,加上去就可以了) source /etc/bash.bashrc 使之生效。 配置Qt工程 ***.pro文件添加 INCLUDEPATH += /usr/local/include /usr/local/include/opencv /usr/local/include/opencv2 LIBS += /usr/local/lib/x86_64-linux-gnu/libopencv_highgui.so /usr/local/lib/x86_64-linux-gnu/libopencv_core.so /usr/local/lib/x86_64-linux-gnu/libopencv_imgproc.so 试一下include头文件,没保错就可以了 #include #include 错误:error: undefined reference to `cv::imread(cv::String const&, int)' .pro里LIBS再加上 /usr/local/lib/x86_64-linux-gnu/libopencv_imgcodecs.so /usr/local/lib/x86_64-linux-gnu/libopencv_video.so ubuntu opencv imshow不可用问题 没解决 安装cmake和cmake-gui 直接将Mat 转成QImage显示 8.13 在qt上完成了相机的开启 但相机开启的过程是阻塞的,所以需要使用多线程来防止ui界面卡死。 结束捕获相机图像capture.release()后会再次开启相机会出现报错 videoio(MSMF): can't grab frame. Error: -2147483638 导致得重新拔插相机才能再次开启。 void MainWindow::playVideo() { ui->stateLabel->setText("camera openning"); qDebug( "start"); //声明视频读入类 capture=new VideoCapture(CAP_DSHOW); //从摄像头读入视频 0表示从摄像头读入 Mat cap; capture->open(0); //参数设置 capture->set(CV_CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G')); capture->set(CV_CAP_PROP_FRAME_WIDTH, 640); capture->set(CV_CAP_PROP_FRAME_HEIGHT, 480); if (capture->isOpened())//先判断是否打开摄像头 { double rate= capture->get(CV_CAP_PROP_FPS); QString s=QString(tr("is open fps %1")).arg(rate); ui->stateLabel->setText(s); *capture >> cap; if (!cap.empty()) { cv::cvtColor(cap,cap,CV_BGR2RGB); QImage img = QImage((const unsigned char*)(cap.data),cap.cols,cap.rows,QImage::Format_RGB888); ui->label->setPixmap(QPixmap::fromImage(img)); timer = new QTimer(this); timer->setInterval(1000/rate); //set timer match with FPS connect(timer, SIGNAL(timeout()), this, SLOT(nextFrame())); timer->start(); } } else qDebug("can not open camera"); } opencv直接捕获的图像为BGR格式,需转成RGB 未进行畸变校正,霍夫线检测效果不好 使用arm编译器的qt camera 项目,添加opencv的库文件后报错,原因就是这里的库文件是适用于64位的,不是arm 32能使用的,所以需要将opencv使用arm的gcc、g++编译器进行交叉编译 arm交叉编译opencv cmake-gui设置时opencL的那几项不需要勾选 opencv3.4.1 移植到 hi3559 出现很多pragma GCC diagnostic 这个错. 后面发现是gcc 版本低于4.6 . 编译弄了4、5个小时,除了上面两篇文章报的错,还出现其它一些错,我还下载了opencv3.2试了一下,结果还是出错。最后还是选回opencv3.4.6,编译器选择qte5.7的编译器的,虽然还出错, opencv-3.4.1/3rdparty/libpng/pngstruct.h:30:18: fatal error: zlib.h: No such file or directory [解决]~/opencv-3.4.1/CMakeLists.txt,打开这个文件, … ocv_include_directories(${OPENCV_CONFIG_FILE_INCLUDE_DIR}) 在这个位置 增加一行代码: ocv_include_directories(./3rdparty/zlib/) 之后就没什么错了。 编译完成,整整用了4个小时,但能顺利完成就好了 make完成之后再make install 编译opencv用到是5.4.0的arm-linux-gcc编译器,但qt version 是4.7.1,其对应的arm 编译器是4.3.2,所以编译camera_arm工程时不能识别qt的库文件,所以重新安装qte5.7和其对应的编译器arm-2014.05(开发手册368页),再用arm-2014.05编译一次opencv,应该就没问题了 QT5.7交叉编译安装到arm arm-2014.05下载链接 qtE5.7 源码下载 (选择清华的镜像下载) (1) arm-2014.05设置完毕,输入arm-none-linux-gnueabi-gcc -v 查看环境变量是否设置成功 (2)使用arm-2014.05的arm-none-linux-gnueabi-gcc和**arm-none-linux-gnueabi-g++**编译opencv源码 出现错误: error: ‘exception_ptr’ in namespace ‘std’ does not name a type 解决:这是c++ 11标准的。在给g++传递命令行的时候加上-std=c++0x就行了 在opencv源码的cmakelists.txt里加上 set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++0x”) 结果没用,最后把cmake-gui的ENABLE_CXX11取消勾选就编译完成了。。。 qt5.7源码编译完成之后我又设置好qtcreator的kit,按了绿色的三角按钮编译,报了个错, :-1: error: Could not connect to host: Timeout waiting for reply from server. Is the device connected and set up for network access? 也没搜到解决方法。我还以为是qt5.7没编译好,又重新编译了一次,也报错了。可能是我花了太久时间,头脑不清醒了,绿色的三角按钮其实是build并且执行的指令,可是编译出的文件是32位arm平台的,run肯定会报错了。只需要在菜单栏选择build all就可以生成文件了。 工程不在qt creator 编译,也可以开启终端,在工程目录执行qmake,生成MakeFile后再make也能生成可执行文件,我把文件拷到开发板上运行,提示找不到opencv的链接库。 查了一下需要将opencv需要的库复制到arm开发板上。也可以编译opencv源码时选择静态库,这样就不需要复制库文件到开发板上。 (1)opencv源码静态编译 进入opencv的源码目录,新建release-arm-static文件夹,终端中打开cmake-gui, 去掉BUILD_SHARED_LIBS的勾选,编译静态库。 编译完成,make install 右键工程名称add libraries添加编译好的静态库(我先试了手动添加,结果报了700多个函数未定义的错误),有用到的全添加,qmake 再build all,结果还是有两百多个错误 原因是交叉编译opencv源码时没有加入ljpeg 和 lpng lpthread库 只好再编译一次opencv,回到opencv源码目录release-arm-static, make uninstall,(或直接删除rm -r /usr/local/arm/opencv-arm-static)双击CMakeCache.txt文件打开cmake-gui, 把BUILD_JPEG勾上,之前只有WITH_JPEG勾上,configure再generate,重新make和make install 还需要把BUILD_PNG BUILD_TIFF勾上,就是有WITH的相应得到BUILD都得勾 最详细的arm qt5.7交叉编译环境配置 以上关于编译opencv静态库都是尝试过程,最后并没成功。 |
|
|
|
只有小组成员才能发言,加入小组>>
798 浏览 0 评论
1154 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2713 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1086浏览 3评论
195浏览 2评论
461浏览 2评论
374浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
455浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 02:57 , Processed in 1.178488 second(s), Total 50, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号