目录
vstudio2017+opencv4.5.3+qt5.13.1
- vstudio2017+opencv4.5.3+qt5.13.1:安装篇
- vstudio2017+opencv4.5.3+qt5.13.1:配置篇
- vstudio2017+opencv4.5.3+qt5.13.1:项目篇,项目打开摄像头+打开图片+关闭摄像头和图片
介绍
- 配置将通过项目“打开摄像头+打开图片+关闭摄像头和图片”讲解
相关配置
- 请预先将所有配置配置完成见 vstudio2017+opencv4.5.3+qt5.13.1:配置篇
新建项目
- 文件》新建》项目》Visual C++》Qt》Qt Widgets Application》输入项目名》next》next》finish
编写Qt
- 双击*.ui打开Qt
- 构建ui界面
- 从左侧栏中拖动 3个pushButton+1个label
- 将label拉大
- 注意保存
- 编译*.ui文件
- 右键》编译
编写代码
- Header Files/QtWidgetsAppImageVideoOpenClose.h
#pragma once
#include <QtWidgets/QMainWindow>
#include <QtWidgets/qfiledialog.h>
#include "ui_QtWidgetsAppImageVideoOpenClose.h"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include<opencv2/imgproc/imgproc.hpp>
#include <QMessageBox>
#include <QDebug>
#include<QLabel>
#include <QTimer>
using namespace cv;
class QtWidgetsAppImageVideoOpenClose : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsAppImageVideoOpenClose(QWidget* parent = Q_NULLPTR);
~QtWidgetsAppImageVideoOpenClose();
QImage MatImageToQt(const Mat& src);
private slots:
void on_label_linkActivated(const QString& link);
//点击button打开图片
void on_pushButton_image_clicked();
//点击button打开摄像头
void on_pushButton_camera_clicked();
//点击button关闭图片和摄像头
void on_pushButton_close_clicked();
void readFarme();
private:
Ui::QtWidgetsAppImageVideoOpenCloseClass* ui;
VideoCapture cap;
Mat src_image;
QTimer* timer;
QImage* image;
};
- Source Files/QtWidgetsAppImageVideoOpenClose.cpp
#include "QtWidgetsAppImageVideoOpenClose.h"
#define camerawidth 1280
#define cameraheight 720
QtWidgetsAppImageVideoOpenClose::QtWidgetsAppImageVideoOpenClose(QWidget* parent)
: QMainWindow(parent)
, ui(new Ui::QtWidgetsAppImageVideoOpenCloseClass)
{
ui->setupUi(this);
timer = new QTimer(this);
image = new QImage();
connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));
}
QtWidgetsAppImageVideoOpenClose::~QtWidgetsAppImageVideoOpenClose()
{
delete ui;
}
void QtWidgetsAppImageVideoOpenClose::on_label_linkActivated(const QString& link)
{
}
/*
打开摄像头
*/
void QtWidgetsAppImageVideoOpenClose::on_pushButton_camera_clicked()
{
cap.open(0);
timer->start(33);
}
/*
关闭图片和摄像头
*/
void QtWidgetsAppImageVideoOpenClose::on_pushButton_close_clicked()
{
timer->stop();
cap.release();
ui->label->clear();
}
/*
打开图片
*/
void QtWidgetsAppImageVideoOpenClose::on_pushButton_image_clicked()
{
Mat srcImage, gray_image, srcImage1;
QString Fileadd = QFileDialog::getOpenFileName(this, "get file");
if (Fileadd.isEmpty())
{
QMessageBox::information(this, "error", "No File!");
return;
}
//读取图片
srcImage = imread(Fileadd.toLatin1().data());
// 图像格式转换
cvtColor(srcImage, srcImage1, COLOR_BGR2RGB);
QImage disImage = QImage((const unsigned char*)(srcImage1.data), srcImage1.cols, srcImage1.rows, QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(disImage.scaled(ui->label->size(), Qt::KeepAspectRatio)));
}
void QtWidgetsAppImageVideoOpenClose::readFarme()
{
cap.read(src_image);
QImage imag = MatImageToQt(src_image);
ui->label->setPixmap(QPixmap::fromImage(imag));
}
/*
Mat转成QImage
*/
QImage QtWidgetsAppImageVideoOpenClose::MatImageToQt(const Mat& src)
{
if (src.type() == CV_8UC1)
{
QImage qImage(src.cols, src.rows, QImage::Format_Indexed8);
qImage.setColorCount(256);
for (int i = 0; i < 256; i++)
{
qImage.setColor(i, qRgb(i, i, i));
}
uchar* pSrc = src.data;
for (int row = 0; row < src.rows; row++)
{
uchar* pDest = qImage.scanLine(row);
memcmp(pDest, pSrc, src.cols);
pSrc += src.step;
}
return qImage;
}
else if (src.type() == CV_8UC3)
{
const uchar* pSrc = (const uchar*)src.data;
QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_RGB888);
return qImage.rgbSwapped();
}
else if (src.type() == CV_8UC4)
{
const uchar* pSrc = (const uchar*)src.data;
QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_ARGB32);
return qImage.copy();
}
else
{
return QImage();
}
}
- Source Files/main.cpp,保持原样
运行测试
Debug|x64
- 生成》重新生成解决方案
- 运行:Debug|x64|本地Windows调试器
- 测试
- 打开图片
- 打开摄像头
- 关闭图片和摄像头
Release|x64
- 切换到release模式
- 配置release模式
- 生成》重新生成解决方案
- 运行:Release|x64|本地Windows调试器
- 测试
- 打开图片
- 打开摄像头
- 关闭图片和摄像头
打包发布Qt和*.exe
使用windeployqt命令打包发布的目的:
- 一 般vsstudio生成解决方案之后只有“项目名.exe”文件
- 这个“项目名.exe”文件双击可以直接运行,因为本地有Qt的环境
- 如果要让“项目名.exe”文件在其它电脑上也能运行,则需要windeployqt命令进行打包发布
- 把“项目名.exe”和打包生成的Qt文件复制到其它电脑上,双击“项目名.exe”就可以运行。
- 综上,windeployqt命令用来为“项目名.exe”文件生成所需的Qt依赖。
- 找到*exe文件位置(release|x64模式下)
- 作者文件位置:D:\workspace\vstudio\QtWidgetsAppImageVideoOpenClose\x64\Release\QtWidgetsAppImageVideoOpenClose
- 找到 windeployqt.exe位置
- 点击开始》找到Qt(MSVC 2017 64-bit)窗口》点击打开命令行窗口
- 输入命令打包发布
windeployqt D:\workspace\vstudio\QtWidgetsAppImageVideoOpenClose\x64\Release\QtWidgetsAppImageVideoOpenClose\QtWidgetsAppImageVideoOpenClose.exe
结果
4. 双击测试.exe文件
问题-Qt界面闪退
- 更换*.ui打开方式
- 右键*.ui文件》打开方式》添加》书写qtcreator.exe路径+点击设为默认值
- 作者的qtcreator.exe路径为:D:\ProgramFiles\Qt\Qt5.13.1\Tools\QtCreator\bin\qtcreator.exe
问题-Qt界面修改-需要重新编译
- 如果在修改了Qt界面需要重新编译*.ui文件
- 右键*.ui文件》编译
作者声明
- 文章如有问题,欢迎指正!!!