当前位置: 首页 > 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;但其…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

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

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

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...