Qt音视频开发37 您所在的位置:网站首页 qt画一个点 Qt音视频开发37

Qt音视频开发37

2023-04-14 02:50| 来源: 网络整理| 查看: 265

一、前言

在和视频交互过程中,用户一般需要在显示视频的通道上点击对应的区域,弹出对应的操作按钮,将当前点击的区域或者绘制的多边形区域坐标或者坐标点集合,发送出去,通知其他设备进行处理。比如识别到很多人脸,用户单击某个人脸后指定对该人脸进行详细的信息查询等;再比如圈出某个区域发给人工智能处理设备,对指定区域进行越界处理,一旦某个物体入侵到这个区域则立即报警。所以就需要在显示的视频中识别到用户点击处的像素坐标,将鼠标按下处的屏幕坐标转换为真实的图片画面的像素坐标,这里有三种情况需要处理,一种是拉伸填充过的画面,一种是等比例缩放过的画面,还有一种是在显示窗体尺寸大于视频分辨率尺寸的情况下直接显示原视频尺寸(显示窗体是1000x800,真实分辨率是640x480则直接按照640x480显示)。

为了能够拿到真实的像素坐标,亲自测试了几十种办法,各种坐标换算,当视频尺寸小于控件尺寸的情况是最容易计算的,只需要将点击的坐标减去左上角的坐标即可,其次就是拉伸填充的画面相对复杂一点,需先计算按下坐标和控件尺寸对应的系数比,一般需要设定成double精度类型,然后去乘以真实的视频尺寸就行;最难的就是等比例缩放过的,可能宽度大于也可能高度大于,或者宽高都大于的情况。总之为了兼容三种不同的画面显示策略情况,尽量采用一种计算方式,比如万能大法就是采用计算系数再乘以尺寸的方式。按照这个思路,刚好之前的视频控件就是按照这个策略设计的,在显示视频的控件中,里面套了一个窗体,该控件就是永远拉伸填充的,但是该控件的大小就是按照用户设定的大小来调整的,所以只需要识别鼠标按下后对应在这个控件的坐标即可。打完收工完成。

二、效果图三、体验地址国内站点:https://gitee.com/feiyangqingyun国际站点:https://github.com/feiyangqingyun个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_demo/bin_linux_video。四、相关代码bool AbstractVideoWidget::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::MouseButtonPress) { //正在运行中的视频 if (isRunning && !onlyAudio) { QMouseEvent *e = (QMouseEvent *)event; QPoint p = hwndWidget->mapFromParent(e->pos()); //过滤在绘图区域里面 if (hwndWidget->rect().contains(p)) { int x = (double)p.x() / hwndWidget->width() * videoWidth; int y = (double)p.y() / hwndWidget->height() * videoHeight; emit sig_receivePoint(QPoint(x, y)); } } } return QWidget::eventFilter(watched, event); } void frmPlayer::receivePoint(const QPoint &point) { int x = point.x(); int y = point.y(); qDebug()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有