我正在研究人脸检测和识别软件......我成功地检测到面部并使用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设置为这个椭圆...
请帮帮我...
答案 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")