如何将 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 纹理的主要内容,如果未能解决你的问题,请参考以下文章