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

news/2024/8/26 13:36:33 标签: qt, opencv, 开发语言, c语言, c++, 人工智能, 计算机视觉

文章目录

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


前言

在图像处理和计算机视觉的应用中,我们经常需要对图像进行各种变换,如旋转、缩放、剪切等。同时,为了评估算法的性能,我们也需要对代码的执行时间进行精确的测量。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强大功能的冰山一角。通过进一步的学习和实践,你可以利用这两个工具来创建更复杂的图像处理和计算机视觉应用程序。希望本文能为你的学习之旅提供帮助。记住,实践是最好的老师,所以不断实践和尝试新的项目是提高技能的最好方式。祝你学习愉快!


http://www.niftyadmin.cn/n/5558176.html

相关文章

opencv—常用函数学习_“干货“_8

目录 二二、图像积分 计算图像的积分图像 (integral) 解释 应用场景 快速计算图像块和的示例 二三、图像边界处理 使用 copyMakeBorder 添加图像边界 解释 边界类型示例 二四、图像修复 使用 inpaint 进行图像修复 解释 实际应用 去除图像中的水印示例 http://t.c…

分布式 I/O 系统 BL200 Modbus TCP 耦合器

BL200 耦合器是一个数据采集和控制系统&#xff0c;基于强大的 32 位微处理器设计&#xff0c;采用 Linux 操作系统&#xff0c;支持 Modbus 协议&#xff0c;可以快速接入现场 PLC、SCADA 以及 ERP 系统&#xff0c; 内置逻辑控制、边缘计算应用&#xff0c;适用于 IIoT 和工业…

KITTI 3D 数据可视化

引言 KITTI 视觉基准测试套件&#xff08;KITTI Vision Benchmark Suite&#xff09;提供了大量用于理解自动驾驶场景的工具。尤其是3D数据可视化在分析和解释传感器&#xff08;如激光雷达&#xff09;与环境的复杂交互中起到了至关重要的作用。本文将详细探讨KITTI数据集中3…

追踪Conda包的踪迹:深入探索依赖关系与管理

追踪Conda包的踪迹&#xff1a;深入探索依赖关系与管理 Conda作为Python和其他科学计算语言的包管理器&#xff0c;不仅提供了安装、更新和卸载包的功能&#xff0c;还有一个强大的包跟踪功能&#xff0c;帮助用户理解包之间的依赖关系和管理环境。本文将详细解释如何在Conda中…

Web前端-Web开发CSS基础1-字体属性

一. 基础 1. 在一个html文件中引入"../css/format1.css"&#xff1b; 2. 在一个html文件中引入"../css/format2.css"&#xff1b; 3. 在一个html文件中引入"../css/format3.css"&#xff1b; 已知一个html文件中引入了一个css文件中&#xff0c;…

2024CAIP省赛

title: 2024CAIP省赛 date: 2024-07-16 22:13:50 tags: 总结 categories: 比赛 文章目录 RC-u1 热҈热҈热҈思路 RC-u2 谁进线下了&#xff1f;思路 RC-u3 暖炉与水豚思路 RC-u4 章鱼图的判断思路代码 RC-u5 工作安排思路 总结写在前面&#xff0c;就一句话 状态的保持胜过少…

Adobe Photoshop 2024 25.9.1 Win/Mac PS2024最新中文学习版

Adobe Photoshop 2024&#xff0c;简称PS&#xff0c;目前最强的图片处理合成软件,PS提供了广泛的工具和功能&#xff0c;包括画笔、铅笔、颜色替换、混合器画笔等绘画工具&#xff0c;以及裁剪、透视变形、智能修复画笔等编辑工具。用户可以使用这些工具进行图片编辑、合成、校…

【Linux】进程信号 --- 信号产生

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…