YUV422怎么转Mat,然后提取出mat中的Y值,提取出Y值图像后,将图像分成64*64块,计算每块的平均亮度值与周围分块的比值,大于某个阈值标记为NG
时间: 2024-02-16 19:04:43 浏览: 80
要将YUV422转换为Mat,可以使用OpenCV库中的cv::cvtColor()函数,具体代码如下:
```
cv::Mat yuvImage(height + height / 2, width, CV_8UC1, yuvData);
cv::Mat bgrImage;
cv::cvtColor(yuvImage, bgrImage, cv::COLOR_YUV2BGR_YUYV);
```
其中,height和width分别为图像的高和宽,yuvData为存储YUV数据的数组。
要提取出Mat中的Y值,可以使用OpenCV库中的cv::split()函数,具体代码如下:
```
std::vector<cv::Mat> channels;
cv::split(bgrImage, channels);
cv::Mat Y = channels[0];
```
其中,bgrImage为转换后的BGR图像,channels为存储每个通道的Mat数组,Y即为提取出的Y值Mat。
要将图像分成64*64块,可以使用OpenCV库中的cv::Mat::reshape()函数,具体代码如下:
```
cv::Mat Y64x64 = Y.reshape(1, height / 64);
Y64x64 = Y64x64.reshape(1, height / 64, 64);
Y64x64 = Y64x64.reshape(1, height / 64 * 64, 64);
```
其中,height为图像的高,Y64x64即为分块后的Y值Mat。
要计算每块的平均亮度值与周围分块的比值,可以使用OpenCV库中的cv::mean()函数,具体代码如下:
```
for (int i = 0; i < height / 64; i++) {
for (int j = 0; j < width / 64; j++) {
cv::Rect roi(j * 64, i * 64, 64, 64);
cv::Scalar mean = cv::mean(Y64x64(roi));
double ratio = mean[0] / (cv::mean(Y64x64(roi + cv::Point2i(-1, 0)))[0] + cv::mean(Y64x64(roi + cv::Point2i(1, 0)))[0] + cv::mean(Y64x64(roi + cv::Point2i(0, -1)))[0] + cv::mean(Y64x64(roi + cv::Point2i(0, 1)))[0]);
if (ratio > threshold) {
// 标记为NG
}
}
}
```
其中,threshold为阈值,可以根据实际情况设定。
阅读全文