在opencv中使用imshow显示字节数组的最快方法是啥?

Posted

技术标签:

【中文标题】在opencv中使用imshow显示字节数组的最快方法是啥?【英文标题】: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图像的像素是否足够快? 试试这个答案:***.com/questions/6924790/… 您只需cout << image; 即可打印其所有数据。 【参考方案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; 你的方法在创建一个空矩阵的过程中首先分配新的数据,然后将数据重写从缓冲区传输过来的数据。上述方法不会分配所有新数据。

以上是关于在opencv中使用imshow显示字节数组的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用imshow(OpenCV)显示图像时出现问题[重复]

在opencv中的imshow函数后插入延迟

是否可以使用 opencv 的 imshow 显示没有工具栏的图像?

分别显示多个 OpenCV imshow() 窗口

opencv中图片文件太大imshow显示不了,怎么办,大神指点下

OpenCV 函数学习03-图像的显示(cv2.imshow)