灵泽~ 2017-07-26 09:39 采纳率: 100%
浏览 1300
已采纳

基于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条回答 默认 最新

  • devmiao 2017-07-26 16:32
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条