ZBLOG

QWidget *videoContainer = ui->widget1; // 创建 Video Widget 用于显示摄像头画面 videoWidget = new QVideoWidget(videoContainer); // 使用布局管理器以便能够适应 widget 的大小变化 (可选) QVBoxLayout *layout = new QVBoxLayout(videoContainer); layout->addWidget(v...

要在Qt中实现视频水平翻转效果,可以通过QGraphicsVideoItem结合QGraphicsScene来实现。以下是完整的代码实现:

// 在原有代码基础上添加以下内容

// 1. 创建图形场景和视频项
QGraphicsScene *scene = new QGraphicsScene(videoContainer);
QGraphicsVideoItem *videoItem = new QGraphicsVideoItem();
scene->addItem(videoItem);

// 2. 设置水平翻转(镜像效果)
videoItem->setTransform(QTransform::fromScale(-1, 1)); // x轴缩放-1实现水平翻转
videoItem->setPos(videoWidget->width(), 0); // 调整位置补偿翻转后的偏移

// 3. 创建图形视图来显示场景
QGraphicsView *graphicsView = new QGraphicsView(scene, videoContainer);
graphicsView->setStyleSheet("background: transparent; border: none;"); // 去除边框和背景

// 4. 替换原有布局中的widget
layout->removeWidget(videoWidget);    // 移除原来的videoWidget
delete videoWidget;                  // 删除原对象
layout->addWidget(graphicsView);      // 添加新的视图

// 5. 设置摄像头输出到新的视频项
if (!cameras.isEmpty()) {
    if(camera) camera->stop();       // 如果已有摄像头先停止
    
    camera = new QCamera(cameras.first());
    camera->setViewfinder(videoItem); // 注意这里改为videoItem而不是videoWidget
    camera->start();
}

关键点说明:

  1. QTransform::fromScale(-1,1)实现了水平镜像效果,x坐标乘以-1
  2. setPos()补偿了翻转后图像的位置偏移
  3. QGraphicsView提供了容器来显示带特效的视频流

替代方案:如果不想使用图形视图框架,也可以考虑OpenGL方式:

// OpenGL方式(需要继承QAbstractVideoSurface)
class MirrorVideoSurface : public QAbstractVideoSurface { /*...*/ };

注意:这种方法会消耗稍多资源,但对现代硬件影响不大。如需更高性能,可以考虑在底层使用FFmpeg滤镜或Shader实现翻转。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23848

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?