opencv 图片缩放旋转

  1. Mat

cv::Mat Mat(int rows, int cols, int type);

Mat imgRot(2,3, CV_32FC1)

初始化

  1. CV_32FC1
  • 32F32‑bit float 单精度浮点数
  • C11 个通道

2x3 的 仿射矩阵

32FC1 32为float C1 一个通道

  1. getRotationMatrix2D

Mat getRotationMatrix2D(Point2f center, double angle, double scale);

根据中心坐标、旋转角度、缩放参数 生成旋转仿射矩阵

angle > 0 顺时针 < 0 逆时针 取值 -360 ~ 360

scale > 1 放大 < 1 缩小 取值 0 ~ 2

  1. warpAffine

void warpAffine(

InputArray src,

OutputArray dst,

InputArray M,

Size dsize,

int flags = INTER_LINEAR,

int borderMode = BORDER_CONSTANT,

const Scalar& borderValue = Scalar()

);

作用:使用2x3的仿射矩阵,对图像进行(旋转、缩放、剪切,平移)仿射变换,将变换后的图片存入 imgDst

复制代码
QString imgPath = "xxxxxx";

Mat imgSrc = imread(imgPath.toStdString());
cvtColor(imgSrc, imgSrc, COLOR_BGR2RGB);

//设置仿射矩阵
Mat imgRot(2, 3, CV_32FC1);

// 求旋转矩阵
int angle = 50;
int scanle = 0.6;
imgRot = getRotateMarix2D(imgSrc,angle,scaled);

//旋转
Mat imgDst;
warpAffian(imgSrc, imgDst, imgRot, imgSrc.size());

ui->lable->setPixmap(QImage::fromImage(QImage((const unsinged char*)imgDst.data, imgDst.cols, imgDst.rows, static_cast<int>(imgDst.step, QImage::Format_RGB888))));

scalerotate.h

cpp 复制代码
#ifndef SCALEROTATE_H
#define SCALEROTATE_H

#include <QWidget>
#include <opencv2/opencv.hpp>

using namespace cv;
namespace Ui {
class ScaleRotate;
}

class ScaleRotate : public QWidget
{
    Q_OBJECT

public:
    explicit ScaleRotate(QWidget *parent = nullptr);
    ~ScaleRotate();

    void initmainwindow();
    void imgShow();
    void imgProc(float angle, float scaled);

private slots:
    void on_verticalSlider_valueChanged(int value);
    void on_horizontalSlider_valueChanged(int value);

private:
    Ui::ScaleRotate *ui;

    Mat myImg;
    QImage myQImg;
    int angle, scaled;
};

#endif // SCALEROTATE_H

scalerotate.cpp

cpp 复制代码
#include "scalerotate.h"
#include "ui_scalerotate.h"

#include <QDebug>

ScaleRotate::ScaleRotate(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ScaleRotate)
{
    ui->setupUi(this);

    setFixedSize(this->size());

    initmainwindow();


}

ScaleRotate::~ScaleRotate()
{
    delete ui;
}

void ScaleRotate::initmainwindow()
{
    angle = ui->horizontalSlider->value();    // -360 ~ 360
    scaled = ui->verticalSlider->value();   // 0 ~ 2    0 ~ 1 缩小 1 ~ 2 放大

//    ui->label->resize(1387,663);
    QString filePath = R"(D:\new_share\016_opencv\OpencvBlend\6.webp)";
    Mat imgData = imread(filePath.toStdString());
    cvtColor(imgData, imgData, COLOR_BGR2RGB);
    myImg = imgData;
    myQImg = QImage((const unsigned char *)imgData.data, imgData.cols, imgData.rows, static_cast<int>(imgData.step), QImage::Format_RGB888);
    imgShow();
}

void ScaleRotate::imgShow()
{
    ui->label->setPixmap(QPixmap::fromImage(myQImg));
}

void ScaleRotate::imgProc(float angle, float scaled)
{
    // 设置仿射矩阵
    Mat imgRot(2, 3, CV_32FC1);

    // 求图片中心坐标
    Mat imgSrc = myImg;
    Point centerPoint = Point(imgSrc.cols/2, imgSrc.rows/2);

    // 按 中心坐标,旋转角度,缩放参数 求旋转 仿射矩阵
    imgRot = getRotationMatrix2D(centerPoint, angle, scaled);

    // 求旋转 后的图片数据 放入 imgDst
    Mat imgDst;
    warpAffine(imgSrc,imgDst,imgRot,Size(ui->label->width(),ui->label->height()));

    myQImg = QImage((const unsigned char*)imgDst.data,imgDst.cols, imgDst.rows, static_cast<int>(imgDst.step),QImage::Format_RGB888);
    imgShow();

}

void ScaleRotate::on_verticalSlider_valueChanged(int value)
{
    scaled = value;
    imgProc(angle - 360, scaled/100.0);
}

void ScaleRotate::on_horizontalSlider_valueChanged(int value)
{
    angle = value;
    imgProc(angle - 360, scaled/100.0);
}

scalerotate.ui

相关推荐
TaoMetrix12 小时前
TaoMetrix:AI 硬件创业公司如何做好原型制造
人工智能·制造
智圣新创0112 小时前
面向多级组织协同场景 高校第二课堂一站式管理中枢落地全场景实操答疑
大数据·人工智能
cd_9492172112 小时前
AI纹理和Substance Painter手绘纹理哪个更适合游戏资产制作?
人工智能·游戏·substance painter
sali-tec12 小时前
C# 基于OpenCv的视觉工作流-章106-差值追踪
图像处理·人工智能·opencv·算法·计算机视觉
Shockang12 小时前
用 AI 打造高品质 Web 应用
人工智能
l12586512 小时前
# LangGraph Memory机制深度解析:短期记忆与长期记忆的工程实践
前端·人工智能·python·langchain·bootstrap
手写码匠13 小时前
Dify 多 Agent 工具权限与安全沙箱实战:让智能体“有能力,但不越权“
人工智能·深度学习·算法·aigc
ZGIAI13 小时前
ZGI Skill Loop:给工具调用设边界
人工智能·架构
黎阳之光13 小时前
打破堆场感知黑盒:黎阳之光视频孪生,构建港口码头网格化透明管控新体系
大数据·人工智能·算法·安全·数字孪生
ZGIAI13 小时前
ZGI 工作区权限:用户为何看不到资源
人工智能·架构