【Qt&OpenCV 图像旋转getRotationMatrix2D】

简介: 【Qt&OpenCV 图像旋转getRotationMatrix2D】

前言

越来越多的开发人员选择基于开源的Qt框架与OpenCV来实现界面和算法,其原因不单单是无版权问题,更多是两个社区的发展蓬勃,可用来学习的资料与例程特别丰富。以下是关于图像旋转的介绍,主要函数:getRotationMatrix2D 和 warpAffine。

软件版本:Qt-5.12.0/OpenCV-4.5.3

平台:Windows10/11–64


一、函数介绍

1、getRotationMatrix2D

函数原型:

cv::getRotationMatrix2D(Point2f center, double angle, double scale);

参数解释:

center:源图像的旋转中心;

angle:旋转角度,正值表示逆时针;

scale:各向同性比例因子;

2、warpAffine

函数原型:

cv::warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

参数解释:

src:输入图像;

dst:输出图像,尺寸由dsize指定,图像类型与原图像一致;

M:2*3的变换矩阵;;

dsize:制定图像输出尺寸;

flags:插值算法标识符,有默认值INTER_LINEAR;

borderMode:边界像素模式,有默认值BORDER_CONSTANT;

borderValue:边界取值,有默认值Scalar()即0;

二、演示

1、Qt构建GUI

如上图创建Rotate的功能按钮QPushButton, QSpinBox用来输入旋转角度;

2、实现代码

rotateBtn按钮的clicked()槽函数:

void MainWindow::on_rotateBtn_clicked()
{
    std::size_t numView = ui->tabWidget->currentIndex() % 4;  // 获取当前窗口号
    int degree = ui->rotateSpin->value();   // 读取旋转角度值
    if (degree != 0 && !dispMat[numView]->empty())
    {
        // double radian = degree / 180.0 * CV_PI;

        //填充图像
        /*
        int maxBorder = static_cast<int>((cv::max(dispMat[numView]->cols,\
                              dispMat[numView]->rows)*1.414));
        int dx = (maxBorder - dispMat[numView]->cols)/2;
        int dy = (maxBorder - dispMat[numView]->rows)/2;
        cv::copyMakeBorder(*dispMat[numView], *dispMat[numView],
                   dy, dy, dx, dx, cv::BORDER_CONSTANT);
        */

        //旋转
        cv::Point2f center(dispMat[numView]->cols/2, \
                   dispMat[numView]->rows/2);
        cv::Mat affine_matrix = cv::getRotationMatrix2D(center, degree, 1.0);   // 计算旋转矩阵
        cv::warpAffine(*dispMat[numView], *dispMat[numView], \              // 仿射变换
               affine_matrix, dispMat[numView]->size());

        //计算图像旋转后包含图像的最大矩形
        /*
        double sinVal = std::abs(std::sin(radian));
        double cosVal = std::abs(std::cos(radian));
        cv::Size targetSize(static_cast<int>(dispMat[numView]->cols * cosVal +\
                         dispMat[numView]->rows *sinVal),
                static_cast<int>(dispMat[numView]->cols * sinVal +\
                         dispMat[numView]->rows * cosVal));
        */
        //剪掉多余边框
        /*
        int x = std::abs((dispMat[numView]->cols - targetSize.width)) / 2;
        int y = std::abs((dispMat[numView]->rows - targetSize.height)) / 2;
        cv::Rect rect(x, y, targetSize.width, targetSize.height);
        *dispMat[numView] = cv::Mat(*dispMat[numView], rect); // something wrong
        */

        cvtMatPixmap(dispMat, dispPixmap, numView);
        outputInfo(1, tr("Rotate Action Done."));
    }
    else
    {
        outputInfo(2, tr("Please check the Degree or Mat Exist!"));
    }

}

总结

以上是关于利用Qt构建按GUI,利用OpenCV的getRotationMatrix2D和warpAffine函数实现图像旋转的演示。其中图像旋转后适配之前图像帧的问题未进行优化。

其中疑问或错误,欢迎联系交流

目录
相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
154 7
|
3月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
182 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
595 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
57 4
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
3月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
66 10
|
3月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
108 0
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
4月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
4月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
135 1
|
4月前
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
108 1

推荐镜像

更多