本文所使用的开发板是Miz702(兼容zedboard)
PC 开发环境版本:Ubuntu12.04 32bit Qt:4.7.0 OpenCV:2.4.9
环境配置参考 rainysky 博客 http://www.****.com/sj229335457/blog/cate_14065_0.html
zynq运行环境:精简版的ramdisk Linux文件系统
一、准备工作本次试验需要在PC版的Linux上配置好交叉编译、qt库、opencv库等等,这些配置网上的资料已经不少了,本文将不再叙述。
二、要实现的目标理想的效果是,只使用OpenCV,用imread读入图像,imshow显示图像,但是试了一些方法,发现,zynq上运行 imshow会出错,目前的解决方案是,把imshow要显示的图像,转化成QT上的QImage格式,显示在QLable上。
待处理的图像,美女lena
三、部分代码如下[cpp] view plain copy
- 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 <QWidget>
- #include <QPushButton>
- #include <QLabel>
- #include <QImage>
- #include <iostream>
- #include <opencv2/imgproc/imgproc_c.h>
- #include <opencv2/legacy/legacy.hpp>
- #include <opencv2/highgui/highgui.hpp>
- 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卡里,上电,打开串口终端输入以下命令
[plain] view plain copy
- //建立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实现图像处理算法加速。