OpenCV人脸检测使用detectMultiScale可能会报错_CrtIsValidHeapPointer的解决方法

原创 2015年11月18日 14:49:12

运行环境:VS2012+OpenCV2.4.8。

存在问题:
在使用OpenCV的人脸检测时,用到了detectMultiScale函数,使用方法为:face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30, 30) );
其中faces为vector,在faces这个vector释放时,会出现_CrtIsValidHeapPointer的bug。这应该是由于detectMultiScale函数封装在OpenCV的dll中,在检测到人脸后会对faces这个vector进行操作,而在该变量使用结束释放时,再次对其进行操作时,就会报错。

代码如下:

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

// Global variables
// Copy this file from opencv/data/haarscascades to target folder
string face_cascade_name = "F:\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
CascadeClassifier *face_cascade;
string window_name = "Capture - Face detection";
int filenumber; // Number of file to be saved
string filename;

// Function Headers
class faceDetection
{
private:
    std::vector<Rect> faces;
public:
    faceDetection();
    ~faceDetection();
    void detectAndDisplay(Mat frame);
};
faceDetection::faceDetection()
{
}
faceDetection::~faceDetection()
{
}

// Function detectAndDisplay
void faceDetection::detectAndDisplay(Mat frame)
{
    // 报错问题所在,。
    // std::vector<Rect> faces;

    Mat frame_gray;
    Mat crop;
    Mat res;
    Mat gray;
    string text;
    stringstream sstm;

    cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
    equalizeHist(frame_gray, frame_gray);

    // Detect faces
    face_cascade->detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));

    // Set Region of Interest
    cv::Rect roi_b;
    cv::Rect roi_c;

    size_t ic = 0; // ic is index of current element
    int ac = 0; // ac is area of current element

    size_t ib = 0; // ib is index of biggest element
    int ab = 0; // ab is area of biggest element

    for (ic = 0; ic < faces.size(); ic++) // Iterate through all current elements (detected faces)

    {
        roi_c.x = faces[ic].x;
        roi_c.y = faces[ic].y;
        roi_c.width = (faces[ic].width);
        roi_c.height = (faces[ic].height);

        ac = roi_c.width * roi_c.height; // Get the area of current element (detected face)

        roi_b.x = faces[ib].x;
        roi_b.y = faces[ib].y;
        roi_b.width = (faces[ib].width);
        roi_b.height = (faces[ib].height);

        ab = roi_b.width * roi_b.height; // Get the area of biggest element, at beginning it is same as "current" element

        if (ac > ab)
        {
            ib = ic;
            roi_b.x = faces[ib].x;
            roi_b.y = faces[ib].y;
            roi_b.width = (faces[ib].width);
            roi_b.height = (faces[ib].height);
        }

        crop = frame(roi_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

        // Form a filename
        filename = "";
        stringstream ssfn;
        ssfn << filenumber << ".png";
        filename = ssfn.str();
        filenumber++;

        imwrite(filename, gray);

        Point pt1(faces[ic].x, faces[ic].y); // Display detected faces on main window - live stream from camera
        Point pt2((faces[ic].x + faces[ic].height), (faces[ic].y + faces[ic].width));
        rectangle(frame, pt1, pt2, Scalar(0, 255, 0), 2, 8, 0);
    }

    // Show image
    sstm << "Crop area size: " << roi_b.width << "x" << roi_b.height << " Filename: " << filename;
    text = sstm.str();

    putText(frame, text, cvPoint(30, 30), FONT_HERSHEY_COMPLEX_SMALL, 0.8, cvScalar(0, 0, 255), 1, CV_AA);
    imshow("original", frame);
    // waitKey();

    if (!crop.empty())
    {
        imshow("detected", crop);
        // waitKey();
    }
    else
        destroyWindow("detected");

}


// Function main
int main()
{
    faceDetection *face;
    face = new faceDetection;
    // Load the cascade
    face_cascade = new CascadeClassifier;
    if (!face_cascade->load(face_cascade_name)){
        printf("--(!)Error loading\n");
        return (-1);
    }

    // Read the image file
    Mat frame = imread("lp.jpg");

    // Apply the classifier to the frame
    if (!frame.empty()){
        face->detectAndDisplay(frame);
    }
    else{
        printf(" --(!) No captured frame -- Break!");
        //break;
    }

    int c = waitKey(1000);

    if (27 == char(c)){
       // break;
    }

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。有问题可以加微信:lp9628(注明CSDN)。

相关文章推荐

Python OpenCV 解决人脸识别报错cascade.detectMultiScale error

Authored by Monana Contact me via hemonan@vip.163.com 环境:Python2.7 OpenCV3.1.0 Win-64bit我想在OpenCV...

Python-OpenCV人脸检测(代码)

做人脸识别,首先要检测出图片/视频中的人脸,今天就研究了一下OpenCV的Python接口,把常用的一些功能模块写成函数。基于Python-OpenCV以及PIL,实现图片中人脸的检测以及截取保存、眼...

opencv人脸检测--detectMultiScale函数

人脸识别--detectMultiScale函数 首先上两张图。 现在要对上面两张图进行人脸识别。 直接介绍detectMultiScale函数,分类器方面的知识请参考...

从摄像头中检测脸并保存图像

改写自:http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html #inc...

OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect

OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification)。注意,新版本的C++接口除了Haar特征以外也...

由.detectMultiScale()函数调试引起的异常问题的解决方案

最近,在调试一个关于人脸特征点定位(face alignment)的程序时,出现了一些程序运行出现异常的问题,经过仔细分析之后,最终将问题解决了。以下是问题解决的基本过程。 注1:本人使用的平台:V...

调用opencv的detectMultiScale函数时报错

我拿detectMultiScale()函数来进行我指定训练好的类别检测时,发现程序会异常,跳转到free.c文件里去,如果把这句屏蔽掉就没有,我知道问题出在这里了,可是怎么调用强大的opencv会有...

opencv使用detectMultiScale报错原因

今天用detectMultiScale去检测人脸识别,总是报错 最终发现错误的源头尽然是: cascade.detectMultiScale(grayImage, rect, 1.1, 2, 0)...

openCV|Haar人脸检测与提取

python3.5.2+openCV3.2.0 Haar人脸检测与提取

Opencv2.4.9多尺度检测detectMultiScale函数源码分析

注:部分内容转载自http://blog.csdn.net/delltdk/article/details/9186875   一、简介     在Opencv2.4.9的源码中,对module...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV人脸检测使用detectMultiScale可能会报错_CrtIsValidHeapPointer的解决方法
举报原因:
原因补充:

(最多只允许输入30个字)