【Qt&OpenCV 图像的感兴趣区域ROI】

简介: 【Qt&OpenCV 图像的感兴趣区域ROI】

图像的ROI(region of interest)是指图像中感兴趣区域。在OpenCV中图像设置图像ROI区域,实现只对ROI区域操作。

前言

越来越多的开发人员选择基于开源的Qt框架与OpenCV来实现界面和算法,其原因不单单是无版权问题,更多是两个社区的发展蓬勃,可用来学习的资料与例程特别丰富。以下是关于利用Qt的rubberBand和OpenCV进行图像的ROI区域获取

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

平台:Windows10/11–64


一、GUI


二、实现代码

1、Rubber

void MainWindow::on_graphicsView_1_rubberBandChanged(const QRect &viewportRect, const QPointF &fromScenePoint, const QPointF &toScenePoint)
{
    rubberFunc(viewportRect, fromScenePoint, toScenePoint);
}
void MainWindow::rubberFunc(const QRect &viewportRect, const QPointF &fromScenePoint, const QPointF &toScenePoint)
{

    size_t numView = ui->tabWidget->currentIndex() % 3;

    QPoint topLeft = viewportRect.topLeft();

    int x1 = topLeft.x();

    double xFromScene = fromScenePoint.x();
    double yFromScene = fromScenePoint.y();
    double xToScene = toScenePoint.x();
    double yToScene = toScenePoint.y();

    if (x1 != 0)
    {
        ui->rubberX1Spin->setValue(static_cast<int>(xFromScene));
        ui->rubberY1Spin->setValue(static_cast<int>(yFromScene));
        ui->rubberX2Spin->setValue(static_cast<int>(xToScene));
        ui->rubberY2Spin->setValue(static_cast<int>(yToScene));
        *tmpMat = dispMat[numView]->clone();
        cv::rectangle(*tmpMat, cv::Point(static_cast<int>(xFromScene), static_cast<int>(yFromScene)), \
                      cv::Point(static_cast<int>(xToScene), \
                                static_cast<int>(yToScene)), \
                      cv::Scalar(0, 0, 255), 1, 1, 0);
    }

    if (tmpMat->channels() == 3)
    {
        QImage tmpImage = QImage(tmpMat->data, tmpMat->cols,tmpMat->rows, \
             static_cast<int>(tmpMat->step), \
             QImage::Format_RGB888);
        dispPixmap[numView]->setPixmap(QPixmap::fromImage(tmpImage.rgbSwapped()));
    }
    else
    {
        QImage tmpImage = QImage(tmpMat->data, tmpMat->cols,tmpMat->rows, \
             static_cast<int>(tmpMat->step), \
             QImage::Format_Grayscale8);
        dispPixmap[numView]->setPixmap(QPixmap::fromImage(tmpImage.rgbSwapped()));
    }
}

2、ROI

void MainWindow::on_maskBtn_clicked()
{
    size_t numView = ui->tabWidget->currentIndex() % 3;

    int x1 = ui->roiX1Spin->value();
    int y1 = ui->roiY1Spin->value();
    int x2 = ui->roiX2Spin->value();
    int y2 = ui->roiY2Spin->value();

    if ((x1 == 0)&&(y1 == 0)&&(x2 == 0)&&(y2 == 0))
    {
        outputInfo(2, tr("Please check the Points."));
        return;
    }

    cv::Rect maskRect(x1, y1, x2 - x1, y2 - y1);
    cv::Mat maskMat = cv::Mat::zeros(dispMat[numView]->size(), \
                                     CV_8UC1);
    tmpMat->zeros(dispMat[numView]->size(), \
                  dispMat[numView]->type());

    maskMat(maskRect).setTo(255);
    dispMat[numView]->copyTo(*tmpMat, maskMat);

    if (ui->roiChkBox->isChecked())
    {
        *dispMat[numView] = tmpMat->clone();
        cvtMatPixmap(dispMat, dispPixmap, numView);
    }
    else
    {
        if (tmpMat->channels() == 3)
        {
            QImage tmpImage = QImage(tmpMat->data, tmpMat->cols,tmpMat->rows, \
                         static_cast<int>(tmpMat->step), \
                         QImage::Format_RGB888);
            dispPixmap[numView]->setPixmap(QPixmap::fromImage(tmpImage.rgbSwapped()));
        }
        else
        {
            QImage tmpImage = QImage(tmpMat->data, tmpMat->cols,tmpMat->rows, \
                         static_cast<int>(tmpMat->step), \
                         QImage::Format_Grayscale8);
            dispPixmap[numView]->setPixmap(QPixmap::fromImage(tmpImage.rgbSwapped()));
        }

    }
    outputInfo(1, tr("Mask done."));
}

void MainWindow::on_roiBtn_clicked()
{
    size_t numView = ui->tabWidget->currentIndex() % 3;

    int x1 = ui->roiX1Spin->value();
    int y1 = ui->roiY1Spin->value();
    int x2 = ui->roiX2Spin->value();
    int y2 = ui->roiY2Spin->value();

    if ((x1 == 0)&&(y1 == 0)&&(x2 == 0)&&(y2 == 0))
    {
        outputInfo(2, tr("Please check the Points."));
        return;
    }

    cv::Rect maskRect(x1, y1, x2 - x1, y2 - y1);
    cv::Mat roiMat = (*dispMat[numView])(maskRect);
    *tmpMat = roiMat.clone();

    if (ui->roiChkBox->isChecked())
    {
        *dispMat[numView] = tmpMat->clone();
        cvtMatPixmap(dispMat, dispPixmap, numView);
    }
    else
    {
        if (tmpMat->channels() == 3)
        {
            QImage tmpImage = QImage(tmpMat->data, tmpMat->cols,tmpMat->rows, \
                         static_cast<int>(tmpMat->step), \
                         QImage::Format_RGB888);
            dispPixmap[numView]->setPixmap(QPixmap::fromImage(tmpImage.rgbSwapped()));
        }
        else
        {
            QImage tmpImage = QImage(tmpMat->data, tmpMat->cols,tmpMat->rows, \
                         static_cast<int>(tmpMat->step), \
                         QImage::Format_Grayscale8);
            dispPixmap[numView]->setPixmap(QPixmap::fromImage(tmpImage.rgbSwapped()));
        }

    }

    outputInfo(1, tr("roiMat done."));

}


总结

以上是关于利用Qt进行GUI构建并使用rubberBandChanged进行roi区域获取,或者直接使用OpenCV的roiMat()进行感兴趣区域获取。

目录
相关文章
|
20天前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
31 4
|
30天前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
28天前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
59 1
|
1月前
|
机器人 计算机视觉
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
44 2
|
1月前
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
34 1
|
2月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
2月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
|
2月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
144 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
1月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
47 0
|
25天前

推荐镜像

更多