我是Emgucv的新手,所以需要一些帮助吗?
以下代码主要来自Google的不同地方。这将需要一个jpg文件(背景为绿色),并允许以单独的形式更改h1
和h2
设置的值,以创建(显示)蒙版。
现在,我想用这个面具做的就是将它变成透明的。
此刻,它只会在一个人周围显示黑色背景(例如),然后保存到文件中。
如果这是正确的处理方法,我需要知道如何将黑色背景变透明?
谢谢。
到目前为止,我所掌握的是C#:
imgInput = new Image<Bgr, byte>(FileName);
Image<Hsv, Byte> hsvimg = imgInput.Convert<Hsv, Byte>();
//extract the hue and value channels
Image<Gray, Byte>[] channels = hsvimg.Split(); // split into components
Image<Gray, Byte> imghue = channels[0]; // hsv, so channels[0] is hue.
Image<Gray, Byte> imgval = channels[2]; // hsv, so channels[2] is value.
//filter out all but "the color you want"...seems to be 0 to 128 (64, 72) ?
Image<Gray, Byte> huefilter = imghue.InRange(new Gray(h1), new Gray(h2));
// TURN IT TRANSPARENT somewhere around here?
pictureBox2.Image = imgInput.Copy(mask).Bitmap;
imgInput.Copy(mask).Save("changedImage.png");
答案 0 :(得分:0)
我不确定我是否真的了解您要做什么。但是掩码是二进制对象。面具通常是黑色的,代表您不想要的东西,白色面具。据我所知,没有透明的面具,对我来说这是没有意义的。遮罩用于通过遮罩其余部分来提取图像的一部分。
也许您可以详细说明您想做什么?
道格
答案 1 :(得分:0)
我想我可能已经找到了想要的解决方案。我在stackoverflow上找到了一些经过一些调整的代码:
public Image<Bgra, Byte> MakeTransparent(Image<Bgr, Byte> image, double r1, double r2)
{
Mat imageMat = image.Mat;
Mat finalMat = new Mat(imageMat.Rows, imageMat.Cols, DepthType.Cv8U, 4);
Mat tmp = new Mat(imageMat.Rows, imageMat.Cols, DepthType.Cv8U, 1);
Mat alpha = new Mat(imageMat.Rows, imageMat.Cols, DepthType.Cv8U, 1);
CvInvoke.CvtColor(imageMat, tmp, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(tmp, alpha, (int)r1, (int)r2, ThresholdType.Binary);
VectorOfMat rgb = new VectorOfMat(3);
CvInvoke.Split(imageMat, rgb);
Mat[] rgba = { rgb[0], rgb[1], rgb[2], alpha };
VectorOfMat vector = new VectorOfMat(rgba);
CvInvoke.Merge(vector, finalMat);
return finalMat.ToImage<Bgra, Byte>();
}
我现在正在考虑在蒙版上添加SmoothGaussian,以在混合时创建一种,在其中将两个图像分层,而不是锐利的剪裁。