【问题标题】:Fast way to convert from cv::Mat to QImage从 cv::Mat 转换为 QImage 的快速方法
【发布时间】:2016-08-01 17:10:28
【问题描述】:

我想知道是否有一种从 Mat 转换为 QImage 的快速方法。我有以下转换类:

VideoReader::VideoReader() {
    cap = VideoCapture( CV_CAP_ANY );
}

QImage VideoReader::getFrame() {
    if (waitKey(30) >= 0)
        return;

    Mat frame;
    cap >> frame;

    QImage dest = QImage((uchar*)frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);

    return dest;
}

此代码有效,但 getFrame() 方法大约需要 20 毫秒才能完成。我需要一些工作至少快两倍的东西。有什么方法可以优化这个/任何可以更快地工作的替代转换方法?

谢谢!

【问题讨论】:

  • 删除 if (waitKey(30) >= 0) return; 大约需要 30 毫秒
  • 谢谢,仍然需要大约 15 毫秒,一定是相机延迟。
  • waitKey(1) 在典型的 Windows 系统上消耗大约 5-10 毫秒,afaik。如果没有图像尚未准备好,相机通常会阻止捕获调用,因此如果您的相机具有例如 30 fps 的速度,则仅调用 cap >> frame 应该需要大约 33 毫秒(如果没有其他任何东西会在两次调用之间消耗时间)。跨度>

标签: c++ qt opencv


【解决方案1】:

waitKey(30) 将暂停您的代码大约 30 毫秒。

该行在该函数中没有多大意义,因此您最好将其删除。以您的方式创建 QImage 所花费的时间不应超过几微秒,因为没有复制图像等...但是cap >> frame 可能需要一些时间,具体取决于您的捕获设备(但您对此无能为力) .

如果你真的需要waitKey,你应该使用waitKey(1),以免在那里浪费太多时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多