栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录
  • vstudio2017+opencv4.5.3+qt5.13.1
  • 介绍
  • 相关配置
  • 新建项目
  • 编写Qt
  • 编写代码
  • 运行测试
    • Debug|x64
    • Release|x64
    • .exe文件
  • 问题-Qt界面闪退
  • 问题-Qt界面修改-需要重新编译
  • 作者声明

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
  1. 双击*.ui打开Qt
  2. 构建ui界面
  • 从左侧栏中拖动 3个pushButton+1个label
  • 将label拉大
  • 注意保存
  1. 编译*.ui文件
  • 右键》编译
编写代码
  1. Header Files/QtWidgetsAppImageVideoOpenClose.h
#pragma once
#include 
#include 
#include "ui_QtWidgetsAppImageVideoOpenClose.h"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include
#include 
#include 
#include
#include 

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));
}


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. 测试
  • 打开图片
  • 打开摄像头
  • 关闭图片和摄像头


.exe文件
  • 作者文件位置:D:workspacevstudioQtWidgetsAppImageVideoOpenClosex64ReleaseQtWidgetsAppImageVideoOpenClose
  • 双击测试.exe文件
问题-Qt界面闪退
  • 更换*.ui打开方式
  • 右键*.ui文件》打开方式》添加》书写qtcreator.exe路径+点击设为默认值
  • 作者的qtcreator.exe路径为:D:ProgramFilesQtQt5.13.1ToolsQtCreatorbinqtcreator.exe


问题-Qt界面修改-需要重新编译
  • 如果在修改了Qt界面需要重新编译*.ui文件
  • 右键*.ui文件》编译
作者声明
  • 文章如有问题,欢迎指正!!!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297685.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号