QT+OpenCV综合示例:载入、读取图片

QT+OpenCV综合示例:载入、读取图片

    • 1、代码:
    • 2、运行结果:

下载1
GitHub:
下载2

1、代码:

1)opencv_imwrite_Q.pro 添加:

INCLUDEPATH+= D:\opencv-3.1.0\opencv\build\includewin32:CONFIG(release, debug|release): LIBS += -LD:/opencv-3.1.0/opencv/build/x64/vc12/lib/ -lopencv_world310
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/opencv-3.1.0/opencv/build/x64/vc12/lib/ -lopencv_world310d
else:unix: LIBS += -LD:/opencv-3.1.0/opencv/build/x64/vc12/lib/ -lopencv_world310INCLUDEPATH += D:/opencv-3.1.0/opencv/build/x64/vc12
DEPENDPATH += D:/opencv-3.1.0/opencv/build/x64/vc12

2)主函数 main.cpp 添加:

#include "Widget_op.h"
#include <QApplication>
#include <QCoreApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget_op w;w.show();return a.exec();
}

3)Widget_op.h (主窗口头文件)添加:

#ifdef WIN32
#pragma execution_character_set("utf-8")
#endif
#ifndef WIDGET_OP_H
#define WIDGET_OP_H#include <QWidget>
#include <QImage>
#include <QLabel>#include "mylabel.h"
#include <opencv2/opencv.hpp>namespace Ui {
class Widget_op;
}class Widget_op : public QWidget
{Q_OBJECTpublic:explicit Widget_op(QWidget *parent = 0);~Widget_op();private slots:void on_pushButton_1_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_4_clicked();void on_pushButton_5_clicked();void on_myLabel_1_clicked();void on_myLabel_2_clicked();private:Ui::Widget_op *ui;private:QImage MatToQImage(const cv::Mat& mat);				// MAT类型 转 QImage类型void display_MatInQT(QLabel* label,cv::Mat mat);	// MAT对象 QT显示private:cv::Mat mat_origin;cv::Mat mat_logo;cv::Mat mat_add;cv::Mat mat_Gaussian;
};#endif // WIDGET_OP_H

4)Widget_op.cpp (主窗口源文件)添加:
4.1)Mat转QImage 函数:

QImage Widget_op::MatToQImage(const cv::Mat& mat)
{// 8-bits unsigned, NO. OF CHANNELS = 1if(mat.type() == CV_8UC1){QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);// Set the color table (used to translate colour indexes to qRgb values)image.setColorCount(256);for(int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}// Copy input Matuchar *pSrc = mat.data;for(int row = 0; row < mat.rows; row ++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);pSrc += mat.step;}return image;}// 8-bits unsigned, NO. OF CHANNELS = 3else if(mat.type() == CV_8UC3){// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, (int)mat.step, QImage::Format_RGB888);return image.rgbSwapped();}else if(mat.type() == CV_8UC4){//qDebug() << "CV_8UC4";// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, (int)mat.step, QImage::Format_ARGB32);return image.copy();}else{//qDebug() << "ERROR: Mat could not be converted to QImage.";return QImage();}
}

4.2)MAT 显示于 QT函数:

// 
void Widget_op::display_MatInQT(QLabel* label,Mat mat)
{//        QImage image=MatToQImage(mat_1);//        QPixmap pix_temp= QPixmap::fromImage(image);//        QPixmap pix =pix_temp.scaled(ui->label_1->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);//        ui->label_1->setPixmap(pix);label->setPixmap(QPixmap::fromImage(MatToQImage(mat)).scaled(label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));//        // 通过 Graphics View 方式打开图片//        QGraphicsScene *scene = new QGraphicsScene; // 创建图形视图场景对象//        scene->addPixmap(QPixmap::fromImage(MatToQImage(mat_origin)));  // 添加pixmap//        ui->graphicsView->setScene(scene);//        ui->graphicsView->show();
}
#include "Widget_op.h"
#include "ui_Widget_op.h"#include <QFileDialog>
#include <QMessageBox>using namespace cv;Widget_op::Widget_op(QWidget *parent) :QWidget(parent),ui(new Ui::Widget_op)
{ui->setupUi(this);// 关联信号和槽QObject::connect(ui->label_1, &myLabel::clicked, this, &Widget_op::on_myLabel_1_clicked);QObject::connect(ui->label_2, &myLabel::clicked, this, &Widget_op::on_myLabel_2_clicked);// 窗口固定尺寸this->setFixedSize(900,675);//设置窗口的标题栏只有关闭、最小化的按钮// 置顶窗口,不抢焦点this->setWindowFlags(Qt::WindowCloseButtonHint |Qt::WindowMinimizeButtonHint |Qt::WindowStaysOnTopHint);ui->label_1->setText(tr("点击加载图片..."));ui->label_1->setFont(QFont("微软雅黑",20,QFont::Bold,true));ui->label_1->setStyleSheet("color:blue; background-color:lightGray;");//设置文本颜色+背景颜色(前景色)ui->label_2->setText(tr("点击加载图片..."));ui->label_2->setFont(QFont("微软雅黑",20,QFont::Bold,true));ui->label_2->setStyleSheet("color:blue; background-color:lightGray;");//设置文本颜色+背景颜色(前景色)ui->label_3->setStyleSheet("background-color:lightGray;");ui->label_4->setStyleSheet("background-color:lightGray;");ui->pushButton_3->setEnabled(false);ui->pushButton_4->setEnabled(false);ui->pushButton_5->setEnabled(false);}Widget_op::~Widget_op()
{delete ui;
}// 打开显示 mat_1
void Widget_op::on_pushButton_1_clicked()
{QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),"F:/C++/2. OPENCV 3.1.0/opencv_imwrite_Q", tr("图片文件(*.png *.jpg *.jpeg *.bmp *.tif *.tiff);;所有文件(*)"));if(!fileName.isEmpty()){mat_origin= imread(fileName.toLocal8Bit().data());if(mat_origin.data){// 通过 lable 方式显示图片display_MatInQT( ui->label_1,mat_origin);}else{QMessageBox::information(this, tr("提示"),tr("未成功载入图片!"), QMessageBox::Ok);}}
}// 打开显示 mat_2
void Widget_op::on_pushButton_2_clicked()
{QString fileName = QFileDialog::getOpenFileName(this, tr("文件对话框"),"F:/C++/2. OPENCV 3.1.0/opencv_imwrite_Q", tr("图片文件(*.png *.jpg *.jpeg *.bmp *.tif *.tiff);;所有文件(*)"));if(!fileName.isEmpty()){mat_logo = imread(fileName.toLocal8Bit().data(),1); // 总是转换图像到彩色图,在返回if(mat_logo.data){display_MatInQT( ui->label_2,mat_logo);}else{QMessageBox::information(this, tr("提示"),tr("未成功载入图片!"), QMessageBox::Ok);}}if(mat_origin.data&&mat_logo.data){ui->pushButton_3->setEnabled(true);ui->pushButton_5->setEnabled(true);}
}// 混合 mat_1和mat_2 并显示
void Widget_op::on_pushButton_3_clicked()
{if(!mat_add.data){if(mat_origin.data&&mat_logo.data){mat_add=mat_origin.clone();Mat imageROI = mat_add(Rect(800, 350, mat_logo.cols,mat_logo.rows));// 加权混合if(imageROI.type()==mat_logo.type()){addWeighted(imageROI, 0.5, mat_logo, 0.3, 0.0, imageROI);display_MatInQT(ui->label_3,mat_add);}else{QMessageBox::information(this, tr("提示"),tr("类型不同,无法混合!"), QMessageBox::Ok);}ui->pushButton_4->setEnabled(true);}else{QMessageBox::critical(this, tr("错误"),tr("未成功载入Mat1和Mat2!"), QMessageBox::Ok);}}
}// 图像处理:高斯滤波(模糊)
void Widget_op::on_pushButton_5_clicked()
{if(!mat_Gaussian.data){if(mat_add.data){// 高斯模糊GaussianBlur(mat_add,mat_Gaussian,Size(29,29),0,0);display_MatInQT(ui->label_4,mat_Gaussian);}else{QMessageBox::information(this, tr("提示"),tr("未成功载入加权混合图片!"), QMessageBox::Ok);}}
}// 保存文件
void Widget_op::on_pushButton_4_clicked()
{if(mat_add.data){QString filename = QFileDialog::getSaveFileName(this,tr("保存对话框"),"F:/C++/2. OPENCV 3.1.0/opencv_imwrite_Q",tr("*.jpg;; *.bmp;; *.png;; *.tif;; *.GIF"));if(!filename.isEmpty()){imwrite(filename.toLocal8Bit().data(),mat_add);}}else{QMessageBox::information(this, tr("提示"),tr("未处理完图片!"), QMessageBox::Ok);}
}// 点击标签1
void Widget_op::on_myLabel_1_clicked()
{// 触发 按钮1 点击事件ui->pushButton_1->click();
}// 点击标签2
void Widget_op::on_myLabel_2_clicked()
{// 触发 按钮2 点击事件ui->pushButton_2->click();
}

5)mylabel.h (自定义QLabel类头文件) 添加:

#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
#include <QMouseEvent>class myLabel : public QLabel
{Q_OBJECT
public:explicit myLabel(QWidget *parent = 0);protected:virtual void mousePressEvent(QMouseEvent *event);signals:void clicked(void); // 声明鼠标左击中信号};#endif // MYLABEL_H

6)mylabel.cpp (自定义QLabel类源文件)添加:

#include "mylabel.h"
#include <QMessageBox>myLabel::myLabel(QWidget *parent):QLabel(parent)
{}void myLabel::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){emit clicked();	// 发射信号}
}

6)Widget_op.ui (界面文件)设计:
在这里插入图片描述

2、运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“算法战:DARPA下一代人工智能计划初见成效” 背景分析与初步研判

2018年9月&#xff0c;美国国防高级研究计划局&#xff08;DARPA&#xff09;宣布将出资20亿美元,用于开发新的人工智能技术。近日&#xff0c;DARPA副局长彼得海纳姆在华盛顿接受记者采访时说&#xff0c;DARPA的“下一代人工智能”&#xff08;AI Next&#xff09;计划在实施…

OpenCV学习笔记(十一):阈值化:threshold(),adaptivethreshold()

OpenCV学习笔记&#xff08;十一&#xff09;&#xff1a;阈值化&#xff1a;threshold(),adaptivethreshold() 一、定义&#xff1a; 1&#xff09;固定阈值操作 double threshold( InputArray src, // 输入图像&#xff0c;单通道 OutputArray dst, // 输出图像 double…

北京邮电大学刘伟教授:人机融合与混合智能的新应用场景

前言&#xff1a;本文是北京邮电大学人机交互与认知工程实验室主任、科技委人机融合智能组首席科学家刘伟教授就混合智能的产生、起源和新应用场景所做的深度阐述。第一部分是刘伟老师从新书《崛起的超级智能&#xff1a;互联网大脑如何影响科技未来》延伸的关于人机融合的思考…

VC++6.0怎么打开工程

点击文件→打开&#xff0c;选择工程所在文件夹&#xff0c;选择后缀名为dsp的文件打开即可。 若直接选择cpp后缀名打开&#xff0c;打开的只是cpp文件&#xff0c;而不是工程&#xff0c;此时VC右侧不会显示工程信息。

问题解决:QtCreator屏蔽指定警告:如C4819等

QT creator 频繁报出 &#xff0c;不好解决的错误如&#xff1a; warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 方法一&#xff1a;&#xff08;屏蔽此警告&#xff09; 在工程文件.pro里面添加 # disable C…

解析|2G~5G与未来天线技术!

来源&#xff1a;电子万花筒过去二十年&#xff0c;我们见证了移动通信从1G到4G LTE的转变。在这期间&#xff0c;通信的关键技术在发生变化&#xff0c;处理的信息量成倍增长。而天线&#xff0c;是实现这一跨越式提升不可或缺的组件。按照业界的定义&#xff0c;天线是一种变…

QT+OpenCV综合示例:图像混合(滑动条)

QTOpenCV综合示例&#xff1a;图像混合&#xff08;滑动条&#xff09;1、代码&#xff1a;2、运行结果&#xff1a;0&#xff09;Widget_op.ui &#xff08;界面文件&#xff09;设计&#xff1a; 1、代码&#xff1a; 1&#xff09;opencv_imwrite_Q.pro 添加&#xff1a;…

图说报告|智能技术群的“核聚变”推动智能+时代到来

来源&#xff1a;阿里研究院2019年政府工作报告正式提出了“智能”重要战略。5G、物联网、人工智能、数字孪生、云计算、边缘计算等智能技术群的融合与叠加就像“核聚变”&#xff0c;推动着万物互联迈向万物智能时代&#xff0c;进而带动了“智能”时代的到来&#xff0c;以智…

C++局部变量和全局变量的初始化

当局部变量被定义时&#xff0c;系统不会对其初始化&#xff0c;此时局部变量的初始值未定义&#xff0c;必须自行对其初始化。定义全局变量时&#xff0c;系统会自动初始化为下列值&#xff1a;

OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器

OpenCV学习笔记&#xff08;十二&#xff09;&#xff1a;边缘检测&#xff1a;Canny(),Sobel(),Laplace(),Scharr滤波器 1&#xff09;滤波&#xff1a;边缘检测的算法主要是基于图像强度的一阶和二阶导数&#xff0c;但导数通常对噪声很敏感&#xff0c;因此必须采用滤波器来…

微软转型里程碑:云计算收入首次超过Windows业务

来源&#xff1a;腾讯科技导语 微软云计算业务第二季度收入为114亿美元&#xff0c;实现了64%的营收增长&#xff0c;上年同期和上一季度的增幅分别为89%和73%。腾讯科技讯 据国外媒体报道&#xff0c;微软公司今日公布了二季度财报&#xff08;自然季度&#xff0c;下同&#…

OpenCV学习笔记(十三):霍夫变换:HoughLines(),HoughLinesP(),HoughCircles( )

OpenCV学习笔记&#xff08;十三&#xff09;&#xff1a;霍夫变换&#xff1a;HoughLines(),HoughLinesP(),HoughCircles( ) 1、霍夫线变换HoughLines() OpenCV支持三种不同的霍夫线变换&#xff0c;它们分别是&#xff1a; 1&#xff09;标准霍夫变换(Standard Hough Trans…

“如果没有IBM和其所提供的系统,我们就无法登上月球。”

来源&#xff1a;IBM中国“如果没有IBM和其所提供的系统&#xff0c;我们就无法登上月球。”——NASA飞行指挥官 Gena Kra1969年7月20日&#xff0c;就在距离阿姆斯特朗迈出“人类一大步”约122米的月球上空&#xff0c;登月舱里突然响起了刺耳的警报声。警报向NASA显示机载电脑…

C++有符号和无符号数的转换

本文转自&#xff1a;http://www.94cto.com/index/Article/content/id/59973.html 1.引例&#xff1a; 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题&#xff0c;被它们之间的转换原理和位移原理搞得头大了。真的很后悔本科的时候没有认真学习《计算机组成…

OpenCV学习笔记(十四):重映射:remap( )

OpenCV学习笔记&#xff08;十四&#xff09;&#xff1a;重映射&#xff1a;remap( ) 图像的坐标映射是通过原图像与目标图像之间建立一种映射关系&#xff0c;这种映射关系有两种&#xff0c;一种是计算原图像任意像素在映射后图像的坐标位置&#xff0c;另一种是计算变换后…

C++中setw()的用法

setw&#xff08;&#xff09; 用于控制输出之间的间隔 #include <iomanip> using std::setw;cout<<s<<setw(8)<<a<<endl; s和a之间有7个空格&#xff0c;cout<<s<<setw(8)<<a<<endl;的意思是s后面输出8个字符&#xf…

自动驾驶产业链全景图

来源&#xff1a;乐晴智库精选自动驾驶产业链构成:感知-决策-执行 三个层面从感知层面看&#xff0c;感知环境的激光雷达、毫米波雷达、摄像头、红外夜视和组合导航设备&#xff0c;感知车辆自身的包括压力传感器、流量传感器、陀螺仪及加速度传感器等传感器都属于感知层面的零…

OpenCV学习笔记(十五):图像仿射变换:warpAffine(),getRotationMatrix2D()

OpenCV学习笔记&#xff08;十五&#xff09;&#xff1a;图像仿射变换&#xff1a;warpAffine(),getRotationMatrix2D() 一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)的形式。 仿射变换&#xff08;Affine Transformation或 Affine Map&…

『科技』2019全球最有前景AI公司TOP100

来源&#xff1a;eet-china I 整理&#xff1a;弗锐达引言&#xff1a;硅谷最强智库之一的CB Insights发布AI 100 2019报告&#xff0c;在全球范围内评选出了100家“最有前景”的AI创业公司&#xff0c;其中中国公司有6家&#xff0c;分别是……日前&#xff0c;硅谷最强智库之…