铛铛响
2017-07-26 09:39
采纳率: 100%
浏览 1.3k
已采纳

基于opencv和mfc的人脸检测

最近在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);
    }
}

}


  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题