我正在尝试根据用户输入检测视频文件中的多个面孔。
代码检测到所需面部的数量,但有时检测“跳”到其他人 - 与第一帧不同。
视频文件包含5-6个面孔,用户可以选择1到4的数字。 程序应该检测前面的X个面并在整个视频中进行跟踪,此外,程序会打开另一个带有检测到的面部的窗口。
这是我的算法代码:
capture >> cap_img;
waitKey(2);
cvtColor(cap_img, gray_img, CV_BGR2GRAY);
equalizeHist(gray_img, gray_img);
while (1)
{
capture >> cap_img;
waitKey(2);
cvtColor(cap_img, gray_img, CV_BGR2GRAY);
equalizeHist(gray_img, gray_img);
// Detect faces
face_cascade.detectMultiScale(gray_img, faces, 1.1, 5,0 | CV_HAAR_SCALE_IMAGE | CV_HAAR_DO_CANNY_PRUNING | CASCADE_SCALE_IMAGE, Size(1, 1));
// Set Region of Interest
cv::Rect reg_b;
cv::Rect reg_c;
int i = 0; // i is index of current element
int ac = 0; // ac is area of current element
int ib = 0; // ib is index of biggest element
int ab = 0; // ab is area of biggest element
if (numOfFaces > faces.size())
{
numOfFaces = faces.size();
}
for (i = 0; i < numOfFaces; i++) // Iterate through all current elements (detected faces)
{
reg_c.x = faces[i].x;
reg_c.y = faces[i].y;
reg_c.width = (faces[i].width);
reg_c.height = (faces[i].height);
// Get the area of current element (detected face), at beginning it is same as "current" element
ac = reg_c.width * reg_c.height;
reg_b.x = faces[ib].x;
reg_b.y = faces[ib].y;
reg_b.width = (faces[ib].width);
reg_b.height = (faces[ib].height);
ab = reg_b.width * reg_b.height;
// Get the area of biggest element, at beginning it is same as "current" element
if (ac > ab)
{
ib = i;
reg_b.x = faces[ib].x;
reg_b.y = faces[ib].y;
reg_b.width = (faces[ib].width);
reg_b.height = (faces[ib].height);
}
crop = cap_img(reg_b);
resize(crop, res, Size(128, 128), 0, 0, INTER_LINEAR); // This will be needed later while saving images
cvtColor(crop, gray, CV_BGR2GRAY); // Convert cropped image to Grayscale
Point pt1(faces[i].x, faces[i].y); // Display detected faces on main window - live stream from camera
Point pt2((faces[i].x + faces[i].height), (faces[i].y + faces[i].width));
rectangle(cap_img, pt1, pt2, Scalar(0, 255, 0), 2, 8, 0);
}
// Show image
resize(cap_img, cap_img, Size(cap_img.cols / 2, cap_img.rows / 2)); // to half size or even smaller
imshow("original", cap_img);
if (!crop.empty())
{
imshow("detected", crop);
}
else
destroyWindow("detected");
}
“numOfFaces”是要检测的面数。
我做错了什么?