基于Qt5的图像交互控件开发(C++实现)


前言

博主近期看到海康VM、halcon以及visionpro视觉软件都包含一个图像智能交互控件,然后近期根据其中的技术原理,也基于Qt5仿照开发了一个类似的功能,包含矩形、旋转矩形、任意多边形、圆、圆环、扇环,直线卡尺以及圆卡尺等常用控件,图像智能交互是在计算机视觉领域中常用的技术,用于视觉软件图像ROI,广泛应用于工业自动化、机器视觉等领域。具体效果如下:

Qt5图像智能交互控件


一、图像交互控件

1.1 概述

在机器视觉领域,常用的图像交互控件包括以下几种:

  1. 标注工具(Annotation Tools):标注工具允许用户在图像上进行标注和绘制,例如绘制边界框。这些标注可用于图像分类、目标检测、语义分割等任务的数据标注。

  2. 拖动和调整工具(Drag and Adjust Tools):这些工具允许用户通过拖动或调整图像中的特定区域来进行交互。例如,可以拖动边界框或控制点来调整目标的位置、大小或形状。

  3. 交互式区域选择工具(Interactive Region Selection Tools):这些工具允许用户通过绘制、拖动或选择特定区域来指定感兴趣的区域。例如,用户可以使用矩形选择工具、多边形选择工具或魔棒工具来选择图像中的目标或区域。

  4. 缩放和导航工具(Zoom and Navigation Tools):这些工具用于在图像上进行缩放、平移和导航操作,以便用户可以查看和分析图像的不同部分。常见的缩放和导航工具包括放大、缩小、平移和旋转操作。

  5. 参数调整滑块(Parameter Adjustment Sliders):在机器视觉任务中,一些算法或模型可能需要调整不同的参数或阈值。参数调整滑块允许用户通过滑动滑块来调整参数的值,并实时观察算法或模型的输出变化。

博主采用交互控件写的两个文章如下:
第一个:利用OpenCV与Qt5构建卡尺拟合直线工具(C++实现)
第二个:利用OpenCV与Qt5构建卡尺找圆工具(C++实现)

1.2 图像显示交互功能

本文采用Qt5的QGraphicsView显示图像控件,QGraphicsScene用来管理图形交互控件,Qt5中的QGraphicsView是一个图形视图框架,用于在应用程序中显示和交互2D图形。它是Qt的图形模块(Graphics Module)提供的一部分,为开发者提供了一个灵活的工具来创建基于图形的用户界面。

QGraphicsView的主要功能包括:

  1. 图形显示:QGraphicsView允许开发者在视图中显示2D图形项(Graphics Item),例如图像、文本、几何图形、路径等。这些图形项可以自定义外观、位置和交互行为。

  2. 缩放和平移:通过QGraphicsView,用户可以通过鼠标滚轮或手势来缩放视图中的图形,以及通过鼠标拖动来平移视图。这使用户能够查看和导航大型或超出视图边界的图形。

  3. 坐标系统:QGraphicsView提供了一个坐标系统,允许用户在视图中进行图形项的定位和操作。开发者可以指定视图中的逻辑坐标,并使用这些坐标来添加、移动和变换图形项。

  4. 交互操作:通过QGraphicsView,开发者可以实现丰富的交互功能,例如选择图形项、拖动图形项、缩放选定的图形项等。这些交互操作可以通过重写相应的事件处理函数来实现。

  5. 双缓冲绘制:QGraphicsView使用双缓冲技术,以提供平滑的绘制和动画效果。它可以高效地处理大量图形项的绘制,并自动进行局部更新,以减少绘制的开销。

  6. 视图和场景:QGraphicsView与QGraphicsScene一起使用,QGraphicsScene提供了图形项的容器,并管理它们之间的关系。QGraphicsView充当了场景的视图,用于在窗口中显示场景中的图形项。

1.3 棋盘格功能实现

在这里插入图片描述

图像显示为棋盘格实现代码如下:

void myqgraphicsview::drawBackground(QPainter * painter, const QRectF & rect)
{
    //绘制灰白棋盘图像背景
    int wid = this->geometry().width();
    int hei = this->geometry().height();
    QPointF m_ptCenter = this->mapToScene(wid / 2, hei / 2);
    QPixmap pix(wid, hei);
    QPainter pter(&pix);
    QColor clr_white(Qt::white);
    QColor clr_gray(240, 240, 240, 240);
    int spacing = 15;
    QColor useColor;
    for (int i = 0; i <= floor(wid / spacing); i++)
    {
        for (int j = 0; j <= floor(hei / spacing); j++)
        {
            useColor = ((i + j) % 2 == 0 ? clr_white : clr_gray);
            pter.fillRect(i*spacing, j*spacing, spacing, spacing, useColor);
        }
    }
    painter->drawImage(rect, pix.toImage());
}

1.4 形状控件基类

QAbstractGraphicsShapeItem是Qt中的一个抽象基类,用于表示具有形状的图形项(Graphics Item)。它是QGraphicsItem的子类,用于在QGraphicsScene中显示和操作2D图形。

QAbstractGraphicsShapeItem的主要特征和功能如下:

  1. 形状定义:它定义了一个图形项的形状,可以是矩形、椭圆、多边形等。开发者可以通过重写shape()函数来自定义形状。

  2. 外观样式:它具有一系列用于设置图形项外观的函数,如设置边框颜色、填充颜色、线宽等。通过这些函数,可以定制图形项的外观样式。

  3. 碰撞检测:它提供了一些用于碰撞检测的函数,如collidesWithItem()和collidesWithPath()。这些函数可用于判断图形项与其他图形项或路径是否发生碰撞。

  4. 交互操作:通过重写鼠标事件处理函数,可以实现与QAbstractGraphicsShapeItem的交互操作,如鼠标点击、拖动、移动等。可以根据需要进行自定义的交互行为。

  5. 变换和位置:它继承了QGraphicsItem的功能,可以进行图形项的位置设置、旋转、缩放等变换操作。

QAbstractGraphicsShapeItem是一个抽象基类,不能直接实例化,需要通过继承并重写其纯虚函数来创建具体的形状图形项。常见的具体子类包括QGraphicsRectItem(矩形图形项)、QGraphicsEllipseItem(椭圆图形项)和QGraphicsPolygonItem(多边形图形项)等,它们分别提供了矩形、椭圆和多边形形状的图形项。使用QAbstractGraphicsShapeItem及其子类,开发者可以方便地创建具有形状和外观样式的2D图形项,并在QGraphicsScene中进行显示、交互和操作。这为绘图、图形编辑、数据可视化等应用提供了强大的图形绘制和操作功能。

1.5 鼠标交互实现

    virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override;
    virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override;
    virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override;
    virtual void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
    virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;

二、功能展示

2.1 图像加载

在这里插入图片描述

2.2 图像放大

在这里插入图片描述

2.3 图像缩小

在这里插入图片描述

2.4 图像自适应

在这里插入图片描述

2.5 图像实际大小

在这里插入图片描述

2.6 矩形框控件

在这里插入图片描述

2.7 旋转矩形框控件

在这里插入图片描述

2.8 任意多边形控件

在这里插入图片描述

2.9 圆控件

在这里插入图片描述

2.10同心圆控件

在这里插入图片描述

2.11 扇环控件

在这里插入图片描述

2.12 直线卡尺控件

在这里插入图片描述

2.13 圆卡尺控件

在这里插入图片描述

总结

由于博主能力有限,本篇文章中提及的方法,也难免会有疏漏之处,希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 基于Qt C的雷达显示控件是一个用于显示雷达扫描结果的图形界面工具。它可以根据雷达扫描数据,以图形化的方式呈现目标的位置和运动轨迹。 该控件利用Qt C的绘图功能,可以在界面上绘制雷达扫描区域,并根据雷达数据绘制目标的位置。用户可以根据需要自定义雷达的参数,如扫描区域的大小、雷达波束的角度等。 控件具有实时更新的功能,可以在雷达数据发生变化时,自动更新目标位置和轨迹的显示。用户可以通过控件的接口,获取最新的雷达数据,并根据数据更新界面的显示。 此外,控件还具有一些附加的功能,如目标跟踪和报警。用户可以设置控件自动跟踪某个目标,并根据目标的移动轨迹给出报警。控件还支持鼠标交互操作,用户可以通过鼠标点击界面,选择或操作目标。 基于Qt C的雷达显示控件具有良好的可扩展性和灵活性,可以根据应用的需求进行定制和扩展。用户可以通过编写自定义的图形对象和算法,实现更复杂的雷达显示和处理功能。 总之,基于Qt C的雷达显示控件可以为用户提供一个方便易用的雷达数据可视化工具,帮助他们更直观地理解和分析雷达扫描结果。 ### 回答2: 基于Qt C++的雷达显示控件通常用于在图形界面中显示雷达扫描结果。下面是一个简要的描述: 雷达显示控件通过使用Qt框架提供的绘图功能和信号槽机制来实现。首先,我们可以使用QPainter类来创建一个绘图设备,该设备可以绘制雷达的扇形扫描区域、目标点、线条和文本等。通过设置绘图设备的属性,如颜色、线宽和字体等,可以实现个性化的雷达效果。 接下来,我们需要一个定时器来控制雷达扫描的刷新频率。可以使用QTimer类来创建一个定时器,并将其与绘图设备的刷新函数相关联。在每个定时周期中,绘图设备会清除上一次绘制的内容,并根据新的雷达数据进行重新绘制。这样可以实现连续的雷达扫描效果。 在接收到雷达数据后,我们可以通过信号槽机制将数据传递给雷达显示控件。例如,可以定义一个信号来传递目标点数据,然后在接收到数据之后调用绘图设备的函数来绘制目标点。 此外,还可以对雷达显示控件进行一些功能扩展,如添加鼠标交互功能。通过重写鼠标事件处理函数,可以实现选择目标点或显示目标点信息等操作。 总之,基于Qt C++的雷达显示控件通过使用绘图功能和信号槽机制,能够实现可定制的雷达扫描效果,并支持与外部数据的交互
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值