刚刚在vs上装好了QT和Opencv,试一下效果把。

我简单的创建了一个label,然后使用Opencv导入图像,因为Opencv导入图像是MAT格式的,在使用Qt的时候我们要把导入的图像转换成Qimage类型的。

所以,我写了一个转换函数。

QImage QtGuiApplication1::cvMat2QImage(const Mat& mat)    // Mat 改成 QImage
{
if (mat.type() == CV_8UC1) // 单通道
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
image.setColorCount(256); // 灰度级数256
for (int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
uchar *pSrc = mat.data; // 复制mat数据
for (int row = 0; row < mat.rows; row++)
{
uchar *pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
} else if (mat.type() == CV_8UC3) // 3通道
{
const uchar *pSrc = (const uchar*)mat.data; // 复制像素
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); // R, G, B 对应 0,1,2
return image.rgbSwapped(); // rgbSwapped是为了显示效果色彩好一些。
}
else if (mat.type() == CV_8UC4)
{
const uchar *pSrc = (const uchar*)mat.data; // 复制像素
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32); // B,G,R,A 对应 0,1,2,3
return image.copy();
}
else
{
return QImage();
}
}

  

之后就是简单的创建一个label。并把转换成Qimage的图片放在label里面。

下面放出完整的代码。

以下是h文件

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication1.h"
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
#include "qimage.h" #include <QFileDialog>
#include <QLabel> using namespace cv; //OpenCV命名空间 class QtGuiApplication1 : public QMainWindow
{
Q_OBJECT public:
QtGuiApplication1(QWidget *parent = Q_NULLPTR);
QLabel *label; private:
Ui::QtGuiApplication1Class ui;
QImage cvMat2QImage(const Mat & mat);
Mat QImage2cvMat(QImage image); };

  以下是Cpp文件

#include "MainWindow.h"

using namespace cv;

QtGuiApplication1::QtGuiApplication1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
this->setFixedSize(200, 300);
Mat srcImage = imread("G:\\picture\\123456789.jpg");//读取图片数据
label = new QLabel(this);
label->setGeometry(QRect(10,10,180,280));
QImage disImage = cvMat2QImage(srcImage);
label->setPixmap(QPixmap::fromImage(disImage.scaled(label->size(), Qt::KeepAspectRatio)));//显示图像 } QImage QtGuiApplication1::cvMat2QImage(const Mat& mat) // Mat 改成 QImage
{
if (mat.type() == CV_8UC1) // 单通道
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
image.setColorCount(256); // 灰度级数256
for (int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
uchar *pSrc = mat.data; // 复制mat数据
for (int row = 0; row < mat.rows; row++)
{
uchar *pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
} else if (mat.type() == CV_8UC3) // 3通道
{
const uchar *pSrc = (const uchar*)mat.data; // 复制像素
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); // R, G, B 对应 0,1,2
return image.rgbSwapped(); // rgbSwapped是为了显示效果色彩好一些。
}
else if (mat.type() == CV_8UC4)
{
const uchar *pSrc = (const uchar*)mat.data; // 复制像素
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32); // B,G,R,A 对应 0,1,2,3
return image.copy();
}
else
{
return QImage();
}
} Mat QtGuiApplication1::QImage2cvMat(QImage image) // QImage改成Mat
{
Mat mat;
switch (image.format())
{
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
mat = Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
break;
case QImage::Format_RGB888:
mat = Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
cv::cvtColor(mat, mat, CV_BGR2RGB);
break;
case QImage::Format_Indexed8:
mat = Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat;
}

 

 运行Main文件之后,可以得到下面的结果

一个简单的测试opencv和qt的程序就完成啦。

Opencv与Qt (一)之运行测试读取图片的更多相关文章

  1. opencv用imread( argv[1], 1)读取图片

    显示一幅图:主要是运用功能:imread namedWindow imshowimread:从字面意思我们就可以看懂,用来读取图片的:namedWindow:显然,我们也可以看到这是用来命名窗口名称的 ...

  2. opencv图像处理时使用stringstream批量读取图片,处理后并保存

    简介: 同文件输入输出流一样,使用stringstream可以批量读取图片,处理后并进行保存.因为C++中头文件 stringstream既可以从string读数据也可向string写数据,利于其这个 ...

  3. [python3.6+opencv] 01 完成读取图片操作

    学习一下opencv3 奈何vs2017配的云里雾里,还是使用python吧 --人生苦短,python来凑 --使用Pycharm操作,面向界面的Pycharm好一些吧(我猜的) 新建Project ...

  4. [OpenCV] 1、读取图片

    >_<" 安装及配置请看http://www.cnblogs.com/zjutlitao/p/4042074.html >_<" 这篇是一个简单的在VS20 ...

  5. TensorFlow与OpenCV,读取图片,进行简单操作并显示

    TensorFlow与OpenCV,读取图片,进行简单操作并显示 1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后openc ...

  6. OpenGL——OpenCV与SOIL读取图片进行纹理贴图

    使用OpenCV读取图片代码如下 img = imread(m_fileName); if (img.empty()) { fprintf(stderr, "Can not load ima ...

  7. opencv学习之路(3)、批量读取图片、视频分解、视频合成

    一.批量有序读取图片 #include<opencv2/opencv.hpp> using namespace cv; void main() { //批量读取图片(有序) ]; ]; M ...

  8. opencv批量读取图片

    #include<opencv2/opencv.hpp>using namespace cv;using namespace std;int main(){    int num=4;// ...

  9. opencv图像处理时使用文件输入流ifstream批量读取图片

    简介: 在利用opencv进行图像处理时,通常需要批量读取图片,然后做相应的处理,我们可以用C++文件的输入流来进行图片的读取,这要求我们应该事先,将图片图片名生成txt文件,具体请参见之前的博文[u ...

随机推荐

  1. ViewpageWebview

    import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bund ...

  2. 使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范

    使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范 StyleCop 可以帮助强制执行代码格式化规范,ReSharper 可以帮助你更高效地编写代码.把两者结合起来,你便能高效地 ...

  3. 闲记 单元格与单元格之间的边 ///字体属性都是font开头,除了颜色属性 ///文本属性都是text开的,除了设置行高。

    这两天一直在做网页没有什么太大的问题,期间也考了一场试,对答案的时候老师讲了一些小知识,因此来记录一下. 单元格与单元格之间的边距(cellspaling) list-type-image可以使用图像 ...

  4. 网络编程一定要看过的socket另一座大山

    上次的socket还有很多坑.但是总是在不断的改进的.下面就来看看一个升级版的内容 import socket server = socket.socket() ip_port = ("19 ...

  5. 学习笔记(三)--Lucene分词器详解

    Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...

  6. 使用Postfix与Dovecot部署邮件系统

  7. softmax 损失函数求导过程

    前言:softmax中的求导包含矩阵与向量的求导关系,记录的目的是为了回顾. 下图为利用softmax对样本进行k分类的问题,其损失函数的表达式为结构风险,第二项是模型结构的正则化项. 首先,每个qu ...

  8. Java BitSet解决海量数据去重

    先提一个问题,怎么在40亿个整数中找到那个唯一重复的数字? 第一想法就是Set的不可重复性,依次把每个数字放入HashSet中,当放不去进去的时候说明这就是重复的数字,输出这个数字. if(hs.co ...

  9. 2018-2019-2 20175202实验二《Java面向对象程序设计》实验报告

    2018-2019-2 20175202实验二<Java面向对象程序设计>实验报告 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初 ...

  10. mysql 视图 安全性( mysql 表能读,但是视图不能读问题 )

    安全性: 有两个选项 Definer:定义者 , 定义者有什么权限 ,访问视图的人就有什么权限 Invoker: 调用者  ,根据调用这个视图的当前用户来决定 有什么权限 采坑: 项目中有个复杂查询. ...