m0_68620886 2023-11-23 13:17 采纳率: 26.7%
浏览 28
已结题

海思+qt显示实时视频,一般需要怎么操作

现在能通过vo输出到HDMI,不知道如何在qt上实时显示视频

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-11-23 13:18
    关注

    引自强大而免费的微信小程序:皆我百晓生

    1. 确定海思平台和Qt的准备工作

    • 确保你已经搭建好了海思平台,包括安装好了对应的SDK和开发环境。
    • 确保你已经安装好了Qt开发环境,并且能够成功创建和编译Qt项目。

    2. 配置Qt项目

    • 在Qt项目中,首先需要创建一个Widget窗口来实时显示视频。可以使用Qt的QLabel控件来显示视频流。

    例如,在Qt的ui界面文件中添加一个QLabel控件:

    <widget class="QLabel" name="videoLabel">
        <property name="geometry">
            <rect>
                <x>10</x>
                <y>10</y>
                <width>640</width>
                <height>480</height>
            </rect>
        </property>
        <property name="text">
            <string>TextLabel</string>
        </property>
    </widget>
    

    然后在对应的源文件中,实现获取和显示视频流的功能。

    3. 获取视频流

    • 根据海思平台的接口文档,使用相应的函数或方法来获取实时视频流。具体的实现方法需要根据海思平台的SDK来确定,可以参考海思平台提供的示例代码。
    • 对于海思平台,一般需要调用相关API来初始化视频捕获设备、设置视频格式和刷新率,并通过捕获接口获取视频数据。

    例如,可以使用海思的函数HI_MPI_VI_GetChnFrame() 来获取摄像头采集到的视频帧数据。

    HI_VIDEO_FRAME_INFO_S stFrameInfo;
    memset(&stFrameInfo, 0, sizeof(HI_VIDEO_FRAME_INFO_S));
    
    HI_S32 s32Ret = HI_MPI_VI_GetChnFrame(0, &stFrameInfo, 0);
    

    4. 显示视频流

    • 一般情况下,获取到的视频帧数据是YUV格式的,需要进行格式转换才能在Qt窗口中显示出来。

    • 可以使用Qt的QImage类来进行格式转换,并在QLabel控件中显示图片。

      例如,可以使用以下代码将YUV数据转换为RGB格式:

    QImage convertYUVtoRGB(unsigned char* yuvdata, int width, int height)
    {
        QImage img(width, height, QImage::Format_RGB32);
        unsigned char* rgbdata = img.bits();
        
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                unsigned char Y = yuvdata[y * width + x];
                unsigned char U = yuvdata[(y / 2) * (width / 2) + (x / 2) + width * height];
                unsigned char V = yuvdata[(y / 2) * (width / 2) + (x / 2) + width * height * 5 / 4];
    
                int C = Y - 16;
                int D = U - 128;
                int E = V - 128;
    
                int R = (298 * C + 409 * E + 128) >> 8;
                int G = (298 * C - 100 * D - 208 * E + 128) >> 8;
                int B = (298 * C + 516 * D + 128) >> 8;
    
                R = qBound(0, R, 255);
                G = qBound(0, G, 255);
                B = qBound(0, B, 255);
    
                rgbdata[y * width + x] = qRgb(R, G, B);
            }
        }
        
        return img;
    }
    
    • 将转换后的图像显示在QLabel控件上:
    QImage rgbImage = convertYUVtoRGB(stFrameInfo.pVirAddr[0], stFrameInfo.stVFrame.u32Width, stFrameInfo.stVFrame.u32Height);
    ui->videoLabel->setPixmap(QPixmap::fromImage(rgbImage));
    

    5. 实时显示

    • 在获取并转换视频帧后,需要不断地更新QLabel控件中的图像,实现实时显示的效果。

    可以使用Qt的QTimer类来定时刷新图像:

    在Qt界面的初始化函数中,添加以下代码:

    QTimer* timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateVideo()));
    timer->start(30);
    

    然后在槽函数updateVideo()中,调用获取和显示视频帧的代码:

    void MainWindow::updateVideo()
    {
        // 获取视频帧
        HI_VIDEO_FRAME_INFO_S stFrameInfo;
        memset(&stFrameInfo, 0, sizeof(HI_VIDEO_FRAME_INFO_S));
        HI_S32 s32Ret = HI_MPI_VI_GetChnFrame(0, &stFrameInfo, 0);
    
        // 显示视频帧
        QImage rgbImage = convertYUVtoRGB(stFrameInfo.pVirAddr[0], stFrameInfo.stVFrame.u32Width, stFrameInfo.stVFrame.u32Height);
        ui->videoLabel->setPixmap(QPixmap::fromImage(rgbImage));
    }
    

    参考链接:

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月25日
  • 创建了问题 11月23日

悬赏问题

  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link
  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵