C++ uint8_t缓冲区到cv::Mat的转换会导致图像中断

C++ uint8_t缓冲区到cv::Mat的转换会导致图像中断,c++,opencv,C++,Opencv,我的问题如下: 我有一个Mipi摄像头,可以捕捉帧并将其存储到结构缓冲区中,您可以在下面看到。一旦帧被存储,我想将其转换为cv::Mat,问题是Mat最终看起来像第一张图片。 var buf.index只是V4L2 API的一部分,对于我正在使用的缓冲区来说非常有用 //The structure where the data is stored struct buffer{ void *start; size_t length; }; struct buffer *buffe

我的问题如下: 我有一个Mipi摄像头,可以捕捉帧并将其存储到结构缓冲区中,您可以在下面看到。一旦帧被存储,我想将其转换为cv::Mat,问题是Mat最终看起来像第一张图片。 var buf.index只是V4L2 API的一部分,对于我正在使用的缓冲区来说非常有用

//The structure where the data is stored
struct buffer{
    void *start;
    size_t length;
};

struct buffer *buffers;

//buffer->mat
cv::Mat im = cv::Mat(cv::Size(width, height), CV_8UC3, ((uint8_t*)buffers[buf.index].start));

起初,我认为数据可能已损坏,但使用lodepng存储图像会得到一个没有任何失真的好图像

unsigned char* out_buf = (unsigned char*)malloc( width * height * 3);

for(int pix = 0; pix < width*height; ++pix) {
    memcpy(out_buf + pix*3, ((uint8_t*)buffers[buf.index].start)+4*pix+1, 3);
}
lodepng_encode24_file(filename, out_buf, width, height);
unsigned char*out\u buf=(unsigned char*)malloc(宽*高*3);
对于(int-pix=0;pix


我敢打赌这是件很愚蠢的事情。

你发布的图片有着奇怪的彩色像素,而且这些图案看起来不仅仅是每像素24位,还有更多的信息

检查完数据后,V4L似乎为每个像素提供了四个字节,第一个字节始终是0xFF(我们称之为X)。此外,通道顺序似乎是XRGB

使用
8UC4
创建cv::Mat以包含数据


要在OpenCV中使用图片,您需要BGR订单
cv::拆分
接收到的数据到它的四个颜色平面,即X、R、G、B。使用
cv::merge
将B、G、R平面重新组合成OpenCV可以处理的图片,或者重新组合成R、G、B以创建一个用于其他目的的垫子(您似乎使用的另一个库)。

无关:您为什么要处理
malloc
s?只需做一个
std::vector(宽*高*3)请做一个。我想你可能是对的,我用8UC3替换了8UC4,我得到了我认为是一个改进,我可以解码整个图像,但由于透明度的原因,它有一些“洞”。这是一个包含普通映像、8uc3映像和8uc4映像进度的文件夹!我检查了那张粉红色的照片。通道0全部是255,所以我猜您的数据是ARGB。OpenCV需要它是BGR或BGRA。您可以使用numpy来洗牌频道。cvtColor是正常路由,但它没有接受ARGB的转换代码。我会修改我的答案。对不起,我完全忘记了这一点,这是答案,谢谢。