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

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...