C++ cv::Mat 2 yuv_nv12
时间: 2024-02-05 20:03:06 浏览: 90
Para convertir una imagen en formato cv::Mat a yuv_nv12, se puede utilizar la siguiente función:
```
void mat2yuv_nv12(const cv::Mat& mat, unsigned char* yuv_nv12_data) {
int width = mat.cols;
int height = mat.rows;
// Convertir a YUV
cv::Mat yuv;
cv::cvtColor(mat, yuv, cv::COLOR_BGR2YUV);
// Obtener los datos de YUV
int y_size = width * height;
int uv_size = y_size / 2;
unsigned char* y_data = yuv_nv12_data;
unsigned char* uv_data = yuv_nv12_data + y_size;
// Copiar el plano Y
memcpy(y_data, yuv.data, y_size);
// Copiar los planos U y V (intercalados)
for (int i = 0; i < uv_size; i++) {
uv_data[2 * i] = yuv.data[y_size + i * 2];
uv_data[2 * i + 1] = yuv.data[y_size + i * 2 + 1];
}
}
```
La función recibe como parámetros la imagen en formato cv::Mat y un puntero a un array de bytes donde se almacenará la imagen en formato yuv_nv12.
Primero se convierte la imagen a formato YUV utilizando la función cv::cvtColor(). Luego se copian los planos Y, U y V al array de bytes, respetando el orden intercalado que tiene el formato yuv_nv12.
Para utilizar esta función, se puede llamar de la siguiente manera:
```
cv::Mat image = cv::imread("imagen.jpg");
unsigned char* yuv_nv12_data = new unsigned char[image.cols * image.rows * 3 / 2];
mat2yuv_nv12(image, yuv_nv12_data);
```
Se carga la imagen en formato cv::Mat utilizando la función cv::imread(), y se crea un array de bytes donde se almacenará la imagen en formato yuv_nv12. Luego se llama a la función mat2yuv_nv12() para convertir la imagen y almacenarla en el array de bytes.
阅读全文