Qt OpenCV 学习(二):两个简单图片识别案例

1. 寻找匹配物体

在这里插入图片描述

1.1 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <opencv2/opencv.hpp>#include <QImage>
#include <QString>
#include <QPixmap>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void initMainWindow();void imgproc();void imgShow();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;cv::Mat myImg;  // 缓存图片:用于代码引用和处理QImage myQImg;  // 保存图片,可转为文件存盘或显示
};
#endif // MAINWINDOW_H

1.2 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);initMainWindow();
}MainWindow::~MainWindow() {delete ui;
}// 界面初始化
void MainWindow::initMainWindow() {// 读取图片cv::Mat imgData = cv::imread("D:\\BaiduNetdiskDownload\\search_pic\\search_pic\\mermaid.jpg");// 图片格式转换cv::cvtColor(imgData, imgData, cv::COLOR_BGR2RGB);myImg = imgData;myQImg = QImage((const unsigned char*)(imgData.data), imgData.cols, imgData.rows, QImage::Format_RGB888);imgShow();  // 显示图片
}// 处理图片
void MainWindow::imgproc() {// CV_TM_CCOEFF 相关匹配,把原图像素对其均值的相对值与待匹配子图像素对其均值的相对值进行比较,计算数值越接近 1,表示匹配度越高int METHOD = CV_TM_CCOEFF;cv::Mat imgSrc = myImg;  // 将被显示的原图// 待匹配的子图cv::Mat imgTmp = cv::imread("D:\\BaiduNetdiskDownload\\search_pic\\search_pic\\fish.jpg");cv::cvtColor(imgTmp, imgTmp, cv::COLOR_BGR2RGB);cv::Mat imgRes;cv::Mat imgDisplay;imgSrc.copyTo(imgDisplay);int rescols = imgSrc.cols - imgTmp.cols + 1;int resrows = imgSrc.rows - imgTmp.rows + 1;imgRes.create(rescols, resrows, CV_32FC1);  // 创建输出结果的矩阵cv::matchTemplate(imgSrc, imgTmp, imgRes, METHOD);  // 进行匹配cv::normalize(imgRes, imgRes, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());  // 进行标准化double minVal;double maxVal;cv::Point minLoc;cv::Point maxLoc;cv::Point matchLoc;// 通过函数 minMaxLoc 定位最匹配的位置cv::minMaxLoc(imgRes, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat());if (METHOD == CV_TM_SQDIFF || METHOD == CV_TM_SQDIFF_NORMED) {matchLoc = minLoc;} else {matchLoc = maxLoc;}// 将匹配结果用举行框圈出来cv::rectangle(imgDisplay, matchLoc, cv::Point(matchLoc.x + imgTmp.cols, matchLoc.y + imgTmp.rows), cv::Scalar::all(0), 2, 8, 0);cv::rectangle(imgRes, matchLoc, cv::Point(matchLoc.x + imgTmp.cols, matchLoc.y + imgTmp.rows), cv::Scalar::all(0), 2, 8, 0);myQImg = QImage((const unsigned char*)(imgDisplay.data), imgDisplay.cols, imgDisplay.rows, QImage::Format_RGB888);imgShow();
}// 显示图片
void MainWindow::imgShow() {// 在 Qt 界面上显示图片ui->label->setPixmap(QPixmap::fromImage(myQImg.scaled(ui->label->size(), Qt::KeepAspectRatio)));
}void MainWindow::on_pushButton_clicked() {imgproc();
}

2. 人脸识别实例

在这里插入图片描述

2.1 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <opencv2/opencv.hpp>#include <vector>
#include <QImage>
#include <QString>
#include <QPixmap>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void initMainWindow();void imgProc();void imgShow();private slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;cv::Mat myImg;QImage myQImg;
};
#endif // MAINWINDOW_H

2.2 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);initMainWindow();
}MainWindow::~MainWindow() {delete ui;
}void MainWindow::initMainWindow() {cv::Mat imgData = cv::imread("D:\\download\\qt_test\\OpencvFace\\model.jpg");cv::cvtColor(imgData, imgData, cv::COLOR_BGR2RGB);myImg = imgData;myQImg = QImage((const unsigned char*)(imgData.data), imgData.cols, imgData.rows, QImage::Format_RGB888);imgShow();
}void MainWindow::imgProc() {cv::CascadeClassifier face_detector;  // 定义人脸识别分类器类cv::CascadeClassifier eyes_detector;  // 定义人眼识别分类器类// 加载视觉识别分类器// 下述两个 xml 文件在 D:\OpenCV-MinGW-Build-OpenCV-3.4.9\etc\haarcascadesface_detector.load("D:\\download\\qt_test\\OpencvFace\\haarcascade_frontalface_alt.xml");eyes_detector.load("D:\\download\\qt_test\\OpencvFace\\haarcascade_eye_tree_eyeglasses.xml");std::vector<cv::Rect> faces;cv::Mat imgSrc = myImg;cv::Mat imgGray;cv::cvtColor(imgSrc, imgGray, cv::COLOR_BGR2GRAY);cv::equalizeHist(imgGray, imgGray);// 多尺寸检测人脸face_detector.detectMultiScale(imgGray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));for (uint64 i = 0; i < faces.size(); i++) {cv::Point center(faces[i].x + faces[i].width * 0.5, faces[i].y + faces[i].height * 0.5);cv::ellipse(imgSrc, center, cv::Size(faces[i].width * 0.5, faces[i].height * 0.5), 0, 0, 360, cv::Scalar(255, 0, 255), 4, 8, 0);cv::Mat faceROI = imgGray(faces[i]);std::vector<cv::Rect> eyes;// 在每张人脸基础上多尺寸检测人眼eyes_detector.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));for (uint64 j = 0; j < eyes.size(); j++) {cv::Point center(faces[i].x + eyes[j].x + eyes[j].width * 0.5, faces[i].y + eyes[j].y + eyes[j].height * 0.5);int radius = cvRound((eyes[j].width + eyes[j].height) * 0.25);cv::circle(imgSrc, center, radius, cv::Scalar(255, 0, 0), 4, 8, 0);}}cv::Mat imgDst = imgSrc;myQImg = QImage((const unsigned char*)(imgDst.data), imgDst.cols, imgDst.rows, QImage::Format_RGB888);imgShow();
}void MainWindow::imgShow() {ui->label->setScaledContents(true);  // 当图像大于控件大小时,将自动缩放以适应控件的大小// Qt::KeepAspectRatio:保持图像的纵横比例不变ui->label->setPixmap(QPixmap::fromImage(myQImg.scaled(ui->label->size(), Qt::KeepAspectRatio)));
}void MainWindow::on_pushButton_clicked() {imgProc();
}

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

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

相关文章

TimeGPT:时序预测领域终于迎来了第一个大模型

时间序列预测领域在最近的几年有着快速的发展&#xff0c;比如N-BEATS、N-HiTS、PatchTST和TimesNet。 大型语言模型(llm)最近在ChatGPT等应用程序中变得非常流行&#xff0c;因为它们可以适应各种各样的任务&#xff0c;而无需进一步的训练。 这就引出了一个问题:时间序列的…

速达软件全系产品存在任意文件上传漏洞 附POC

@[toc] 速达软件全系产品存在任意文件上传漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。…

基于Java SSM框架+Vue实现药品保健品购物网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现药品保健品购物网站演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 ssm药源购物网站&#xff0c;主要的模块包括两个用户&#xff0c;管理员权限&#xff1a;用…

【数据库】基于封锁的数据库调度器,以及等待锁处理的优先级策略

封锁调度器的体系结构 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会…

分享一个国内可用的免费AI-GPT网站

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 我们也忍不住做了一个基于ChatGPT的网站&#xff0c;可以免登陆&#xff01;&#xff01;国内可直接对话AI&#xff0c;也有各种提供工作效率的工具供大家使用。 可以这…

Spring Cloud Alibaba简介

1、简介 Spring Cloud阿里(https://sca.aliyun.com/en-us/)为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件&#xff0c;使您可以轻松地使用Spring Cloud开发应用程序。 有了Spring Cloud阿里&#xff0c;你只需要添加一些注释和少量的配置&#…

Java集合(已重写-废弃了)

# 精辟总结 其实各种八股文资料&#xff0c;他也就是围绕着核心知识展开提问的&#xff0c;你只要根据八股文把核心知识提炼出来&#xff0c;形成核心知识体系&#xff01; Java集合那是重点中的重点。最基本的概念要懂&#xff0c;核心的概念&#xff0c;那要滚瓜烂熟。 Ja…

【计算机视觉】基于OpenCV计算机视觉的摄像头测距技术设计与实现

基于计算机视觉的摄像头测距技术 文章目录 基于计算机视觉的摄像头测距技术导读引入技术实现原理技术实现细节Python-opencv实现方案获取目标轮廓步骤 1&#xff1a;图像处理步骤 2&#xff1a;找到轮廓步骤完整代码 计算图像距离前置技术背景与原理步骤 1&#xff1a;定义距离…

[传智杯 #3 决赛] 面试

题目背景 disangan233 和 disangan333 去面试了&#xff0c;面试官给了一个问题&#xff0c;热心的你能帮帮他们吗&#xff1f; 题目描述 现在有 n 个服务器&#xff0c;服务器 i 最多能处理 ai​ 大小的数据。 接下来会有 k 条指令 bk​&#xff0c;指令 i 表示发送 bi​ …

海德汉(HEIDENHAIN)CNC数据采集(可免授权)

一&#xff0c;概述 海德汉 常见的系统一般有530、640系统&#xff0c;采集一般有两种方法&#xff1a; &#xff08;1&#xff09;购买海德汉官方的SDK&#xff0c;HeidenhainDNC COM Component&#xff0c;安装之后有相应的demo&#xff0c;支持的语言有C#、C/C。此方法还需…

面试篇之微服务(二)

目录 服务容灾 21.什么是服务雪崩&#xff1f; 22.什么是服务熔断&#xff1f;什么是服务降级&#xff1f; 什么是服务熔断&#xff1f; 什么是服务降级&#xff1f; 有哪些熔断降级方案实现&#xff1f; 23.Hystrix怎么实现服务容错&#xff1f; 24.Sentinel怎么实现限…

JSP格式化标签 parseDate将指定时间格式字符串转为真正的date对象

格式化标签最后一个就是 parseDate 作用 将一个日期/时间格式字符串 转为 真正的date时间类型 有点无语 这种 东西应该都是在java中去做的 而不是在java中 这个建议也是做个了解即可 作用不是那么大 基本语法如下 这里 我们 直接编写代码如下 <% page contentType"…

JSP格式化标签 parseNumber指定格式字符串转数字类型

好 我们继续来说格式化标签 parseNumber 它的作用是讲一个字符串 转换为指定格式的数值型 老实说 这东西 作为了解把 实际开发中都不是用得少 我建议还是在java端就处理好 不建议在jsp中高这种类型转换的操作 基本格式如下 这几个属性都是我们这几期jsp标签的老朋友了 我们…

【STM32】STM32学习笔记-新建工程(04)

00. 目录 文章目录 00. 目录01. 创建STM32工程02. STM32工程编译和下载03. LED测试04. 型号分类及缩写05. 工程结构06. 附录 01. 创建STM32工程 【STM32】STM32F103C8T6 创建工程模版详解(固件库) 02. STM32工程编译和下载 2.1 选择下载器位ST-Link Debugger 2.2 勾选上电…

认识成交量VOL,搞懂量价关系

一、认识成交量VOL 1、成交量VOL的含义 VOL是一个成交量指标&#xff0c;是指个股或者大盘一定时间内的成交数量&#xff0c;一般的炒股软件中都是指成交总手数&#xff08;1手100股&#xff09;。 成交量体现在炒股软件上就是一根竖着的柱子&#xff0c;成交量越大&#xff0c…

Redis常见类型

常用类型String字符串类型Hash字典类型List列表类型Set集合类型ZSet有序集合类型 Java程序操作Redis代码操作Redis 常用类型 String字符串类型 使用方式&#xff1a; 使用场景&#xff1a; Hash字典类型 字典类型(Hash) 又被成为散列类型或者是哈希表类型&#xff0c;它…

数据库-MySQL之数据库必知必会22-26章

第 22 章 使用视图 视图是虚拟的表。与包含数据的表不一样&#xff0c;视图只包含使用时动态检索数据的查询。 使用视图 视图用CREATE VIEW语句来创建。 使用SHOW CREATE VIEW viewname&#xff1b;来查看创建视图的语句。 用DROP删除视图&#xff0c;其语法为DROP VIEW view…

开发猿的平平淡淡周末---2023/12/3

2023/12/3 天气晴 温度适宜 AM 早安八点多的世界&#xff0c;起来舒展了下腰&#xff0c;阳光依旧明媚&#xff0c;给平淡的生活带来了一丝暖意 日常操作&#xff0c;喂鸡&#xff0c;时政&#xff0c;洗漱&#xff0c;恰饭&#xff0c;肝会儿游戏 看会儿手机 ___看累…

数据结构 | 查漏补缺之ASL、

目录 ASL 情形之一&#xff1a;二分查找 线索二叉树 哈夫曼树 大根堆 邻接表&邻接矩阵 ASL 参考博文 关于ASL(平均查找长度)的简单总结_平均查找长度asl-CSDN博客 情形之一&#xff1a;二分查找 线索二叉树 参考博文 线索二叉树(线索链表遍历&#xff0c;二叉树…

Unity中Shader指令优化

文章目录 前言解析一下不同运算、条件、函数所需的指令数1、常数基本运算2、变量基本运算3、条件语句、循环 和 函数 前言 上一篇文章中&#xff0c;我们解析了Shader解析后的代码。我们在这篇文章中来看怎么实现Shader指令优化 Unity中Shader指令优化&#xff08;编译后指令…