最近在mfc做人脸识别,但第一步就遇到了麻烦,我下面的代码虽然可以把摄像头放到picture中
但却无法识别人脸,忘大神帮帮忙!
void CMFCApplication2Dlg::OnBnClickedStartwatch()
{
// TODO: 在此添加控件通知处理程序代码
VideoCapture capture(0);//捕获外部摄像头
Mat frame, newframe;//建立两个Mat,一个用来显示视频,另一个给全局里的Allframe
namedWindow("view", WINDOW_AUTOSIZE);
HWND hWnd = (HWND)cvGetWindowHandle("view");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(face_picture)->m_hWnd);
::ShowWindow(hParent, SW_HIDE);//隐藏运行程序框,并且把它“画”到MFC上
if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading\n"); };
if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading\n"); };//加载分类器的
if (capture.isOpened())
{
for (;;)//循环以达到视频的效果
{
capture >> frame;
capture >> newframe;
Allframe = newframe;
if (!frame.empty())
{
detectAndDisplay(frame);//识别的函数
imshow("view", frame);
UpdateData(FALSE);
}
else
{
printf(" --(!) No captured frame -- Break!"); break;
}
waitKey(10);
}
}
}
void detectAndDisplay(Mat frame)//识别人脸函数
{
std::vector faces;
Mat frame_gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转换成灰度图像
equalizeHist(frame_gray, frame_gray);//直方图均衡化
//1.1表示每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(30, 30)为目标的最小最大尺寸
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faces.size(); i++)
{
Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 2, 8, 0);//画椭圆
Mat faceROI = frame_gray(faces[i]);
std::vector<Rect> eyes;
//-- In each face, detect eyes
eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t j = 0; j < eyes.size(); j++)//检测眼睛
{
Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);
int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
circle(frame, eye_center, radius, Scalar(255, 0, 0), 3, 8, 0);
}
}
}