重点:arm-linux-gcc 建议使用4.8以上的版本来支持-std=C++11

第一:先编译opencv的第三方库和源码移植到arm板上

系统版本:Ubuntu16.04
版本:opencv3.2.0
获得opencv在arm板上的库和第三方在arm上的库
推荐楷尘·极客的:opencv移植arm全过程四部曲
https://blog.csdn.net/KayChanGEEK/article/details/78543779
配套其提供的第三方依赖包更佳
https://download.csdn.net/download/kaychangeek/10120278
64位的编译第三方库时要将编译后的库放在/usr/local 的子目录下,放在其他地方有可能会编译失败

第二:在Linux中安装qt

qt源码下载:http://download.qt.io/archive/qt/
我下载的版本:
qt-opensource-linux-x64-5.4.0.run 安装在Linux上的

第三:编译qt移植到arm开发板上

我下载的版本是:
qt-everywhere-opensource-src-5.3.1.tar.xz 移植到arm上的板子

qt移植arm板是个坑啊,花了我很长的时间,下面这个教程我先后下载了qt5.4.0和qt5.12.0的出现了

  1. recipe for target ‘verifyspec.o’ failed
  2. error: unrecognized command line option “-std=gnu++11” > Makefile:168: recip
    等错误,没有解决,下载了qt5.3.1后就没有错误了,可能是之前有操作失误没有发现。

华清远见:QT 5.3开发及移植(2)
http://emb.hqyj.com/Column/3766.html
慢慢等待make我花了一个多钟

或者
大水猫:【TINY4412】QT5移植笔记:(2)QT5.7移植到Linux
https://blog.csdn.net/sinat_20006769/article/details/79081154

建议使用Qt5.7版本的。

第四:opencv+qt的结合在Linux上运行

编译获得opencv在linux下的库
推荐墨客墨客:Ubuntu14.04下Qt5+opencv3.0安装和配置
https://blog.csdn.net/u011831771/article/details/78482306
若出现运行程序时出现error while loading shared libraries的问题请参考
https://blog.csdn.net/weixin_41215479/article/details/88628625

qt使用其他人已经编译好的其他版本的qt库,出现qt没有被正确的安装,请运行make install,请参考:
https://blog.csdn.net/liukang325/article/details/53407401
使用其他人的库,不知道行不行。可自行尝试,我没有试过

opencv +qt在Linux上的测试用例
创建一个Qwidget

demo.pro

#-------------------------------------------------
#
# Project created by QtCreator 2019-03-17T06:02:00
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = demo2
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui


INCLUDEPATH += /usr/local/include \
                /usr/local/include/opencv \
                /usr/local/include/opencv2

LIBS += /usr/local/lib/libopencv_highgui.so \
        /usr/local/lib/libopencv_core.so \
        /usr/local/lib/libopencv_highgui.so \
        /usr/local/lib/libopencv_imgcodecs.so.3.2 \
        /usr/local/lib/libopencv_highgui.so.3.2

widget.h和widget.cpp 不改变

main.cpp

#include "widget.h"
#include <QApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;

int main()
{
    namedWindow( "src", WINDOW_AUTOSIZE );
    Mat src1 = imread( "/mnt/hgfs/share/1.jpg" );
    while(1)
    {
        imshow( "src", src1 );
        char c = waitKey(30);
        if( 27==c )
            return 0;
    }

}

出现The program has unexpectedly finished.的错误是因为图片路径问题。
在这里插入图片描述

第五:Qt+opencv arm版在板子上运行

添加arm版本的qt到qt应用中。atm版本的qt库在第三步中得到

遥_望:linux下如何利用QtCreator编译ARM版本的Qt程序
https://blog.csdn.net/yaowangII/article/details/78552083

arm版本的qt+arm版本的opencv在板子上运行测试用例

arm上使用opencv,如果用cvnamedwindow显示,自带的的窗口依赖gtk,可以用qt的label控件显示,先将Mat转成QImage,然后显示在label就可以了。
思路:Mat–QImage–QPixmap–QLabel

创建Qwidget

arm_demo.pro

#-------------------------------------------------
#
# Project created by QtCreator 2019-03-19T05:42:55
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = display_mat
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui




INCLUDEPATH += /opt/opencv_arm/opencv-3.2.0/output/include \
                /opt/opencv_arm/opencv-3.2.0/output/include/opencv \
                /opt/opencv_arm/opencv-3.2.0/output/include/opencv2

LIBS += /opt/opencv_arm/opencv-3.2.0/output/lib/libopencv_highgui.so \
        /opt/opencv_arm/opencv-3.2.0/output/lib/libopencv_core.so \
        /opt/opencv_arm/opencv-3.2.0/output/lib/libopencv_imgcodecs.so.3.2.0 \
        /opt/opencv_arm/opencv-3.2.0/output/lib/libopencv_videoio.so.3.2 \
        /opt/opencv_arm/opencv-3.2.0/output/lib/libopencv_imgproc.so.3.2 \

widget.h和main.cpp不改变
widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    Mat Img;
    Img = imread("1.jpg");
    cvtColor(Img,Img,CV_BGR2RGB);
    ui->label->setPixmap(QPixmap::fromImage(QImage(Img.data,Img.cols,Img.rows,Img.cols*Img.channels(),QImage::Format_RGB888)));
}

Widget::~Widget()
{
    delete ui;
}

在widget.ui上拖拽一个label控件:objectName:label
当显示出下面这句话时就显示成功了
在这里插入图片描述
Failed to start program. Path or permissions wrong?

回到工程的build-arm_demo-ARM-Debug 目录
file arm_demo ,显示就是ARM文件,可将其拷贝到开发板上运行。
在这里插入图片描述

总结:其实第四步是可以不用做的,只是因为你用arm版本的qt在qt应用上是没有界面显示的,成功只会显示:Failed to start program. Path or permissions wrong?,需要把可执行程序拷贝到板子上。但第四步运行出来的程序是有界面显示的,就不必每次都把程序拷贝到板子上,第四步执行成功的程序不能直接运行在板子上,还是要换成arm版本的qt来运行才能下载到板子上。因为这两者之间就库和编译工具的不同。

Logo

更多推荐