文章目录
前言
在图像处理和计算机视觉的应用中,我们经常需要对图像进行各种变换,如旋转、缩放、剪切等。同时,为了评估算法的性能,我们也需要对代码的执行时间进行精确的测量。OpenCV提供了一系列的函数和方法,使得这些任务变得简单而直接。
Qt是一个跨平台的应用程序开发框架,它提供了一套完整的图形用户界面库,以及丰富的工具和库,包括线程、网络、数据库和多媒体等。结合OpenCV,我们可以在Qt中创建强大的图像处理和计算机视觉应用。
本文将介绍如何在Qt应用程序中使用OpenCV进行图像变换,以及如何使用Qt的计时函数进行性能测量。
计算时间函数
getTickCount
和getTickFrequency
是两个常用于计算代码执行时间的函数,它们都被定义在OpenCV的core.hpp
文件中。
-
getTickCount
函数:- 函数原型:
DWORD GetTickCount();
- 作用:该函数返回从操作系统启动到当前所经过的计时周期数(以毫秒为单位)。这个函数可以用来初始化cv::RNG或者通过在函数调用前后读取tick count来测量函数执行时间。
- 函数原型:
-
getTickFrequency
函数:- 函数原型:
double getTickFrequency();
- 作用:该函数返回CPU的频率,也就是每秒的计时周期数。这个函数常与
getTickCount
一起使用,用于计算代码的执行时间。
- 函数原型:
例如,你可以使用以下代码来计算某段代码的执行时间:
cpp
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的图像变换其实就是矩阵的变换,这里不多介绍
旋转
-
cv::transpose函数
函数原型:
cv::transpose(src, dst)
- src:输入图像,其矩阵需要被转置。
- dst:输出图像,与源图像具有相同的大小和深度。这是一个可选参数。
cv::transpose
函数用于对2D数组进行转置。转置操作会交换矩阵的行和列。 -
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
函数中,dsize
和fx, fy
是用来控制图像缩放的参数。-
dsize :这是一个
Size
对象,表示目标图像的期望大小。例如,如果你想将图像的大小调整为宽度为800像素,高度为600像素,那么你可以设置dsize
为Size(800, 600)
。 -
fx, fy :这两个参数是缩放因子,用于控制图像在水平方向(fx)和垂直方向(fy)上的缩放比例。例如,如果你想将图像在水平方向上放大2倍,在垂直方向上缩小一半,那么你可以设置
fx
为2.0,fy
为0.5。 -
dsize
和fx, fy
之间的关系是,如果dsize
不是零,那么fx
和fy
会被忽略。换句话说,如果你指定了dsize
,那么图像将被调整到你指定的大小,而不考虑fx
和fy
的值。如果dsize
是零,那么fx
和fy
会被用来计算目标图像的大小。 -
缩放因子的影响主要体现在图像的大小和内容的变化上。如果缩放因子大于1,那么图像会被放大,图像的内容会被拉伸。如果缩放因子小于1,那么图像会被缩小,图像的内容会被压缩。如果缩放因子等于1,那么图像的大小和内容不会发生变化。
-
-
interpolation:插值方法,有以下几种可选:
cv::INTER_NEAREST
:最近邻插值,速度最快,但质量最差。cv::INTER_LINEAR
:线性插值,速度较快,质量较好。cv::INTER_AREA
:区域插值,适用于图像缩小,速度较慢,质量最好。cv::INTER_CUBIC
:三次样条插值,速度适中,质量较好。cv::INTER_LANCZOS4
:Lanczos插值,速度适中,质量较好。
以下是一个使用cv::resize
函数的C++代码示例:
cpp
#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强大功能的冰山一角。通过进一步的学习和实践,你可以利用这两个工具来创建更复杂的图像处理和计算机视觉应用程序。希望本文能为你的学习之旅提供帮助。记住,实践是最好的老师,所以不断实践和尝试新的项目是提高技能的最好方式。祝你学习愉快!