c++ 将cv::mat bgr 转std::vector<unsigned char> uyvy 422
时间: 2024-09-22 10:04:06 浏览: 45
在C++中,将`cv::Mat`类型的BGR图像转换为`std::vector<unsigned char>`的UYVY (422)编码可以分两步进行:
1. 首先,你需要确保`cv::Mat`中的BGR图像已经读取并准备好了。假设`bgr`是一个`cv::Mat`实例,其通道顺序为BGR。
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
cv::Mat bgr; // BGR图像已加载到此变量
// 获取BGR图像的宽度和高度
int width = bgr.cols;
int height = bgr.rows;
```
2. 然后,创建一个新的`std::vector<unsigned char>`来存储UYVY数据。注意,UYVY格式的每个像素由两个Y分量、一个U分量和一个V分量组成,所以宽度会减半。另外,为了处理偶数行,通常需要额外的处理。
```cpp
std::vector<unsigned char> uyvy_data(width / 2 * height * 3);
```
3. 接下来,编写函数将BGR数据转换为UYVY格式,并填充到`uyvy_data`向量中。由于OpenCV内部的内存布局,我们一般使用`uchar*`指针来操作内存。这里假设`bgr.data`指向BGR图像的起始地址。
```cpp
uchar* bgr_ptr = bgr.data;
uchar* uyvy_ptr = &uyvy_data[0];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width / 2; x++) {
// 读取两个相邻的BGR样本
int index_bgr1 = y * width * 3 + x * 3;
int index_bgr2 = index_bgr1 + 3; // 间隔三个字节
// 写入第一个Y分量
uyvy_ptr[index_yvy++] = bgr_ptr[index_bgr1];
// 写入第二个Y分量
uyvy_ptr[index_yvy++] = bgr_ptr[index_bgr2];
// U分量(位于当前Y和下一个Y之间)
uyvy_ptr[index_yvy++] = (bgr_ptr[index_bgr2 - 1] + bgr_ptr[index_bgr1]) / 2;
// V分量(同样的位置)
uyvy_ptr[index_yvy++] = (bgr_ptr[index_bgr2 - 2] + bgr_ptr[index_bgr1 + 1]) / 2;
}
}
```
阅读全文