您的位置:首页 > 编程语言 > Qt开发

Arm下使用Qt和Opencv进行图像处理的入门例程和遇到的问题

2014-08-27 10:59 821 查看
费了9牛2虎之力,终于把Qt和Opencv给移植到了Arm开发板中,下面就可以开始进行初步的图像处理工作了。

下面是一个图像处理最初步的将图像转化为灰度图并进行显示的例程,可以用来测试Qt和Opencv的移植是否成功。

1 彩图转灰度图的例程

在qtcreator中建立一个Qt Widgets Application,


先在QT项目文件中将opencv的头文件和库的路径包含进去,如下图所示:



下面是头文件widget.h的代码:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPixmap>
#include <QHBoxLayout>

#include "cv.h"
#include "highgui.h"

class Widget : public QWidget
{
Q_OBJECT

public:
Widget(QWidget *parent = 0);
~Widget();

private:
IplImage *img,*img_gray;
QImage *qmg;
QLabel *label;

};

#endif // WIDGET_H


源文件widget.cpp的代码:

#include "widget.h"

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QWidget *window = new QWidget;
window->setWindowTitle("Image");

img = cvLoadImage("test.JPG");
img_gray = cvCreateImage(cvGetSize(img),8,1);
cvCvtColor(img,img_gray,CV_BGR2GRAY);
qmg = new QImage((unsigned char*)img_gray->imageData,img_gray->width,
img_gray->height,img_gray->widthStep,
QImage::Format_Indexed8);

label = new QLabel();
label->setPixmap(QPixmap::fromImage(*qmg));
label->setScaledContents(true);
label->resize(this->size());

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(label);
window->setLayout(layout);

window->show();

}

Widget::~Widget()
{
cvReleaseImage( &img );
}


主程序main.cpp的代码:

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;

return a.exec();
}


点击左下角的Run,便可以将图像转化为灰度图



2 遇到的问题

接着说一下目前遇到的一些问题:

1. jpg格式的图片无法显示的问题

一开始程序怎么都显示不出结果,只弹出一个空白的对话框,后面用png格式的图片测试显示成功,才发现是jpg格式图片的支持出问题啦,解决办法是:

编译QT的时候需要选择参数"-qt-libjpg" ,然后在开发板的环境变量中要指定plugin插件的路径“export set QT_PLUGIN_PATH=$QTDIR/plugins”,之前我就是因为少了这句所以无法支持jpg格式图片的显示。

2. 开发板无法读取摄像头

在ubuntu上写好的程序,能够打开电脑上自带的摄像头,但是交叉编译到开发板中运行却报错:

HIGHGUI ERROR : V4L: device /dev/video0: Unable to query number of channels

Segmentation fault

这个问题目前还不知道怎么解决,希望知道的朋友告知一下。

目前的猜测是因为程序中用到了opencv的cvCreateCameraCapture()函数,好像这个函数是属于头文件highgui.h里面的? arm开发板对highgui.h里面的函数好像都不怎么支持(但是cvLoadImage可以使用),为什么会这样我也弄不明白,希望高人指点一下。

现在可能的解决办法只有放弃使用opencv的cvCreateCameraCapture()函数,自己用V4L2协议写一个读取摄像头输出数据的程序了,但是V4L2感觉蛮复杂的,等弄明白了再来补充。

3. 开发板运行程序时找不到.so文件

这是因为在电脑上交叉编译程序时,QT中设置的.so文件的路径使电脑中的路径,所以开发板中的.so文件也要放在同样的路径中,这样程序的可执行文件才能按照这个路径在开发板中查找到所需的.so文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: