C++ 级联分类器::detectMultiScale不';t使用C++;

C++ 级联分类器::detectMultiScale不';t使用C++;,c++,opencv,C++,Opencv,我正在使用OpenCV和CascadeClassifier::detectMultiScale进行面部检测。我的问题是,它似乎会导致输出向量上的内存损坏。向量正确地填充了rect,但在释放向量时会导致崩溃 这仅在编译调试生成时发生。错误消息是调试断言失败,这让我想知道在发布版本中是否也出现了问题,并且断言没有被检查 这可能是OpenCV的错误吗?或者只是我在处理向量的方式上做错了什么 下面的代码段显示了一个重现该错误的示例代码: #include <opencv2/opencv.hpp&g

我正在使用OpenCV和
CascadeClassifier::detectMultiScale
进行面部检测。我的问题是,它似乎会导致输出向量
上的内存损坏。向量正确地填充了rect,但在释放向量时会导致崩溃

这仅在编译调试生成时发生。错误消息是调试断言失败,这让我想知道在发布版本中是否也出现了问题,并且断言没有被检查

这可能是OpenCV的错误吗?或者只是我在处理向量的方式上做错了什么

下面的代码段显示了一个重现该错误的示例代码:

#include <opencv2/opencv.hpp>
using namespace cv;

int main(array<System::String ^> ^args)
{
    VideoCapture video(0);
    Mat frame;
    CascadeClassifier classifier("haarcascade_frontalface_default.xml");

    while (waitKey(1000 / 30) != 'q')
    {
        video >> frame;

        vector<Rect> faces;
        classifier.detectMultiScale(frame, faces);
        for (int i = 0; i < faces.size(); i++)
            rectangle(frame, faces[i], Scalar(255, 255, 255));

        imshow("Camera", frame);
    } // <<< The crash occurs here when the faces vector is released
}
#包括
使用名称空间cv;
int main(数组^args)
{
视频捕获视频(0);
垫架;
级联分类器(“haarcascade_frontalface_default.xml”);
while(waitKey(1000/30)!='q')
{
视频>>帧;
向量面;
分类器。检测多尺度(帧、面);
对于(int i=0;i}//我也遇到了同样的问题。我通过向函数传递一个取消引用的全局指针来解决这个问题

std::vector*faces=nullptr;
void init()
{
faces=new std::vector;//无论做什么,都不要调用delete
}
void findSomeFaces()
{
级联->检测多尺度(图像源,*面);
}

这段代码还能工作吗?你不需要
waitKey(0)
才能真正显示imshow()。另外,可能是因为
imshow()
正在使用rect仍在使用的一个帧吗?这里应该没有理由对向量使用
new
。@GPPK:
waitKey(1000/30)
意味着它将等待一个键,并尝试每秒运行30帧。如果我删除
删除面;
行,一切都会正常工作(当然,内存泄漏除外)@ CrasMrST:你是对的,我选择这样分配它,当终结器被调用时使它显式。如果我不使用<代码>新< /C> >,它在循环结束时仍然以同样的方式崩溃。@ MiRuSuC++没有终结器,而是析构函数,并且析构函数无论如何会被作为块(非指针)调用在块的结尾。变量超出范围。因此,不确定您使用
new
所做的操作是否有任何不同这是否会导致内存泄漏?我问这个问题是因为我在尝试合并两个具有各自内存管理的项目时遇到了相同的情况。当我尝试删除分配的内存时,它仍然崩溃。因此,现在我不想删除完全删除它,否则它会使我的程序崩溃。没错,我的程序中也有同样的问题,这就是为什么我添加了厚颜无耻的评论。理论上,这是内存泄漏,但是在cv::Rect(清空或不清空)的向量上调用delete导致问题。必须注意不要连续分配cv::Rect向量。程序结束时留下的任何内容都将由操作系统清理。问题存在于OpenCV代码中的某个地方。并没有真正解决问题。我已经尝试过,但仍然崩溃。我编译到发行版,它成功了。
    std::vector<cv::Rect>* faces = nullptr;

    void init()
    {
        faces = new std::vector<cv::Rect>; //never call delete whatever you do
    }

    void findSomeFaces()
    {
        cascade->detectMultiScale(image_source, *faces);
    }