我的 transparentGUI.png 图片带有透明背景 - 在GIMP中看起来像这样:
当我通过Mat imgColorPanel = imread("transparentGUI.png", -1);
将其加载到OpenCV中然后按imshow("widok", imgColorPanel);
显示时,我可以看到此图像带有白色背景(这是错误的,因为它应该是透明的):
最终我想在相机拍摄的图像上叠加此图像(带有透明背景)。如果我使用具有背景的其他图像(因此它不是透明) - 那么它被正确覆盖。
但是,当我想通过addWeighted(imgColorPanel, 0.8, imgOriginal, 0.6, 0, imgOriginal);
在所捕获的摄像机图像上覆盖transparentGUI.png图像时,程序会因控制台错误而崩溃:
以及调试错误:
除非我想加载并显示透明背景的图像,否则一切正常。我认为它可能与imgOriginal
发生冲突,因为它在HSV中 - 我正在构建HSV颜色对象检测程序,所以我无法改变它。将HSV图像与BGRA图像(透明图像)重叠是否可以? OpenCV的默认颜色范围是BGR,所以即使将摄像头捕获图像转换为HSV,我也可以将其覆盖其他图像BGR - 所以,我认为还有其他问题。
答案 0 :(得分:1)
imgColorPanel和imgOriginal应该具有相同的大小。从你的陈述中,imgColorPanel有4个通道(RGBA)。要使“addWeighted”工作,imgOriginal还应该有4个频道,而不是3个HSV频道。
对于“imshow”,我认为这只是显示问题,你可以打印出imgColorPanel的大小来检查它是否有4个通道。
答案 1 :(得分:1)
您遇到两个不同的问题:
我可以看到带有白色背景的图像(这是错误的,因为它 应该透明)
嗯,这不是错误,因为无论如何都看不到透明度,并且没有关于如何独立于上下文呈现它的标准共识。在GIMP的情况下,您确实会看到一些内容 - 包含图像的上下文窗口的背景。在HighGui的情况下,你可能只是因为在这种情况下这是名义背景而得到白色背景。解决这个问题的唯一方法是告诉程序看到透明度在程序的上下文中意味着什么。这可能需要使用另一个GUI系统,取决于您想要做什么。
程序因控制台错误而崩溃
正如错误消息所示,问题是您尝试叠加的图像具有不同的大小。一种解决方案是首先创建所需尺寸的透明基础图像,例如,像这样:
cv::Mat imgColorPanel {imgOriginal.rows, imgOriginal.cols, CV_8UC4, cv::Scalar{0,0,0,0}};
然后使用ROI将图像中的面板加载到基础的所需部分(图像必须小于基础...),例如:
cv::Mat panel {cv::imread("PATH/TO/FILE")};
cv::Rect roi {0,0,panel.rows,panel.cols}; // x,y,width,height
cv::Mat imRoi {imgColorPanel(roi)};
imRoi = panel.clone();