OpenCV Cuda alphaComp,反复混合0图像使其变暗

时间:2018-08-13 16:20:37

标签: c++ opencv alphablending

我正在使用OpenCV 3.4.1和Cuda进行alpha合成时遇到奇怪的行为。

当我将全黑图像和全零alpha通道混合到另一幅图像上并递归重复此过程时,图像变暗,亮度约为50%。

这是某种错误,还是我误解了Alpha合成的一些基本知识?有关不同混合模式的文档很少。

我写了一个简短的示例代码来说明发生了什么。当运行一次时,矩形似乎保持绿色。但是,将其循环放置会使矩形慢慢淡出,直到变成深绿色。

Initial result on program start

程序启动时的初始结果

Result after a couple of seconds

几秒钟后的结果

#include <stdio.h>
#include <iostream>

#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudaarithm.hpp>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    Mat frame(1080, 1920, CV_8UC4, Scalar(0, 0, 0, 255));

    namedWindow("test", CV_WINDOW_OPENGL);

    // Drawing a green rectangle with 100% opacity
    rectangle(frame, Rect(10, 10, 200, 200), Scalar(0, 255, 0, 255), CV_FILLED);

    cuda::GpuMat gpuFrame(frame);

    while(true){

        // Creating an all-black image with 0% opacity
        cuda::GpuMat gpuBlank(1080, 1920, CV_8UC4, Scalar(0, 0, 0, 0));

        // Alpha-compositing them together should keep the image untouched..?
        cuda::alphaComp(gpuFrame, gpuBlank, gpuFrame, cuda::ALPHA_OVER);

        // Splitting the image into 4 mats, to remove any resulting opacity from the image
        // Hopefully coming out with another 100% opacity image to blend again
        vector<cuda::GpuMat> frameChannels;
        cuda::split(gpuFrame, frameChannels);
        cuda::GpuMat fullAlpha(1080, 1920, CV_8UC1, Scalar(255));

        if (gpuFrame.channels() > 3) {
            frameChannels.pop_back();
        }
        frameChannels.push_back(fullAlpha);

        cuda::merge(frameChannels, gpuFrame);

        imshow("test", gpuFrame);
        waitKey(1);
    }
}

1 个答案:

答案 0 :(得分:0)

在对CV_32FC4图像进行了更多测试之后,这似乎是OpenCV处理CV_8UC4图像的Alpha合成方式的错误。错误报告在这里:

https://github.com/opencv/opencv/issues/12212