我正在使用OpenCV 3.4.1和Cuda进行alpha合成时遇到奇怪的行为。
当我将全黑图像和全零alpha通道混合到另一幅图像上并递归重复此过程时,图像变暗,亮度约为50%。
这是某种错误,还是我误解了Alpha合成的一些基本知识?有关不同混合模式的文档很少。
我写了一个简短的示例代码来说明发生了什么。当运行一次时,矩形似乎保持绿色。但是,将其循环放置会使矩形慢慢淡出,直到变成深绿色。
程序启动时的初始结果
几秒钟后的结果
#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);
}
}
答案 0 :(得分:0)
在对CV_32FC4图像进行了更多测试之后,这似乎是OpenCV处理CV_8UC4图像的Alpha合成方式的错误。错误报告在这里: