覆盖4通道图像

时间:2014-09-26 07:42:25

标签: c++ c opencv

我有一个有4个通道的图像,我需要将它覆盖在一堆图片上。在具有3个通道的图片上,覆盖效果很好,但是在具有Alpha通道的图片上,图片的背景变为黑色。

原始图片:http://img.blog.csdn.net/20130610074054484

重叠图片:http://imgur.com/mlVAN0A

这是覆盖的代码:

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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这是因为您对背景图像使用了1-opacity。如果forground图像的不透明度为0,则backgroundpixel的不透明度将为1,而不是之前的0。

你必须对结果不透明度fpr进行计算,两个图像都可以为0。

克劳斯