【问题标题】:What is the fastest way to display a byte array using imshow in opencv?在opencv中使用imshow显示字节数组的最快方法是什么?
【发布时间】:2015-04-25 21:13:18
【问题描述】:

我有一个指向图像缓冲区(字节数组)的指针,并且我知道行数和列数。在opencv中显示此图像数据的最快方法是什么?请参阅下面的详细信息。

int               rows, cols;
unsigned char     *ImageBuffer;

if (err = WFS_GetSpotfieldImage(instr.handle, &ImageBuffer, &rows, &cols))
    handle_errors(err);

// what goes here to construct "MAT image" using the "ImageBuffer" which is a pointer?
Mat image(rows, cols, CV_8UC3, Scalar(255, 0, 0));

cv::namedWindow("Spot Field", cv::WINDOW_AUTOSIZE);
cv::imshow("Spot Field", image); 

【问题讨论】:

  • “最快的方式”是什么意思?如果你强加这个功能;没有什么可以改变的......
  • 我的意思是如何将ImageBuffer指向的字节数组转换成Mat格式。使用for循环并根据字节数组中的数据设置Mat图像的像素是否足够快?
  • 您只需cout << image; 即可打印其所有数据。

标签: c++ c arrays pointers opencv


【解决方案1】:

使用这个构造函数:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

data – 指向用户数据的指针。采用数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化指向指定数据的矩阵头,这意味着没有数据被复制。此操作非常高效,可用于使用 OpenCV 函数处理外部数据。外部数据不会自动释放,所以你应该注意它。

【讨论】:

  • 谢谢斯图科夫!我发现以下方法比您提到的上述构造函数稍快: Mat image(rows, cols, CV_8UC1, Scalar(0, 0, 0)); for (int y = 0; y (y, x) = temp; } }
  • 你的方法在创建一个空矩阵的过程中首先分配新的数据,然后将数据重写从缓冲区传输过来的数据。上述方法不会分配所有新数据。
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 2013-08-15
  • 2015-07-25
  • 1970-01-01
  • 2016-02-12
相关资源
最近更新 更多