Qt5.15.2 Camera的怪问题Ghost Win10中QImage::fromData不能得到有效图片

2023-05-16

同时安装了两个操作系统,一模一样的代码,在其中一个官网下载的win10系统中是运行没有问题的,代码如下,

static QImage imageFromVideoFrame(const QVideoFrame& buffer){
    QImage img;
    QVideoFrame frame(buffer);  // make a copy we can call map (non-const) on
    frame.map(QAbstractVideoBuffer::ReadOnly);
    QImage::Format imageFormat = QVideoFrame::imageFormatFromPixelFormat(
                frame.pixelFormat());
    // BUT the frame.pixelFormat() is QVideoFrame::Format_Jpeg, and this is
    // mapped to QImage::Format_Invalid by;
    // QVideoFrame::imageFormatFromPixelFormat
    if (imageFormat != QImage::Format_Invalid) {
        img = QImage(frame.bits(),
                     frame.width(),
                     frame.height(),
                     // frame.bytesPerLine(),
                     imageFormat);
    } else {
        // e.g. JPEG
        int nbytes = frame.mappedBytes();
        img = QImage::fromData(frame.bits(), nbytes);
    }
}

但是,在我的另一个Ghost Win10的系统中, img = QImage::fromData(frame.bits(), nbytes); 返回的一直是invalid,无法获取正常的图像;

有人改写成下面的样子(原文链接:https://blog.csdn.net/jack_20/article/details/106735523),

bool present(const QVideoFrame &frame)
{
    if (frame.isValid()) {
        QVideoFrame cloneFrame(frame);
        cloneFrame.map(QAbstractVideoBuffer::ReadOnly);
        int format= QVideoFrame::imageFormatFromPixelFormat(cloneFrame.pixelFormat());
        if (format != QImage::Format_Invalid)
        {
            QImage image(cloneFrame.bits(),
                         cloneFrame.width(),
                         cloneFrame.height(),
                         cloneFrame.bytesPerLine(),
                         format);
            //do something
        }
        else {
            if (cloneFrame.pixelFormat() == QVideoFrame::Format_YUYV)
            {
                int nbytes = cloneFrame.mappedBytes();
                char *rgb24 = new char[nbytes*2]();
                convert_yuv_to_rgb_buffer((unsigned char*)cloneFrame.bits(), (unsigned char*)rgb24, cloneFrame.width(), cloneFrame.height());
                //不用QT的话,这里可以直接把图片rgb24buffer写入文件image.bmp中,
                //注意保存格式,bmp是位图,而类似jpg,png之类的是经压缩过的。
                QImage img((unsigned char*)rgb24, cloneFrame.width(), cloneFrame.height(), cloneFrame.width()*3, QImage::Format_RGB888);
                emit frameAvailable(img);
                delete[] rgb24;
            }
            else
            {
                int nbytes = cloneFrame.mappedBytes();
                QImage image = QImage::fromData(cloneFrame.bits(), nbytes);
                emit frameAvailable(image);
            }
 
        }
 
        cloneFrame.unmap();
        return true;
    }
    return false;
}

测试了一下,发现Ghost系统中格式确实是QVideoFrame::Format_YUYV,但网上的convert_yuv_to_rgb_buffer函数容易出错,一时也没时间研究,只好在这做个记录。

解决办法:

因为我使用的Qt版本是5.15.2,所以在这个Ghost的win10系统中,最后使用了下面的代码,

    // valid only for Qt > v5.15...
    const  QVideoFrame frame(buffer);  // make a copy we can call map (non-const) on
    QImage image = frame.image(); // This function was introduced in Qt 5.15.
    //QImage::Format ifmt = image.format();
    //qDebug() << ifmt;
    return image;

这样可以获取正确的图像。

参考资料:

https://spacevision.blog.csdn.net/article/details/125300108

https://blog.csdn.net/u011942101/article/details/126917796

https://blog.csdn.net/u011942101/article/details/115278753

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt5.15.2 Camera的怪问题Ghost Win10中QImage::fromData不能得到有效图片 的相关文章

  • Ionic-Angular.js 拍照并发送到服务器:空图像

    因此 我设法使用自定义指令通过 Angular js 将图像上传到我的服务器 我还成功地实现了 Cordova 的相机功能 现在我尝试连接两者 但是当将图像发送到服务器时 它们被存储为空 我认为问题在于我使用输入字段来获取图像 并且它获取了
  • 如何将相机中的图像保存到 iPhone 图库中的特定文件夹?

    嘿 我是 iPhone 新手 最近我一直在尝试制作一个应用程序 基本上 我想要做的是 如果用户将从相机捕获任何图像 那么它应该保存在设备库中 我知道如何将照片保存在图库中 它对我有用 但我无法将所有捕获的图像保存到设备图库中的特定文件夹 例
  • 在我授予许可后,表面视图不显示相机

    public View onCreateView LayoutInflater inflater Nullable ViewGroup container Bundle savedInstanceState View view inflat
  • 您如何在 Android 上处理超高 MP 相机(和图像)? - “画布:尝试绘制太大的位图”

    我有一个活动 用户可以像这样打开相机 getPictureUri createImageFromFile true let photoUri it openCameraActivity REQUEST IMAGE CAPTURE it ph
  • Xamarin.Forms 用相机拍照显示方向错误并且后退按钮崩溃

    我正在使用此处的 Xamarin Forms Camera 示例 https github com XForms Xamarin Forms Labs Samples tree master XF Labs CameraSample htt
  • 从相机、SurfaceView 或 SurfaceHolder 连续获取图像数据

    所以我设置了这个相机预览Camera SurfaceView and SurfaceHolder 我也有一个ImageView我将在其中放置相机图像的修改版本 并且我希望它更新 假设每秒更新一次 当我从 res 加载图像时 所有代码都已准备
  • 内容居中的流式布局

    我有一排项目 当窗口宽度变得太小而无法显示一行中的所有项目时 这些项目应该堆叠起来 如下图所示 The Flow组件堆叠项目 但它们不是居中而是在左侧或右侧对齐 Flow Item Item Item Item Item QML 中是否有内
  • PhoneGap 应用程序在 Android 上无响应

    我创建了一个简单的 PhoneGap 应用程序 现在只需在您点击按钮时拍摄一张照片 然后在同一页面上的图像中显示该照片 我已经构建了iOS和Android版本 iOS版本运行良好 另一方面 Android 版本突出显示该按钮 但从不切换到相
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • HTC One M8 - 使用第二个后置摄像头

    我有一台 HTC One M8 设备 它有 2 个后置摄像头和一个额外的前置摄像头 我的问题是尝试访问第二个后置摄像头 我已经成功制作了一个应用程序 它同时运行 2 个摄像头 1 个前置摄像头和 1 个后置摄像头 但问题是我无法访问第二个后
  • 如何将代码 AVFoundation Objective C 转换为 Swift?

    我正在 swift 中使用 AVFoundation 来拍照 但我无法将任何 func 代码行从 Objective C 转换为 Swift 我的功能代码是 void capImage method to capture image fro
  • 颤动相机显得拉伸

    我一直在玩颤振 到目前为止我很喜欢它 但我在让相机工作时遇到了问题 我按照本页上的说明进行操作https pub dartlang org packages camera https pub dartlang org packages ca
  • OpenSceneGraph 将相机设置在初始位置

    我是第一次使用 OpenSceneGraph 我有点迷失 因为文档确实不太清楚 所以 我有这段代码加载一个带有房子的 obj 文件 并且我在我想要的 人 所在的地方淹没了一个小盒子 所以现在 我不想把那个盒子放在那里 而是想把相机放在那里
  • 黑莓 - 可以隐藏视频字段吗?

    我想编写一个像手电筒这样的应用程序 在相机 LED 的帮助下 Player player javax microedition media Manager createPlayer capture video encoding video
  • Camera中添加Camera的Zoom控件

    我正在制作一个相机应用程序 其中我使用 Surface View 作为相机和所有其他东西 我从以下链接中获取了指南 http www brighthub com mobile google android articles 43414 as
  • UIImage 数据始终处于横向模式

    似乎当我用相机以肖像模式拍照时 UIImage具有正确的尺寸 长宽比 1536x2048 3 4 和方向 右 导出到文件 带有UIImage AsPNG Save 它始终以横向模式显示 2048x1536 4 3 这是真的吗 还是我做错了什
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • Qt 5.0中添加QFtp

    我需要在我的项目中使用 QFtp 类 当我使用 Qt 5 0 进行开发时 我需要从 gitorious 存储库下载该类 https qt gitorious org qt qtftp https qt gitorious org qt qt
  • Android webview 允许使用当前 Android Studio 访问相机

    我一直在尝试在我的网络视图上制作一个简单的输入按钮来访问相机和文件 我读过的解决方案各不相同 只有几行代码 没有解释它们到我在 Android Studio 中下载并打开的盲 github 项目链接 Os Fileup 等 的位置 并且它们
  • Qt 5.3 QPlainTextEdit 更改 QTextCursor 颜色

    我想更改下面的光标颜色QPlainTextEdit小部件 我能够将其宽度设置为6 但我想改变颜色或者它 是否可以 QFontMetrics fm font setCursorWidth fm averageCharWidth setCurs

随机推荐