[X]关闭

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

文档创建者:RZJM
浏览次数:13000
最后更新:2017-03-13
本帖最后由 RZJM 于 2015-11-29 11:01 编辑

在本篇文章中,将实现在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



三、部分代码如下
  1. TEMPLATE = app
  2. TARGET =
  3. DEPENDPATH += .
  4. INCLUDEPATH += .
  5. # Input
  6. HEADERS += mainwidget.h
  7. FORMS += mainwidget.ui
  8. SOURCES += main.cpp mainwidget.cpp
  9. INCLUDEPATH += /usr/local/include \
  10.                 /usr/local/include/opencv \
  11.                 /usr/local/include/opencv2
  12. LIBS += /usr/local/lib/libopencv_highgui.so \
  13.         /usr/local/lib/libopencv_core.so    \
  14.         /usr/local/lib/libopencv_imgproc.so
复制代码
  1. #ifndef MAINWIDGET_H
  2. #define MAINWIDGET_H
  3. #include <QWidget>
  4. #include <QPushButton>
  5. #include <QLabel>
  6. #include <QImage>
  7. #include <iostream>
  8. #include <opencv2/imgproc/imgproc_c.h>
  9. #include <opencv2/legacy/legacy.hpp>
  10. #include <opencv2/highgui/highgui.hpp>
  11. namespace Ui {
  12.     class MainWidget;
  13. }
  14. class MainWidget : public QWidget
  15. {
  16.     Q_OBJECT
  17. public:
  18.     explicit MainWidget(QWidget *parent = 0);
  19.     QPushButton *btn;
  20.     QLabel *srcPicLabel;
  21.     QLabel *dstPicLabel;
  22.     QImage *Qimg_pic;
  23.     ~MainWidget();
  24. public slots:
  25.     void slot_imgshow();
  26. private:
  27.     Ui::MainWidget *ui;
  28. };
  29. #endif // MAINWIDGET_H
复制代码


  1. #include "mainwidget.h"
  2. #include "ui_mainwidget.h"
  3. using namespace cv;
  4. MainWidget::MainWidget(QWidget *parent) :
  5.     QWidget(parent),
  6.     ui(new Ui::MainWidget)
  7. {
  8.     ui->setupUi(this);
  9.     btn = new QPushButton("edge_detection",this);
  10.     connect(btn,SIGNAL(clicked()),this,SLOT(slot_imgshow()));
  11.     srcPicLabel = new QLabel(this);
  12.     dstPicLabel = new QLabel(this);
  13. }
  14. void MainWidget::slot_imgshow()
  15. {
  16.     Mat src = imread("lena.bmp");
  17.     Mat dst;
  18.     Mat src_gry;
  19.   //  imshow("src",src);
  20.     cvtColor(src, src_gry ,CV_BGR2GRAY);
  21.     Canny(src_gry,dst,10,150,3);
  22.   //  imshow("dst",dst);
  23.     cvtColor(src,src,CV_BGR2RGB);
  24.    // cvtColor(dst,dst,CV_8UC1);
  25.     QImage Qimg_pic_src;
  26.     QImage Qimg_pic_dst;
  27.     Qimg_pic_src = QImage((const unsigned char*)(src.data),
  28.                       src.cols,src.rows,QImage::Format_RGB888);
  29.     srcPicLabel->setPixmap(QPixmap::fromImage(Qimg_pic_src));
  30.     srcPicLabel->resize(srcPicLabel->pixmap()->size());
  31.     Qimg_pic_dst = QImage((const unsigned char*)(dst.data),
  32.                           dst.cols,dst.rows,QImage::Format_Indexed8);
  33.     dstPicLabel->setGeometry(600,0,320,240);
  34.     dstPicLabel->setPixmap(QPixmap::fromImage(Qimg_pic_dst));
  35.     dstPicLabel->resize(dstPicLabel->pixmap()->size());
  36. }
  37. MainWidget::~MainWidget()
  38. {
  39.     delete ui;
  40. }
复制代码



四、测试测试步骤


把生成的可执行文件和图片(目前仅支持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运算的结果。





五、结果以及存在问题



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












发表评论已发布 5

uisrc

发表于 2015-11-28 23:43:38 | 显示全部楼层

进展很快,版主威武:dizzy:
越努力越幸运!加油!

Li2015

发表于 2016-3-17 15:55:04 | 显示全部楼层

这个例程必须要在Linux系统下做么?

RZJM

发表于 2016-3-17 19:54:15 | 显示全部楼层

Li2015 发表于 2016-3-17 15:55
这个例程必须要在Linux系统下做么?

是的

JeeheN

发表于 2016-6-8 16:29:16 | 显示全部楼层

用的是vivado搭建的硬件工程吗?还是采用的是官方oob工程?

wangleihit

发表于 2017-3-13 16:32:10 | 显示全部楼层

平台是怎么搭建的,想看博主写教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则