【ZYNQ-7000开发之二】QT+OpenCV的边缘检测测试

在本篇文章中,将实现在Xilinx ZYNQ上用QT+OpenCV实现显示图像,将使用OpenCV上的边缘检测算法进行演示。

本文所使用的开发板是Miz702(兼容zedboard)
PC 开发环境版本:Ubuntu12.04  32bit   Qt:4.7.0  OpenCV:2.4.9  
环境配置参考 rainysky 博客 http://www.eefocus.com/sj229335457/blog/cate_14065_0.html

zynq运行环境:精简版的ramdisk Linux文件系统

一、准备工作

本次试验需要在PC版的Linux上配置好交叉编译、qt库、opencv库等等,这些配置网上的资料已经不少了,本文将不再叙述。

二、要实现的目标

理想的效果是,只使用OpenCV,用imread读入图像,imshow显示图像,但是试了一些方法,发现,zynq上运行 imshow会出错,目前的解决方案是,把imshow要显示的图像,转化成QT上的QImage格式,显示在QLable上。
待处理的图像,美女lena
【ZYNQ-7000开发之二】QT+OpenCV的边缘检测测试_第1张图片

三、部分代码如下

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += mainwidget.h
FORMS += mainwidget.ui
SOURCES += main.cpp mainwidget.cpp
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_imgproc.so


#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


namespace Ui {
    class MainWidget;
}

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MainWidget(QWidget *parent = 0);
    QPushButton *btn;
    QLabel *srcPicLabel;
    QLabel *dstPicLabel;
    QImage *Qimg_pic;

    ~MainWidget();
public slots:
    void slot_imgshow();
private:
    Ui::MainWidget *ui;
};

#include "mainwidget.h"
#include "ui_mainwidget.h"

using namespace cv;

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

    btn = new QPushButton("edge_detection",this);
    connect(btn,SIGNAL(clicked()),this,SLOT(slot_imgshow()));
    srcPicLabel = new QLabel(this);
    dstPicLabel = new QLabel(this);

}
void MainWidget::slot_imgshow()
{

    Mat src = imread("lena.bmp");
    Mat dst;
    Mat src_gry;
  //  imshow("src",src);
    cvtColor(src, src_gry ,CV_BGR2GRAY);
    Canny(src_gry,dst,10,150,3);
  //  imshow("dst",dst);

    cvtColor(src,src,CV_BGR2RGB);
   // cvtColor(dst,dst,CV_8UC1);
    QImage Qimg_pic_src;
    QImage Qimg_pic_dst;
    Qimg_pic_src = QImage((const unsigned char*)(src.data),src.cols,src.rows,QImage::Format_RGB888);
    srcPicLabel->setPixmap(QPixmap::fromImage(Qimg_pic_src));
    srcPicLabel->resize(srcPicLabel->pixmap()->size());

    Qimg_pic_dst = QImage((const unsigned char*)(dst.data),dst.cols,dst.rows,QImage::Format_Indexed8);
    dstPicLabel->setGeometry(600,0,320,240);
    dstPicLabel->setPixmap(QPixmap::fromImage(Qimg_pic_dst));
    dstPicLabel->resize(dstPicLabel->pixmap()->size());

}

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

#endif // MAINWIDGET_H

四、测试

测试步骤:
把生成的可执行文件和图片(目前仅支持bmp,很郁闷...,很不完美)拷到SD卡里,上电,打开串口终端输入以下命令

//建立qt库的目录(要和PC版的目录一样)
mkdir   /opt/zedboard  
mkdir   /opt/zedboard/qt 
mkdir   /opt/zedboard/qt/install 

//建立opencv目录(可以和PC不一样,原因:尚不清楚)
mkdir /usr/local   
mkdir /usr/local/lib 

//挂载SD卡 opencv库 和QT库
mount /dev/mmcblk0p1  /mnt
mount /mnt/opencv_lib.img   /usr/
mount /mnt/qt_lib.img   /opt/zedboard/qt/install/
//设置环境变量
export LD_LIBRARY_PATH=/usr/

//运行程序
./edge_detec -qws

效果如图所示,上图是在ZYNQ上运行的,下图是在PC上运行的。左侧是原图,右侧是进行canny运算的结果。

【ZYNQ-7000开发之二】QT+OpenCV的边缘检测测试_第2张图片

五、结果以及存在问题

在PC上运行的结果不正确,而zynq上是正确的,至少看起来是这样的,并且PC版的每次运行背景都不同,原因不明。
下一步,研究下在桌面版的ubuntu上直接用OpenCV显示以及用HLS实现图像处理算法加速。

更多关于zynq开发相关的文章和问题请点击:
http://www.osrc.cn/forum.php?mod=forumdisplay&fid=292
http://blog.csdn.net/rzjmpb


你可能感兴趣的:(FPGA,ARM,Qt,Zynq,嵌入式,ZYNQ,OpenCV,zedboard,QT)