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

相关推荐
dyxal34 分钟前
A2A 协议 v1.0 完全指南:方法名、Agent Card、三种绑定与 FastAPI 实战
开发语言·qt·fastapi
小豆庄38 分钟前
处理含车牌/人脸的隐私视频,如何做到数据不离机?
opencv·ai·云计算·视频
金色熊族4 小时前
在Qt中使用asan检测内存泄漏(一)
linux·qt·asan
前行中的小猪5 小时前
Qt 5 踩坑实录:多显示器跨屏拖拽导致窗口异常放大与 setGeometry 报错的深度解析与根治
qt·多显示器·高分辨率·多屏幕
想做小南娘,发现自己是女生喵6 小时前
QT项目实战第一周(嵌入式)
开发语言·qt
小徐不徐说7 小时前
C++ 机器视觉入门:从零搭建 AOI 开发环境(OpenCV + CMake)
开发语言·c++·opencv
誰能久伴不乏8 小时前
【无标题】
c++·qt·机器人
金色熊族8 小时前
在Qt中使用asan检测内存泄漏(二)--检查依赖库的内存使用
linux·qt·asan
qq_401700418 小时前
Qt 组播(Multicast)实战详解
开发语言·qt
布莱克6051 天前
QtWidgets 与 QML:两大 UI 开发框架的全面对比
开发语言·c++·qt·ui·架构