vstudio2017+opencv4.5.3+qt5.13.1:项目篇

本文详细介绍了如何在Visual Studio 2017环境下配置OpenCV 4.5.3和Qt 5.13.1,并通过一个实际项目演示了打开摄像头、显示图片及关闭的功能。此外,还涵盖了项目的Debug和Release模式测试,以及使用windeployqt进行程序发布。在过程中遇到了Qt界面闪退和修改后需重新编译的问题,并给出了解决方案。
摘要由CSDN通过智能技术生成

vstudio2017+opencv4.5.3+qt5.13.1

介绍

  • 配置将通过项目“打开摄像头+打开图片+关闭摄像头和图片”讲解

相关配置

  • 请预先将所有配置配置完成见 vstudio2017+opencv4.5.3+qt5.13.1:配置篇

新建项目

  • 文件》新建》项目》Visual C++》Qt》Qt Widgets Application》输入项目名》next》next》finish
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

编写Qt

  1. 双击*.ui打开Qt
    在这里插入图片描述
  2. 构建ui界面
  • 从左侧栏中拖动 3个pushButton+1个label
  • 将label拉大
  • 注意保存
    在这里插入图片描述
  1. 编译*.ui文件
  • 右键》编译
    在这里插入图片描述

编写代码

  1. 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;
};
  1. 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();
	}
}
  1. Source Files/main.cpp,保持原样

运行测试

Debug|x64

  1. 生成》重新生成解决方案
    在这里插入图片描述
  2. 运行:Debug|x64|本地Windows调试器
    在这里插入图片描述
  3. 测试
  • 打开图片
  • 打开摄像头
  • 关闭图片和摄像头
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Release|x64

  1. 切换到release模式
    在这里插入图片描述
  2. 配置release模式
    在这里插入图片描述
  3. 生成》重新生成解决方案
    在这里插入图片描述
  4. 运行:Release|x64|本地Windows调试器
    在这里插入图片描述
  5. 测试
  • 打开图片
  • 打开摄像头
  • 关闭图片和摄像头
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

打包发布Qt和*.exe

使用windeployqt命令打包发布的目的:

  • 一 般vsstudio生成解决方案之后只有“项目名.exe”文件
  • 这个“项目名.exe”文件双击可以直接运行,因为本地有Qt的环境
  • 如果要让“项目名.exe”文件在其它电脑上也能运行,则需要windeployqt命令进行打包发布
  • 把“项目名.exe”和打包生成的Qt文件复制到其它电脑上,双击“项目名.exe”就可以运行。
  • 综上,windeployqt命令用来为“项目名.exe”文件生成所需的Qt依赖。
  1. 找到*exe文件位置(release|x64模式下)
  • 作者文件位置:D:\workspace\vstudio\QtWidgetsAppImageVideoOpenClose\x64\Release\QtWidgetsAppImageVideoOpenClose
    在这里插入图片描述
  1. 找到 windeployqt.exe位置
  • 点击开始》找到Qt(MSVC 2017 64-bit)窗口》点击打开命令行窗口
    在这里插入图片描述
  1. 输入命令打包发布
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文件》编译
    在这里插入图片描述

作者声明

  • 文章如有问题,欢迎指正!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值