【问题标题】:Change data of OpenCV matrix from pointer从指针更改 OpenCV 矩阵的数据
【发布时间】:2017-08-24 14:01:43
【问题描述】:

我正在尝试使用相机驱动程序、OpenCV 和 C++ 从多个相机捕获图像。我的目标是获得尽可能多的 FPS,为此我发现将图像保存在硬盘中是最慢的操作。为了加快这个过程,我在单独的线程中进行每个保存。问题是,我仍然必须等待保存完成以避免捕获的图像被覆盖。这样做可以提供很好的结果,但由于未知原因,每 30-40 帧速度会提高 10 倍。

我正在通过创建一个存储图像的环形缓冲区来解决这个问题,因为这些写入速度的突然下降非常短。我使用这种方法获得了非常好的结果,但不幸的是,对于超过 3 个摄像头,摄像头驱动程序无法处理压力,我的程序停止,等待第 4 个摄像头的第一张图像被保存。我检查了一下,这不是 CPU,因为 3 个摄像头 + 一个在磁盘中写入随机数据的线程工作正常。

现在,看到使用 opencv 如何减轻相机驱动程序的压力,我想创建一个 OpenCV 垫缓冲区来保存图像,同时保存它们而不用我的相机覆盖它们(好吧,直到缓冲区完成整个圈,我会确保不会发生)。

我知道我能做到

cv::Mat colorFrame(cv::Size(width, height),CV_8UC3,pointerToMemoryOfCamera);

从相机写入的内存中初始化一帧。这并不能解决我的问题,因为它只会指向数据,而相机覆盖它的那一刻,它会破坏保存的图像。

如何创建一个给定大小和类型的矩阵,然后将内存中的内容复制到这个矩阵中?

【问题讨论】:

    标签: c++ opencv camera computer-vision


    【解决方案1】:

    您需要创建一个深拷贝。你可以使用clone:

    cv::Mat colorFrame = cv::Mat(height, width, CV_8UC3, pointerToMemoryOfCamera).clone();
    

    您还可以使用matwrite and matread functions 加快保存图像的过程。

    【讨论】:

    • 哇,谢谢你这么快的反应,我已经离开办公室了,想着需要更多时间才能有人回答!明天肯定会尝试两个!谢谢!
    • 完美运行! matwrite 比 cv::imwrite 慢,但我现在以良好的帧速率保存而不会重叠或停止。谢谢大佬!
    • 很高兴它有帮助 ;)
    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 2021-02-09
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多