当图片中有5个人时,我在给定的绿色矩形上有一个问题。我使用的是emguCV v2.2这里是当我点击并启动按钮时的代码。
Image InputImg = Image.FromFile(@"C:imgPicture.jpg");
Image<Bgr,byte> ImageFrame = new Image<Bgr,byte>(new Bitmap(InputImg));
Image<Gray, byte> grayframe = ImageFrame.Convert<Gray, byte>();
var faces = grayframe.DetectHaarCascade(haar, 1.4, 4,
HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(25, 25))[0];
foreach (var face in faces)
{
ImageFrame.Draw(face.rect, new Bgr(Color.Green), 3);
}
CamImageBox.Image = ImageFrame;
我期望它返回给我的是每个面都有绿色矩形的picture.jpg。但事实并非如此。我可以知道为什么吗?这里有什么错误吗?
谢谢
var faces = grayframe.DetectHaarCascade(haar, 1.4, 4, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(25, 25))[0];
您正在使用scaleFactors = 1.4
和minNeighbors = 4
,也许你可以调整这些参数并检查结果(scaleFactors = 1.2
?)
为了证明你的haarcascade工作良好,也许你可以尝试使用网络摄像头捕获作为你的图片来源?
Private void Form1_load(object sender, EventArgs e)
{
try
{
//capture webcam
Capture grabber = new Capture();
//test capture frame
grabber.QueryFrame();
//trigger event when application is idle
Application.Idle += new EventHandler(FrameGrabber);
}
catch
{
MessageBox.Show("Capture fail to start");
}
}
void FrameGrabber(object sender, EventArgs e)
{
Image<Bgr,byte> ImageFrame = grabber.QueryFrame().Resize(320,240,Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
Image<Gray, byte> grayframe = ImageFrame.Convert<Gray, byte>();
MCvAvgComp[] faces = grayframe.DetectHaarCascade(haar, 1.4, 4,
HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(25, 25))[0];
foreach (MCvAvgComp face in faces)
{
ImageFrame.Draw(face.rect, new Bgr(Color.Green), 3);
}
CamImageBox.Image = ImageFrame;
}
顺便说一下,grayframe.DetectHaarCascade
的返回类型为MCvAvgComp[][]
,因此,在您的情况下,字体类型为MCvAvgComp[]
。
ScaleFactor
应该是>1.0 but closer to 1
,所以您可以使用1.04或1.01来获得更好的结果,但这会使过程变慢。你可以增加minNeighbours
,这样就可以减少假阳性。最后使用maxSize
参数限制检测框的最大尺寸。您可以遵循方法
public Rectangle[] DetectMultiScale(
IInputArray image,
double scaleFactor = 1.1,
int minNeighbors = 3,
Size minSize = null,
Size maxSize = null
)