大家好!这里有两张输入图像,一张是背景图像,另一张是掩膜图像。我需要获取掩膜图像的彩色部分。
但是我的代码得到了完全不同的结果:背景图像,掩膜图像,结果图像
我的代码使用C#编写:
//Read files
Mat img1 = CvInvoke.Imread(Environment.CurrentDirectory + "\\Test\\All1.jpg");
Mat img = CvInvoke.Imread(Environment.CurrentDirectory + "\\Test\\OriginalMask.jpg");
// Threshold and MedianBlur mask
CvInvoke.Threshold(img, img, 0, 255, Emgu.CV.CvEnum.ThresholdType.BinaryInv);
CvInvoke.MedianBlur(img, img, 13);
// without this conversion, an error appears: (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1)
CvInvoke.CvtColor(img, img, Emgu.CV.CvEnum.ColorConversion.Rgb2Gray);
CvInvoke.BitwiseNot(img1, img1, img);
//Save file
img1.Save(Environment.CurrentDirectory + "\\Test\\Result.jpg");
第一个问题:如何达到图片显示的效果?
第二个问题:如果不转换掩码,为什么会出现错误:(mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1)
?
第三个问题:如何实现最终图像中透明背景而不是白色背景?
解决方案不必使用C#语言,任何编程语言都适用,因为OpenCV的语法大致相同。谢谢!
img
也被加载为三通道(彩色)图像,因为没有设置说明符。threshold
和medianBlur
也可以处理彩色图像,而bitwise_not
只能用于单通道(灰度)图像。因此,如果没有先进行转换,则会出现错误消息。 - HansHirse