我的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

相关推荐
Littlehero_12129 分钟前
QT自定义控件之电气接线图(源码开源)
开发语言·qt
泡干脆面就番茄43 分钟前
03_LBPH人脸识别算法原理与实战
python·opencv
qq762118221 小时前
Ubuntu22.04 Qt 调用shell 脚本启动程序,GLFW 初始化失败
qt
蓝悦无人机2 小时前
Qt Design Studio(QDS)4.8.2项目文件结构详解
开发语言·qt·qt creator·qds·项目文件结构·qtc
qq_401700416 小时前
Qt窗体大小控制从resize到自适应
开发语言·qt
Quz6 小时前
QML SwipeView:手势翻页与自定义指示器
qt
Quz6 小时前
QML TabBar组件与容器索引的绑定
qt
大熊背6 小时前
一种用于随机值脉冲噪声的检测统计量
图像处理·opencv·计算机视觉
欧特克_Glodon7 小时前
OpenCV计算机视觉开发入门与实践<三十八>:图像添加数字水印
c++·人工智能·opencv·计算机视觉
欧特克_Glodon7 小时前
OpenCV计算机视觉开发入门与实践<四十>:自动识别物体数量
c++·人工智能·opencv·计算机视觉