我有一个有4个通道的图像,我需要将它覆盖在一堆图片上。在具有3个通道的图片上,覆盖效果很好,但是在具有Alpha通道的图片上,图片的背景变为黑色。
原始图片:http://img.blog.csdn.net/20130610074054484
这是覆盖的代码:
void overlayImage(const cv::Mat &background, const cv::Mat &foreground,
cv::Mat &output, cv::Point2i location)
{
background.copyTo(output);
for(int y = std::max(location.y , 0); y < background.rows; ++y)
{
int fY = y - location.y;
if(fY >= foreground.rows)
break;
for(int x = std::max(location.x, 0); x < background.cols; ++x)
{
int fX = x - location.x;
if(fX >= foreground.cols)
break;
double opacity = ((double)foreground.data[fY * foreground.step + fX * foreground.channels() + 3]) / 255.;
for(int c = 0; opacity > 0 && c < output.channels(); ++c)
{
unsigned char foregroundPx = foreground.data[fY * foreground.step + fX * foreground.channels() + c];
unsigned char backgroundPx = background.data[y * background.step + x * background.channels() + c];
output.data[y*output.step + output.channels()*x + c] =
backgroundPx * (1.-opacity) + foregroundPx * opacity;
}
}
}
}
答案 0 :(得分:0)
这是因为您对背景图像使用了1-opacity。如果forground图像的不透明度为0,则backgroundpixel的不透明度将为1,而不是之前的0。
你必须对结果不透明度fpr进行计算,两个图像都可以为0。
克劳斯