我的Qt作品(20)使用Qt+OpenCV写一个旋转/抠图/mask生成工具

使用Qt+OpenCV写一个旋转/抠图/mask生成工具

1、旋转功能

cpp 复制代码
void FormRotate::rotateImage(const cv::Mat &src, cv::Mat &dst, double degree) //旋转
{
    if (fabs(degree) < 0.001)
    {
        dst = src;
        return;
    }

    //center旋转的中心点坐标
    //degree旋转的角度,不是弧度,>0逆时针,<0顺时针
    //scale图像缩放比例
    int width = src.cols;
    int height = src.rows;
    cv::Point2f center(width / 2, height / 2);
    cv::Mat M = cv::getRotationMatrix2D(center, degree, 1.0);

    //旋转,保持分辨率不变,周边涂黑
    cv::warpAffine(src, dst, M, cv::Size(width, height));
}

2、抠图功能

支持roi矩形,框选之后,抠图

cpp 复制代码
    CUtil uti;
    cv::Rect r = cv::Rect(vtRect[0].x(), vtRect[0].y(), vtRect[0].width(), vtRect[0].height());
    cv::Rect big = cv::Rect(0, 0, m_matSrc.cols, m_matSrc.rows);
    if (!uti.isRectInside(r, big))
    {
        QMessageBox bbox(QMessageBox::Critical, tr("错误"), QObject::tr("抠图失败!矩形ROI不能在图片范围之外!"));
        bbox.setButtonText(QMessageBox::Ok, QObject::tr("确定"));
        bbox.exec();
        return;
    }

    try
    {
        cv::Mat crop = m_matSrc(r);
        QImage image = uti.cvMat2QImage(crop);
        ui->widget_dst->setImage(image, true);
    }
    catch (...)
    {
        QImage image;
        ui->widget_dst->setImage(image, true);

        QMessageBox bbox(QMessageBox::Critical, tr("错误"), QObject::tr("抠图失败!算法异常!"));
        bbox.setButtonText(QMessageBox::Ok, QObject::tr("确定"));
        bbox.exec();
        return;
    }

3、mask生成功能

支持roi矩形,圆形和多边形,指定区域生成mask图片

cpp 复制代码
    int sz3 = (int)vtPy.size(); //多边形
    for (int k = 0; k < sz3; k++)
    {
        cv::Mat mask = cv::Mat::zeros(m_matSrc.rows, m_matSrc.cols, m_matSrc.type());
        std::vector<cv::Point> pp;
        for (int m = 0; m < vtPy[k].size(); m++)
        {
            pp.push_back(cv::Point(vtPy[k][m].x(), vtPy[k][m].y()));
        }

        cv::fillPoly(mask, pp, cv::Scalar(255, 255, 255));

        cv::Rect r = cv::boundingRect(pp); //最小外接矩形
        cv::Rect big = cv::Rect(0, 0, m_matSrc.cols, m_matSrc.rows);
        if (!uti.isRectInside(r, big))
        {
            QMessageBox bbox(QMessageBox::Critical, tr("错误"), QObject::tr("生成mask失败!ROI不能在图片范围之外!"));
            bbox.setButtonText(QMessageBox::Ok, QObject::tr("确定"));
            bbox.exec();
            return;
        }

        cv::bitwise_or(dst, mask, dst); //合并mask
    }

423776537@qq.com

相关推荐
布茹 ei ai31 分钟前
QtWeatherApp - 简单天气预报软件(C++ Qt6)(附源码)
开发语言·c++·qt·开源·开源项目·天气预报
奇树谦1 小时前
Qt QDockWidget 深度解析:从基础使用到可保存布局的工程级主界面
开发语言·qt
骄傲的心别枯萎2 小时前
RV1126 NO.57:ROCKX+RV1126人脸识别推流项目之读取人脸图片并把特征值保存到sqlite3数据库
数据库·opencv·计算机视觉·sqlite·音视频·rv1126
不会c嘎嘎3 小时前
初识QT -- 第一个QT程序
开发语言·qt
深蓝海拓3 小时前
PySide6从0开始学习的笔记(八) 控件(Widget)之QSlider(滑动条)
笔记·python·qt·学习·pyqt
charlee444 小时前
为什么协程能让程序不再卡顿?——从同步、异步到 C++ 实战
qt·协程·异步编程·gui卡顿·boost.coroutine2
YY&DS4 小时前
《Qt 手写 HTTP 登录服务实战》
开发语言·qt·http
中年程序员一枚4 小时前
cv2.sqrBoxFilter 是 OpenCV 中用于计算像素邻域平方和的盒式滤波函数
人工智能·opencv·计算机视觉
木千4 小时前
Qt中关于QLineEdit控件的editingFinished信号执行两次的处理方式
开发语言·qt
棒棒的皮皮4 小时前
【OpenCV】Python图像处理之平滑处理
图像处理·python·opencv·计算机视觉