如何将 Mat 数据(OpenCV,图像数据格式)转换为统一的 3d 纹理

Posted

技术标签:

【中文标题】如何将 Mat 数据(OpenCV,图像数据格式)转换为统一的 3d 纹理【英文标题】:How to convert Mat data(OpenCV, data format for image) into unity3d texutre 【发布时间】:2015-12-08 07:24:38 【问题描述】:

我知道 Mat 数据将每个像素数据(列中的 RGB 数据)保存为无符号字符。 unity3d 中的纹理数据是 byte[]。我尝试做以下事情,但结果不正确,hwind中显示的摄像头图像捕获不正确。

Mat src_frame;//this is every frame that captured from the current camera
D3DLOCKED_RECT d3d_rect;
byte *pSrc = src_frame.data;
byte *pDest = (byte *)d3d_rect.pBits;

int stride = d3d_rect.Pitch;
int pixel_w_size = src_frame.cols;
for (unsigned long i = 0; i < src_frame.rows; i++)
    memcpy(pDest, pSrc, pixel_w_size);
    pDest += stride;
    pSrc += pixel_w_size;

只有灰色图像显示,我不知道为什么会发生这种情况。 Mat数据序列是否与纹理数据不同?它们的数据都包含 RGB 信息。

【问题讨论】:

【参考方案1】:

pixel_w_size 应该是 src_frame.cols 乘以每个像素的字节数(RGB 情况下为 3),或者更好地使用 elemSize()

所以使用:

int pixel_w_size = src_frame.cols * src_frame.elemSize();

【讨论】:

有道理,不过d3d_rect.Pitch只有1280。而图片的大小是1024 * 1280。所以,memcpy(pDest, pSrc, pixel_w_size) 会触发错误。 我希望d3d_rect.Pitch 至少为 3*1280。如果不是这种情况,可能是分配错误或灰度图片?间距是每行的字节数,可以大于一行的像素数。

以上是关于如何将 Mat 数据(OpenCV,图像数据格式)转换为统一的 3d 纹理的主要内容,如果未能解决你的问题,请参考以下文章

如何将IplImage转换为GLubyte数组?

在opencv中,图像是以啥数据类型存储的

如何在没有额外分配的情况下从 OpenCV 矩阵中获取图像数据?

opencv编程中cvMat到Mat如何进行数据转换?

opencv中Mat格式的数据访问.at

GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)