if (in_img.width == 0 || in_img.height == 0){ qtView_Bridge::getInst("")->LogMessage(boost::format("%s: %s.") % __FUNCTION__ % ("Error! Image is empty")); return false; } int width = in_img.width; int height = in_img.height; unsigned char *yuvbuffer = (unsigned char *)in_img.data; if (out_img.data){ delete out_img.data; out_img.data = NULL; } cv::Mat gray; cv::Mat yuv(height, width, CV_8UC2, yuvbuffer); cv::cvtColor(yuv, gray, cv::COLOR_YUV2GRAY_YUY2); out_img.width = width; out_img.height = height; out_img.type = qtRAW_8_MONO; out_img.vcm_pos = in_img.vcm_pos; out_img.byte_size = width*height; out_img.data = new unsigned char[out_img.byte_size]; memcpy(out_img.data, gray.data, out_img.byte_size); return true;
时间: 2024-04-26 22:23:31 浏览: 11
这段代码看起来像是一个图像处理函数,它的作用是将输入的 YUY2 格式的图像转换为灰度图像。它首先检查输入图像的宽度和高度是否为零,如果是,则返回 false。接下来,它创建一个输入图像的指针,并将其转换为灰度图像。然后它创建一个输出图像的结构体,并将其属性设置为灰度图像的属性。最后,它将灰度图像的数据复制到输出图像的数据缓冲区中,并返回 true。
相关问题
qtView_Bridge::getInst("")->LogMessage(boost::format("%s: %s.") % FUNCTION % (boost::format("OK! start YUV422TORAW8-> %d") % (int)img.type)); out_img.width = img.width; out_img.height = img.height; //int stride = img.width * 2; qtView_Bridge::getInst("")->LogMessage(boost::format("%s: %s.") % FUNCTION % (boost::format("OK! start YUV422TORAW8-> width:%d——heighht:%d") % (int)img.width%img.height)); out_img.type = qtRAW_8_MONO; out_img.vcm_pos = img.vcm_pos; out_img.byte_size = out_img.width * out_img.height * sizeof(unsigned char); out_img.data = new unsigned char[out_img.byte_size]; unsigned char* in_data = (unsigned char*)img.data; unsigned char* out_data = (unsigned char*)out_img.data; for (int i = 0; i < out_img.height;i++) { for (int j = 0; j < out_img.width; j += 2) { int index_y = iout_img.width * 2 + j * 2; int index_raw8 = iout_img.width + j / 2; out_data[index_raw8] = (unsigned char)((in_data[index_y] - 16) * 255 / 219); } }如果我的图像长宽变了我需要改哪里
如果图像的长或宽发生变化,你需要修改以下两处代码:
1. 在第一行代码中,将获取的图像长宽信息赋值给 `out_img` 对象的 `width` 和 `height` 属性:
```
out_img.width = img.width;
out_img.height = img.height;
```
2. 在 for 循环中,需要根据新的图像长宽信息计算 `index_y` 和 `index_raw8`,然后将像素数据进行处理:
```
for (int i = 0; i < out_img.height;i++) {
for (int j = 0; j < out_img.width; j += 2) {
int index_y = i * img.width * 2 + j * 2;
int index_raw8 = i * out_img.width + j / 2;
out_data[index_raw8] = (unsigned char)((in_data[index_y] - 16) * 255 / 219);
}
}
```
需要注意的是,由于 YUV422 数据每两个像素共用一个色度值,因此计算 `index_y` 和 `index_raw8` 的方法与图像格式相关。如果图像格式变化,需要相应地修改计算方法。
out_img.width = img.width; out_img.height = img.height; qtView_Bridge::getInst("")->LogMessage(boost::format("%s: %s.") % __FUNCTION__ % (boost::format("OK! start YUV422TORAW8-> width:%d——heighht:%d") % (int)img.width%img.height)); out_img.type = qtRAW_8_MONO; out_img.vcm_pos = img.vcm_pos; out_img.byte_size = out_img.width * out_img.height * sizeof(unsigned char); out_img.data = new unsigned char[out_img.byte_size]; unsigned char* in_data = (unsigned char*)img.data; unsigned char* out_data = (unsigned char*)out_img.data; int i, j, k; int y, u, v; int r, g, b; for (i = 0, k = 0; i < in_img.height; i++) { for (j = 0; j < in_img.width; j += 2, k += 2) { y = in_data[k]; u = in_data[k + 1] - 128; v = in_data[k + 3] - 128; r = y + 1.402 * v; g = y - 0.34414 * u - 0.71414 * v; b = y + 1.772 * u; r = (r < 0) ? 0 : ((r > 255) ? 255 : r); g = (g < 0) ? 0 : ((g > 255) ? 255 : g); b = (b < 0) ? 0 : ((b > 255) ? 255 : b); out_data[i * in_img.width + j] = (unsigned char)((r + g + b) / 3); y = in_data[k + 2]; r = y + 1.402 * v; g = y - 0.34414 * u - 0.71414 * v; b = y + 1.772 * u; r = (r < 0) ? 0 : ((r > 255) ? 255 : r); g = (g < 0) ? 0 : ((g > 255) ? 255 : g); b = (b < 0) ? 0 : ((b > 255) ? 255 : b); out_data[i * in_img.width + j + 1] = (unsigned char)((r + g + b) / 3); } }这段代码哪里会导致代码出问题
这段代码的问题可能出现在以下几个地方:
1. 使用了未定义的变量in_img而不是img,应该修改为img。
2. 在for循环中,应该使用out_img.height而不是in_img.height。
3. 在计算out_data索引时,应该使用out_img.width而不是in_img.width。
4. 在计算r、g、b时,应该先将u、v除以256再进行计算。
修正后的代码如下:
```
out_img.width = img.width;
out_img.height = img.height;
qtView_Bridge::getInst("")->LogMessage(boost::format("%s: %s.") % __FUNCTION__ % (boost::format("OK! start YUV422TORAW8-> width:%d——heighht:%d") % (int)img.width%img.height));
out_img.type = qtRAW_8_MONO;
out_img.vcm_pos = img.vcm_pos;
out_img.byte_size = out_img.width * out_img.height * sizeof(unsigned char);
out_img.data = new unsigned char[out_img.byte_size];
unsigned char* in_data = (unsigned char*)img.data;
unsigned char* out_data = (unsigned char*)out_img.data;
int i, j, k;
int y, u, v;
int r, g, b;
for (i = 0, k = 0; i < out_img.height; i++) {
for (j = 0; j < out_img.width; j += 2, k += 4) {
y = in_data[k];
u = in_data[k + 1] - 128;
v = in_data[k + 3] - 128;
r = y + 1.402 * (v/256.0);
g = y - 0.34414 * (u/256.0) - 0.71414 * (v/256.0);
b = y + 1.772 * (u/256.0);
r = (r < 0) ? 0 : ((r > 255) ? 255 : r);
g = (g < 0) ? 0 : ((g > 255) ? 255 : g);
b = (b < 0) ? 0 : ((b > 255) ? 255 : b);
out_data[i * out_img.width + j] = (unsigned char)((r + g + b) / 3);
y = in_data[k + 2];
r = y + 1.402 * (v/256.0);
g = y - 0.34414 * (u/256.0) - 0.71414 * (v/256.0);
b = y + 1.772 * (u/256.0);
r = (r < 0) ? 0 : ((r > 255) ? 255 : r);
g = (g < 0) ? 0 : ((g > 255) ? 255 : g);
b = (b < 0) ? 0 : ((b > 255) ? 255 : b);
out_data[i * out_img.width + j + 1] = (unsigned char)((r + g + b) / 3);
}
}
```