将图像ROI设置为EMGU CV中其他矩形的形状......?

时间:2012-02-29 20:03:25

标签: c# opencv emgucv

我正在研究人脸检测和识别软件......我成功地检测到面部并使用EigenObjectRecognizer识别它们......但有时它会给出错误的结果......所以我会使用HaarCascade设置面部的roi对象为椭圆,以便我能够使背景的效果无效......

ellipse = new Ellipse(new PointF(face.rect.X +(face.rect.Width / 2),face.rect.Y +(face.rect.Height / 2)),new SizeF(face.rect .Width - 5,face.rect.Height - 25),0); ImageFrame.Draw(ellipse,new Bgr(Color.Green),2);

现在它可以在脸部周围绘制一个椭圆......但是如何将脸部的roi设置为这个椭圆...

请帮帮我...

2 个答案:

答案 0 :(得分:1)

很抱歉,您实际上无法将图像的ROI设置为椭圆,这样做非常复杂且缓慢。

它解析时并不慢,但每次访问图像数据时,都会强制通过几个for循环来找到正确的位置和条件,以确保它不会偏离。对性能的不利影响意味着它尚未实施。您可以随时编辑源代码并根据需要进行设置。

或者,您将获得的最佳方法是创建ROI的空白图像,并使用几个for循环逐个复制椭圆内包含的面的数据。您还可以使用条件副本仅复制肤色纹理。

如果你需要一些帮助,请告诉我。但最终你会得到一张黑色背景的脸部图像。现在,由于所有人脸都有黑色背景,你可以消除它的效果。

希望这有帮助,

干杯,

克里斯

答案 1 :(得分:1)

你可以使用mask和bitwise And来做
假设img是Image
创建面具:

Image<Gray, byte> mask = new Image<Gray, byte>(img.Width, img.Height);

调用所需的形状,例如椭圆

CvInvoke.Ellipse(mask,new Point(5,5),new Size(10,20),0,0,360, new MCvScalar(255,255,255),-1,Emgu.CV.CvEnum.LineType.AntiAlias, 0); // -1 fill ellipse

目的地:

Image<Gray, byte> dest = new Image<Gray, byte>(img.Width, img.Height);

按位和

dest = img.And(img, mask);
dest.Save("C:/myshape.jpg")