opencv的mat是怎么存放yuv I420数据的,排布顺序是?
时间: 2024-03-02 21:51:13 浏览: 12
在OpenCV中,可以通过cv::Mat对象来存储YUV数据。对于YUV格式中的I420,可以通过以下方式将其存储为cv::Mat:
```
int width = 640;
int height = 480;
int size = width * height * 3 / 2; // I420格式下,每个像素占用1.5个字节
// 分配内存
uchar* data = new uchar[size];
memset(data, 0, size); // 初始化为0
// 填充YUV数据
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int pos = i * width + j;
data[pos] = ...; // Y分量
}
}
for (int i = 0; i < height / 2; i++) {
for (int j = 0; j < width / 2; j++) {
int pos = width * height + i * width / 2 + j;
data[pos] = ...; // U分量
}
}
for (int i = 0; i < height / 2; i++) {
for (int j = 0; j < width / 2; j++) {
int pos = width * height * 5 / 4 + i * width / 2 + j;
data[pos] = ...; // V分量
}
}
// 创建cv::Mat对象
cv::Mat yuv_img(height * 3 / 2, width, CV_8UC1, data);
// 释放内存
delete[] data;
```
在I420格式中,Y分量按照从左到右、从上到下的顺序存储;U分量和V分量则分别按照从左到右、从上到下的顺序存储,但是每个像素只占用1/4个字节。因此,对于U和V分量,需要将宽度和高度都除以2。具体来说,U分量存储在Y分量之后,V分量则存储在U分量之后。