【问题标题】:opencv face detect crashes computeropencv人脸检测崩溃计算机
【发布时间】:2016-03-22 12:46:40
【问题描述】:

大家好,我在 Visual Studio 2015 C++ 中编写的 opencv 3.1 程序遇到了这个问题。它可以很好地使用相机并很好地显示图像,但我从我的计算机冻结的文档中尝试了一个面部检测示例。代码如下:

这里是挂断的两个函数:但主要是在faceDetect函数附近停止,我会做一个断点来具体知道在哪里。

void CoreVision::init()
{
    face_cascade_name = "C:\\PAD\\opencv\\haarcascades\\haarcascade_frontalface_alt.xml";
    eyes_cascade_name = "C:\\PAD\\opencv\\haarcascades\\haarcascade_eye_tree_eyeglasses.xml";

    if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); };
    if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); };

    std::cout << "face_dir: " << face_cascade_name << std::endl;
    std::cout << "eye_dir: " << eyes_cascade_name << std::endl;
}

cv::Mat CoreVision::detectFace(cv::Mat main)
{
    cv::Mat nuller;
    try
    {
        faces.clear();
        cv::Mat frame_gray;

        cv::cvtColor(main, frame_gray, cv::COLOR_BGR2GRAY);
    cv::equalizeHist(frame_gray, frame_gray);

    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
    for (size_t i = 0; i < faces.size(); i++)
    {
        cv::Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
        cv::ellipse(main, center, cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, cv::Scalar(255, 0, 255), 4, 8, 0);

        cv::Mat faceROI = frame_gray(faces[i]);
        std::vector<cv::Rect> eyes;

        eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));

        for (size_t j = 0; j < eyes.size(); j++)
        {
            cv::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);
            cv::circle(main, eye_center, radius, cv::Scalar(255, 0, 0), 4, 8, 0);
        }
    }

    return main;
}
catch (...)
{
    std::cout << "Exception: have issue with processing face detection.";
    return nuller;
}

这里是主要功能:

int main()
{
    CoreVision _core;
    _core.init();
    while (true)
    {
        cv::Mat img = _core.captureImage(-1);
        img = _core.detectFace(img);
        _core.displayImage(img, "parker");

    }

}

最后是两个函数的 .h 文件:

#include <iostream>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\world.hpp>
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
class CoreVision
{
public:
    CoreVision();
    ~CoreVision();
    cv::Mat loadImage(const char* image_name, int type);
    void saveImage(cv::Mat img, const char* filename);
    cv::Mat captureImage(int cam);
    cv::Mat detectFace(cv::Mat main);
    int convertImage(cv::Mat img, int type);
    void displayImage(cv::Mat, const char* window_name);
    void init(void);

    char cCurrentPath[FILENAME_MAX];
    cv::String face_cascade_name;
    cv::String eyes_cascade_name;
    cv::CascadeClassifier face_cascade;
    cv::CascadeClassifier eyes_cascade;
    std::vector<cv::Rect> faces;
};

提前感谢您的帮助,我不确定是否是驱动程序问题,但我已经在多台计算机上尝试过,同样的冻结发生了。

【问题讨论】:

  • 它在eyes_cascade.detectMultiScale()函数是它在循环的第二次冻结的地方。
  • freeze up 是什么意思?我在使用 OpenCV 3 时遇到问题,网络摄像头初始化处理不当会导致 BSOD。

标签: c++ opencv


【解决方案1】:

您似乎没有存储面孔向量。你有它在公共场合 std::vector 面;但是你在哪里使用它?眼睛和面孔是两组不同的数据。您还混合了两种风格的代码 c 风格和 c++ 风格的 opencv。你应该坚持使用 c++,因为你使用的是最新的 opencv 版本。

   faces.clear(); // under here  
   std::vector<Rect>faces; // see if this helps  

/////////////////////////////////////// ///////////////////////////////////////// ///////////////////////////////////////// /////////////////

    void saveImage(cv::Mat img, const char* filename); //should be 
    void imwrite(img, const char* filename);// etc.  

    cv::Mat img = _core.captureImage(-1);
    img = _core.detectFace(img);
    _core.displayImage(img, "parker"); // should be 
    _core.displayImage(Mat frame); 

假设 core.captureImage(-1); 这可能不起作用 是你的相机。 int convertImage(cv::Mat img, int type); do? 你确定它需要一个 int 值吗?

c++ 约定是

Videocapture cap(0);
Mat frame: 
cap >> frame; 
namedWindow("video");
imshow(video, frame); //etc   

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题。我发现包含 eye_cascade.detectMultiScale 的行是导致我的驱动程序崩溃的行。我有英特尔高清显卡 4400。 在我完全卸载英特尔高清显卡驱动程序后,代码开始完美运行。

    【讨论】:

      猜你喜欢
      • 2015-01-11
      • 2012-02-04
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多