当前位置: 首页 > news >正文

【Qt+opencv】计时函数与图像变换

文章目录

  • 前言
  • 计算时间函数
  • 图像变换
    • 旋转
    • 镜像
    • 缩放
  • 总结


前言

在图像处理和计算机视觉的应用中,我们经常需要对图像进行各种变换,如旋转、缩放、剪切等。同时,为了评估算法的性能,我们也需要对代码的执行时间进行精确的测量。OpenCV提供了一系列的函数和方法,使得这些任务变得简单而直接。

Qt是一个跨平台的应用程序开发框架,它提供了一套完整的图形用户界面库,以及丰富的工具和库,包括线程、网络、数据库和多媒体等。结合OpenCV,我们可以在Qt中创建强大的图像处理和计算机视觉应用。

本文将介绍如何在Qt应用程序中使用OpenCV进行图像变换,以及如何使用Qt的计时函数进行性能测量。


计算时间函数

getTickCountgetTickFrequency是两个常用于计算代码执行时间的函数,它们都被定义在OpenCV的core.hpp文件中。

  • getTickCount函数:

    • 函数原型:DWORD GetTickCount();
    • 作用:该函数返回从操作系统启动到当前所经过的计时周期数(以毫秒为单位)。这个函数可以用来初始化cv::RNG或者通过在函数调用前后读取tick count来测量函数执行时间。
  • getTickFrequency函数:

    • 函数原型:double getTickFrequency();
    • 作用:该函数返回CPU的频率,也就是每秒的计时周期数。这个函数常与getTickCount一起使用,用于计算代码的执行时间。

例如,你可以使用以下代码来计算某段代码的执行时间:

double t1 = (double)getTickCount();
// your code execution
double t2 = (double)getTickCount();
double time = (t2 - t1) / getTickFrequency();

在这段代码中,time变量就会存储你的代码执行所需的时间(以秒为单位)。如果你想要得到毫秒级的执行时间,只需要将time乘以1000即可。这是因为1秒等于1000毫秒。所以,总次数/一秒内重复的次数 = 时间 (s),1000 *总次数/一秒内重复的次数= 时间 (ms)。

图像变换

对于opencv的图像变换其实就是矩阵的变换,这里不多介绍

旋转

  1. cv::transpose函数

    函数原型:cv::transpose(src, dst)

    • src:输入图像,其矩阵需要被转置。
    • dst:输出图像,与源图像具有相同的大小和深度。这是一个可选参数。

    cv::transpose函数用于对2D数组进行转置。转置操作会交换矩阵的行和列。

  2. cv::rotate函数

    函数原型:cv::rotate(src, rotateCode, dst)

    • src:输入图像,其颜色空间需要被改变。
    • rotateCode:一个枚举值,用于指定如何旋转数组。
    • dst:输出图像,与源图像具有相同的大小和深度。这是一个可选参数。

    cv::rotate函数用于将2D数组旋转90度的整数倍。该函数可以以三种不同的方式旋转数组。

镜像

当然,以下是OpenCV中flip函数的详细介绍:

cv::flip函数

函数原型:void flip(InputArray src, OutputArray dst, int flipCode);

  • src:输入数组。这是需要被翻转的2D数组。
  • flipCode:一个标志,用于指定如何翻转数组。0表示沿x轴翻转,正值(例如,1)表示沿y轴翻转。负值(例如,-1)表示沿两个轴翻转。
  • dst:输出数组,与源数组具有相同的大小和类型。这是一个可选参数。

缩放

该函数为缩放函数,特别注意:函数缩放会失真(因为缩放后的像素都是计算出来的),尤其是以缩放后的图像继续缩放会原来大小,缩放用缓存,缓存存放原图,每次以原图缩放

函数原型:void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR)

  • src:输入图像,通常为 cv::Mat 类型。

  • dst:输出图像,与输入图像具有相同的类型。

  • dsize:目标图像的尺寸,表示为 (width, height)

  • fx:沿水平轴的缩放因子,默认为0,表示不进行水平缩放。

  • fy:沿垂直轴的缩放因子,默认为0,表示不进行垂直缩放。
    在OpenCV的resize函数中,dsizefx, fy是用来控制图像缩放的参数。

    • dsize:这是一个Size对象,表示目标图像的期望大小。例如,如果你想将图像的大小调整为宽度为800像素,高度为600像素,那么你可以设置dsizeSize(800, 600)

    • fx, fy:这两个参数是缩放因子,用于控制图像在水平方向(fx)和垂直方向(fy)上的缩放比例。例如,如果你想将图像在水平方向上放大2倍,在垂直方向上缩小一半,那么你可以设置fx为2.0,fy为0.5。

    • dsizefx, fy之间的关系是,如果dsize不是零,那么fxfy会被忽略。换句话说,如果你指定了dsize,那么图像将被调整到你指定的大小,而不考虑fxfy的值。如果dsize是零,那么fxfy会被用来计算目标图像的大小。

    • 缩放因子的影响主要体现在图像的大小和内容的变化上。如果缩放因子大于1,那么图像会被放大,图像的内容会被拉伸。如果缩放因子小于1,那么图像会被缩小,图像的内容会被压缩。如果缩放因子等于1,那么图像的大小和内容不会发生变化。

  • interpolation:插值方法,有以下几种可选:

    • cv::INTER_NEAREST:最近邻插值,速度最快,但质量最差。
    • cv::INTER_LINEAR:线性插值,速度较快,质量较好。
    • cv::INTER_AREA:区域插值,适用于图像缩小,速度较慢,质量最好。
    • cv::INTER_CUBIC:三次样条插值,速度适中,质量较好。
    • cv::INTER_LANCZOS4:Lanczos插值,速度适中,质量较好。

以下是一个使用cv::resize函数的C++代码示例:

#include <opencv2/opencv.hpp>
using namespace cv;int main() {// 读取原始图像Mat src = imread("./image.png", IMREAD_GRAYSCALE);if (src.empty()) {std::cout << "无法读取图像" << std::endl;return -1;}imshow("src", src);waitKey(0);// 放大 2 倍Mat dst;resize(src, dst, Size(src.cols * 2, src.rows * 2), 0, 0, INTER_LINEAR);imshow("2x INTER_LINEAR", dst);waitKey(0);// 缩小 2 倍resize(src, dst, Size(), 0.5, 0.5, INTER_LANCZOS4);imshow("0.5x INTER_LANCZOS4", dst);waitKey(0);return 0;
}

总结

通过本文,我们了解了如何在Qt应用程序中使用OpenCV进行图像变换,以及如何使用Qt的计时函数进行性能测量。这为我们在实际应用中优化算法和提高性能提供了便利。

然而,这只是OpenCV和Qt强大功能的冰山一角。通过进一步的学习和实践,你可以利用这两个工具来创建更复杂的图像处理和计算机视觉应用程序。希望本文能为你的学习之旅提供帮助。记住,实践是最好的老师,所以不断实践和尝试新的项目是提高技能的最好方式。祝你学习愉快!

相关文章:

【Qt+opencv】计时函数与图像变换

文章目录 前言计算时间函数图像变换旋转镜像缩放 总结 前言 在图像处理和计算机视觉的应用中&#xff0c;我们经常需要对图像进行各种变换&#xff0c;如旋转、缩放、剪切等。同时&#xff0c;为了评估算法的性能&#xff0c;我们也需要对代码的执行时间进行精确的测量。OpenC…...

nodejs下载+react安装

一、nodejs安装 1、nodejs下载 具体安装可参考连接&#xff1a;2023最新版Node.js下载安装及环境配置教程&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了_nodejs安装及环境配置-CSDN博客 下载地址&#xff1a;Node.js — 下载 Node.js 测…...

linux service小例

linux service 测试 1.创建一个app // myapp.c // 间隔10s写入时间到文件 #include <stdio.h> #include <time.h> #include <unistd.h> // 引入unix标准函数定义&#xff0c;如sleep()int main() {FILE *fp;time_t now;char buffer[80];// 打开文件以追加模…...

iOS 开发包管理之 Swift Package Manager

这是由官方推出&#xff0c;用于管理分发 swift 代码的工具。这个在 Xcode 是天然的存在&#xff0c;就是说我们不用安装就能够直接使用。 File > Add Package Dependencies… 在弹出来窗口选择一些库来导入 又或者点左下角的“” > Add Package Collection… 添加完成…...

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言函数 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀数组 &#x1f4d2;1. 什么是数组…...

AI开源战争的真相

引言 在AI技术迅猛发展的今天&#xff0c;开源与闭源之争成为了AI圈内最热的话题之一。大模型免费开放的背后到底隐藏着什么样的真相&#xff1f;这是一个令人困惑的问题。本文将深入探讨开源与闭源之争的历史背景、技术演进以及商业利益的博弈。 开源概念的起源 开源软件的…...

使用Java填充Word模板的技术详解

目录 概述常见的Java Word处理库 Apache POIAspose.Words for JavaDocx4j 使用Apache POI填充Word模板 创建和读取Word文档填充文本填充表格 使用Aspose.Words for Java填充Word模板 创建和读取Word文档填充文本填充表格 使用Docx4j填充Word模板 创建和读取Word文档填充文本填…...

vmware配置centos+配置静态ip联网+更换镜像

centos7配置参考【实战】VMware17虚拟机以及Centos7详细安装教程-CSDN博客 ip配置步骤&#xff1a; 先更改编辑虚拟网络编辑器中的内容 就按照还原默认设置来&#xff0c;设定后就是以上内容&#xff0c;然后一定要记住子网ip和子网掩码 接下来就是NAT设置&#xff1a; 网关…...

广州数据中心服务器搬迁方案

设备搬迁的准备工作涵盖资料准备、环境准备、计划细化等工作。资料准备主要是对旧机房的整理工作&#xff0c;对所搬运的设备进行资料整理&#xff0c;首先对每台设备建立基本情况、位置说明、系统关联性、搬迁批次及工作步骤等的设备档案&#xff0c;然后在档案资料收集完的基…...

uniapp开发钉钉小程序流程

下载开发工具 1、小程序开发工具 登录钉钉开发平台&#xff0c;根据自己的需求下载合适的版本&#xff0c;我这里下载的是Windows &#xff08;64位&#xff09;版本 小程序开发工具 - 钉钉开放平台 2、HBuilder X HBuilderX-高效极客技巧 新建项目及相关配置 新建项目 …...

河南萌新联赛2024第(一)场:河南农业大学 A D F G H I K

A 造数 题目描述&#xff1a; 给定一个整数 &#x1d45b; &#xff0c;你可以进行以下三种操作 操作1&#xff1a; 1 操作2&#xff1b; 2 操作3&#xff1a; 2 问最少需要多少次操作可以将 0 转为为 &#x1d45b; 。 解题思路 操作1&#xff0c;2&#xff0c;3。操作 3 …...

通信协议_C#实现CAN通信

CAN协议 CAN&#xff08;Controller Area Network&#xff09;即控制器局域网络。特点&#xff1a; 多主网络&#xff1a;网络上的任何节点都可以主动发送数据&#xff0c;不需要一个固定的主节点。双绞线&#xff1a;使用双绞线作为通信介质&#xff0c;支持较远的通信距离。…...

【AI工具基础】—B树(B-tree)

B树&#xff08;B-tree&#xff09;是一种自平衡的树状数据结构&#xff0c;它能够在保持数据有序的同时&#xff0c;优化大块数据的读写操作&#xff0c;使得查找、顺序访问、插入和删除等操作都能在对数时间内完成。以下是对B树原理的详细描述&#xff1a; 一、定义与特性 …...

STM32智能仓库管理系统教程

目录 引言环境准备智能仓库管理系统基础代码实现&#xff1a;实现智能仓库管理系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;仓库管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓库管理系统通…...

空间计算开发:Volu的集成开发工具包

在空间计算技术迅速发展的今天,VR和AR项目的开发需求日益增长。Volu,一个面向空间计算赛道的开发者工具,正致力于简化这一过程。本文将深入探讨Volu如何通过其集成环境,为开发者提供一站式的解决方案。 一、定位:空间计算的得力助手 Volu定位为一个专为空间开发设计的集…...

02-Redis未授权访问漏洞

免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…...

Linux——多路复用之poll

目录 前言 一、poll的认识 二、poll的接口 三、poll的使用 前言 前面我们学习了多路复用的select&#xff0c;知道多路复用的原理与select的使用方法&#xff0c;但是select也有许多缺点&#xff0c;导致他的效率不算高。今天我们来学习poll的使用&#xff0c;看看poll较于…...

【AI资讯】7.19日凌晨OpenAI发布迷你AI模型GPT-4o mini

性价比最高的小模型 北京时间7月19日凌晨&#xff0c;美国OpenAI公司推出一款新的 AI 模型“GPT-4o mini”&#xff0c;即GPT-4o的更小参数量、简化版本。OpenAI表示&#xff0c;GPT-4o mini是目前功能最强大、性价比最高的小参数模型&#xff0c;性能逼近原版GPT-4&#xff0…...

3.设计模式--创建者模式--工厂模式

3.设计模式–创建者模式–工厂模式 3.1简单工厂和静态 工厂&#xff08;不属于23中设计模式&#xff09; //抽象类&#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能 public interface Tea {public abstract void setName();public abstract String getNa…...

IOT 的 10 种常见协议、组网模式、特点及其使用场景浅析

前情&#xff1a; 开放系统互连&#xff08;OSI&#xff09;模型&#xff0c;它列出了七层。从下到上&#xff0c;各层如下&#xff1a; 物理层 数据链接 网络层 传输层 会话层 推介会 应用层 物联网也以多层模型的形式表达。尽管有些使用 OSI 七层模型&#xff0c;但其…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...