c# – 裁剪掉不包含Face的图像部分
我检测到图像中的面部(仅1个人)并具有面部矩形的坐标.
由于图像可以是任何大小,我只需要图像中重要的部分(head.shoulders).意图是通过某种因素扩展检测到的矩形的边界,以便包含重要部分. 更新: 我试过这个..但它没有给出正确的结果.注意我已经将1.7更改为2,因为它只需要整数参数.而Top和Left都是只读属性. foreach (Rectangle f in objects) { int x,y; x = f.Top - (f.Height / 8); y = f.Left - (f.Width / 2); Rectangle myrect = new Rectangle(x,y,f.Width * 2,f.Height * 2); g.DrawRectangle(Pens.Gray,myrect); } 检测到的面矩形 Top----->62 Right----->470 Left----->217 Bottom----->315 根据答案扩展矩形 Top----->91 Right----->537 Left----->31 Bottom----->597 扩展矩形 解决方法
由于我的
previous answer作为主题,我会在这里写出正确答案:
由于我对 >由于Emgu CV是开源的,你可以度过不安的夜晚并更改库中的代码并重新编译它们等. 或(我更喜欢的方法): >你从生物学角度考虑它,意思是: 您知道脸部矩形的位置和大小.如果你也知道身体姿势,你可以计算肩膀的估计宽度和垂直偏移(相对于脸部的中心). 生物学方法的更多细节: 想象无花果. №1开始,并想象你有以下图像和面部矩形: Bitmap | .Width == 100 | .Height == 160 Face // type: System.Drawing.Rectangle | .Top == 20 | .Left == 50 | .Width == 60 | .Height == 60 然后,根据提供的图像,新的Rectangle应该是: f := Face // face rectangle Face_and_Shoulder | .Top = f.Top - (f.Height / 8) | .Left = f.Left - (f.Width / 2) | .Width = f.Width * 2 | .Height = f.Height * 1.7 这将导致以下值: Face_and_Shoulder | .Top == 12.5 | .Left == 20 | .Width == 120 | .Height == 102 生成的矩形(Face_and_Shoulder)在绘制图像时应包括肩部和头发等. 然而,这种方法有一个小缺点:如果面部旋转了一定的度数(我认为超过5..10°),它将无法工作. 要计算相应的矩形,我建议您使用此代码(您似乎在代码示例中混淆了X和Y): foreach (Rectangle f in objects) { float x = f.Left - (f.Width / 2f); float y = f.Top - (f.Height / 8f); Rectangle myrect = new Rectangle((int)x,(int)y,(int)(f.Height * 1.3)); g.DrawRectangle(Pens.Gray,myrect); } 图. №1(来源:http://www.idrawdigital.com/wp-content/uploads/2009/01/prop_var.gif) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |