opencv+QT在嵌入式arm下显示图片

你好!这里是风筝的博客,

欢迎和我一起交流。


之前在arm移植好了opencv:移植opencv到嵌入式arm详细过程
而且我之前也弄好了qt,刚好可以用来结合使用。
在qt里使用opencv在arm开发板显示一张图片

在qt里面创建一个工程:

#include "widget.h"
#include "ui_widget.h"

#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    IplImage* srcImage= cvLoadImage("girl.jpg");//加载图片
    cvNamedWindow("Image",1);//创建窗口
    cvShowImage("Image",srcImage);//显示图像
    cvWaitKey(0);//等待按键
    cvDestroyWindow("Image");//销毁窗口
    cvReleaseImage(&srcImage);//释放图像
}

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

很简单的例子,但是用到了opencv,所以在工程和Makefile里要进行一些修改:
修改.pro工程文件,我的工程时load_image:
vi load_image.pro
找到:

HEADERS  += widget.h

修改为:

HEADERS  += widget.h\
    /usr/local/opencv/install_opencv/lib/libopencv_core.so \
    /usr/local/opencv/install_opencv/lib/libopencv_highgui.so \
    /usr/local/opencv/install_opencv/lib/libopencv_imgproc.so \
    /usr/local/opencv/install_opencv/lib/libopencv_video.so

这些库文件,主要是用到什么就加什么。
然后再在底下添加:

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

把opencv的头文件也包含进来。

接着修改Makefile文件:
找到:

LIBS          = $(SUBLIBS) -L/work/qt/my_qt/lib -lQt5Widgets -lQt5Gui -lQt5C    ore -lpthread 

修改为:

LIBS          = $(SUBLIBS) -L/work/qt/my_qt/lib -lQt5Widgets -lQt5Gui -lQt5C    ore -lpthread -I/usr/local/opencv/install_opencv/include/opencv/ -L/usr/loca    l/opencv/install_opencv/lib/ -lopencv_core -lopencv_highgui -lrt

主要就是添加后半句话,其实在哪加无所谓,加上上去就好了。

最后make即可编译可执行文件,复制到arm开发板上,执行即可!
原图:
girl

效果图:
opencv

可以看到,使用opencv的cvShowImage函数,屏幕上面会有一个栏,不怎么好看,我们可以使用另一个办法,直接把图片用QT里的label显示,使用imread函数:
cvLoadImage和imread返回值略有差异,过去的opencv处理图像倾向使用IplImage类型。现在的opencv更倾向于将图像、矩阵等等都统一使用Mat类型上。差别不大。

#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QLabel>
#include "widget.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLabel *label_image = new QLabel(this);
    Mat srcImage1= imread("girl.jpg");//加载图片
    Mat rgbImage;
    if(!srcImage1.data)
    {
        cout << "picture error!" << endl;
    }
    cvtColor(srcImage1,rgbImage,CV_BGR2RGB);//转换颜色空间,QImage是RGB排列,而Mat 是 BGR
    QImage img=QImage((const unsigned char *)(rgbImage.data),rgbImage.cols,
                         rgbImage.rows,rgbImage.cols*rgbImage.channels(),QImage::Format_RGB888);//创建QImage对象
    label_image->setPixmap(QPixmap(QPixmap::fromImage(img)));
    label_image->resize(label_image->pixmap()->size());
    label_image->move(0,0);
}

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

得出的效果图就没有边框了:
这里写图片描述
不过这个也有个缺点,图片小时,不能填满屏幕,就看到左边是缺的黑框了
后来,我又发现个问题,QImage是RGB,所以我用了cvtColor做转换,那要是我想使用灰度图呢?
cvtColor(srcImage, srcImage, CV_BGR2GRAY);//转为灰度图
那转为灰度图了就不是RGB了。就不能使用QImage显示了,
所以得用第一个那个程序,
IplImage* srcImage= cvLoadImage(“girl.jpg”);//加载图片
修改为:
Mat srcImage= imread(“girl.jpg”);//加载图片
接着:
cvShowImage(“Image”,srcImage);//显示图像
修改为:
imshow(“Image”,srcImage);//显示图像
最后,
cvReleaseImage(&srcImage);//释放图像
修改为:
srcImage.release();
即可。
这样就能使用cvtColor处理了

或者不改,直接:

//转变为灰度图  
    IplImage *Grayimage = cvCreateImage(cvGetSize(srcImage),IPL_DEPTH_8U, 1);  
    cvCvtColor(srcImage,Grayimage,CV_BGR2GRAY);
  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
在使用OpenCVQt进行图片ROI放大时,可以按照以下步骤进行处理。 1. 首先,导入必要的头文件,并加载图像文件。 ```c++ #include <opencv2/opencv.hpp> #include <QImage> using namespace cv; using namespace std; int main() { Mat image = imread("image.jpg"); ... } ``` 2. 接下来,定义ROI(感兴趣区域)并执行放大操作。我们可以使用OpenCV的函数resize来调整ROI的大小。 ```c++ Rect roi(100, 100, 200, 200); // 定义感兴趣区域的坐标和大小 Mat roiImage = image(roi); // 提取感兴趣区域 int newWidth = 400; int newHeight = 400; Mat resizedImage; resize(roiImage, resizedImage, Size(newWidth, newHeight), 0, 0, INTER_LINEAR); // 放大图像 ``` 3. 最后,将放大后的图像转换为Qt的QImage格式,以便在Qt界面上显示。 ```c++ QImage qImage(resizedImage.data, resizedImage.cols, resizedImage.rows, resizedImage.step, QImage::Format_RGB888); // 将Mat转换为QImage ``` 完整的处理过程如下所示: ```c++ #include <opencv2/opencv.hpp> #include <QImage> using namespace cv; using namespace std; int main() { Mat image = imread("image.jpg"); Rect roi(100, 100, 200, 200); // 定义感兴趣区域的坐标和大小 Mat roiImage = image(roi); // 提取感兴趣区域 int newWidth = 400; int newHeight = 400; Mat resizedImage; resize(roiImage, resizedImage, Size(newWidth, newHeight), 0, 0, INTER_LINEAR); // 放大图像 QImage qImage(resizedImage.data, resizedImage.cols, resizedImage.rows, resizedImage.step, QImage::Format_RGB888); // 将Mat转换为QImage // 在这里可以使用Qt的图像显示控件显示QImage ... return 0; } ``` 这样,通过使用OpenCVQt,我们可以方便地实现图像ROI的放大操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值