【发布时间】:2016-08-09 18:01:25
【问题描述】:
编辑:问题不清楚抱歉,我更新并添加了详细信息。
我有一个包含图像数据(YUV 格式)的缓冲区,我将其转换为 RGB 格式。问题是,我想垂直翻转图像(反转 Y 位置)。
目前我能做的是将我的 YUV 数据转换为缓冲区中的 RGB 数据,然后垂直翻转该缓冲区。
这里是这个的工作代码:
unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes)
{
unsigned char *mycopy = new unsigned char[height*width*3];
unsigned char *flippedCopy = new unsigned char[height*width*3];
unsigned char* pData = (unsigned char *) frameBytes;
//Conversion from YUV to RGB
for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4)
{
unsigned char v = pData[j];
unsigned char y = pData[j+1];
unsigned char u = pData[j+2];
mycopy[i+2] = 1.0*y + 8 + 1.402*(v-128); // r
mycopy[i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g
mycopy[i] = 1.0*y + 1.772*(u-128) + 0; // b
y = pData[j+3];
mycopy[i+5] = 1.0*y + 8 + 1.402*(v-128); // r
mycopy[i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g
mycopy[i+3] = 1.0*y + 1.772*(u-128) + 0;
}
//Vertical flip
for (int i = 0; i < width; ++i) {
for (int j = 0; j < height; ++j) {
for (int k = 0; k < 3; ++k) {
flippedCopy[(i + j * width) * 3 + k] = mycopy[(i + (height - 1 - j) * width) * 3 + k];
}
}
}
return flippedCopy;
}
为了获得性能,我想要做的是翻转缓冲区在从 YUV 到 RGB 的转换。我不知道该怎么做,优素福的回答帮助了我,所以这就是我目前所拥有的:
unsigned char* DeckLinkCaptureDelegate::convertYUVtoRGB(void* frameBytes)
{
unsigned char *mycopy = new unsigned char[height*width*3];
unsigned char* pData = (unsigned char *) frameBytes;
int k = height - 1;
for(int i = 0, j=0; i < width * height * 3; i+=6, j+=4)
{
unsigned char v = pData[j];
unsigned char y = pData[j+1];
unsigned char u = pData[j+2];
mycopy[(width*k*3) + i+2] = 1.0*y + 8 + 1.402*(v-128); // r
mycopy[(width*k*3) + i+1] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g
mycopy[(width*k*3) + i] = 1.0*y + 1.772*(u-128) + 0; // b
y = pData[j+3];
mycopy[(width*k*3) + i+5] = 1.0*y + 8 + 1.402*(v-128); // r
mycopy[(width*k*3) + i+4] = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128); // g
mycopy[(width*k*3) + i+3] = 1.0*y + 1.772*(u-128) + 0;
if (<i multiple of (width*3)-1>){
k = k - 2;
}
}
return mycopy;
}
如果我是正确的,这应该有效,假设 if 条件是正确的。但我不知道如何表达这个if 条件,因为i 每次递增6,所以我可能会“跳过”递减k 的正确时机
我希望我已经足够清楚了。谢谢
【问题讨论】:
-
你好像忘了问问题。
-
你可以使用两个循环并以相反的方式将它们保存到另一个数组中......比如高度 - i 或其他东西
-
"这里是代码" 好的。和?它有效吗?它有什么作用?您对此有何疑问?
-
问题似乎是,至少在提供的代码中,您甚至没有尝试垂直翻转缓冲区。您是否可能忘记包含您解决问题的尝试,或者包含您正在努力解决的哪些概念阻止您首先进行此类尝试?
-
我编辑了我的问题以添加详细信息。
标签: c++ image image-processing