i.MX6开发板 嵌入式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

https://blog.csdn.net/wt881010/article/details/52947709
1、官网下载源码,选择source
https://opencv.org/releases/
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 <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

错误: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显示
https://blog.csdn.net/xingchenbingbuyu/article/details/50688378
https://www.cnblogs.com/annt/p/ant003.html

linux环境下使用V4L2及Qt设计简易照相机

8.13

在qt上完成了相机的开启
在这里插入图片描述

但相机开启的过程是阻塞的,所以需要使用多线程来防止ui界面卡死。
结束捕获相机图像capture.release()后会再次开启相机会出现报错

 videoio(MSMF): can't grab frame. Error: -2147483638

导致得重新拔插相机才能再次开启。
解决:**capture=new VideoCapture(CAP_DSHOW);**加上参数CAP_DSHOW后解决

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
Ubuntu上交叉编译opencv及opencv_contrib并移植到ARM板之一
cmake-gui设置时opencL的那几项不需要勾选

Ubuntu上交叉编译opencv及opencv_contrib并移植到ARM板之二

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
https://blog.csdn.net/u012175418/article/details/52704734
arm-2014.05下载链接
https://pan.baidu.com/s/1mgyYfos
qtE5.7 源码下载 (选择清华的镜像下载)
http://download.qt.io/archive/qt/5.7/5.7.0/single/qt-everywhere-opensource-src-5.7.0.tar.gz.mirrorlist

(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,重新makemake install
在这里插入图片描述
还需要把BUILD_PNG BUILD_TIFF勾上,就是有WITH的相应得到BUILD都得勾
最详细的arm qt5.7交叉编译环境配置

以上关于编译opencv静态库都是尝试过程,最后并没成功

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的一些心得
https://blog.csdn.net/jianwushuang/article/details/7348797

重新编译器qt4.7

在这里插入图片描述
更改configure文件,CFG_ENDIAN=Q_LITTLE_ENDIAN (小端,默认是 auto )

还是不行。。。。
在这里插入图片描述

https://my.oschina.net/zhangxu0512/blog/262275

由于编译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的库来读取相机图像,通过拔插usb相机的前后对比,得到了相机的设备号是/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: %s\n", cap.driver);
}
else
{
    printf("open file is not video\n");
    //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: %s\n", 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: %d\n",
                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系统共有的。在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值