Qt 程序以代码 -1073741819 退出



我正在开发一个基于Windows 7中使用Qt和Opencv的人脸识别的项目。我现在遇到了一个非常死胡同...我需要使用一些图像训练人脸识别器......但是每当我注释掉火车语句时,程序运行良好,但不会有意实现我的目的......

void Dialog::on_btnAdd_2_clicked()
{
    tmrTimer->stop();
    dir=QDir(directory);
    QFileInfoList files;
    QFileInfo file;
    QString filen;

    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    files=dir.entryInfoList();
    int nofiles;
    nofiles=files.size();
    for(int i=0;i<nofiles;i++)
    {
        file=files.at(i);
        filen=file.absoluteFilePath();

        std::string fname = filen.toStdString();
        filen=file.baseName();
        std::string filename=filen.toStdString();
        char* path = new char [fname.size()+1];
        char name[10];
        strcpy(name,filename.c_str());
        strcpy( path, fname.c_str() );
        name[1]='';
        ui->boxConsole->appendPlainText(path);
        ui->boxConsole->appendPlainText(name);
        cv::Mat temp=cv::imread(path,-1);
        newImages.push_back(temp);
        newLabels.push_back(atoi(name));
    }

    ui->boxConsole->appendPlainText("Training Started....!!");
    cv::Ptr<cv::FaceRecognizer> model = cv::createEigenFaceRecognizer();
    model->train(newImages,newLabels);   ///training statement
    //strcat(home,"\data.xml");

    //model->save(home);

    ui->boxConsole->appendPlainText("Training Completed!!");
    tmrTimer->start();
}

当我运行项目并单击启动上述功能的按钮时,进程崩溃说......

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: QtTracker3.exe
  Application Version:  0.0.0.0
  Application Timestamp:    5101dde0
  Fault Module Name:    libopencv_core242.dll
  Fault Module Version: 0.0.0.0
  Fault Module Timestamp:   50da6896
  Exception Code:   c0000005
  Exception Offset: 000a38f0
  OS Version:   6.1.7600.2.3.0.256.1
  Locale ID:    1033
  Additional Information 1: 0a9e
  Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
  Additional Information 3: 0a9e
  Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Read our privacy statement online:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409
If the online privacy statement is not available, please read our privacy statement offline:
  C:Windowssystem32en-USerofflps.txt

我修改了代码,如下所示,听取建议...并遇到了另一个问题...

void Dialog::on_btnAdd_2_clicked()
{
    tmrTimer->stop();
    dir=QDir(directory);
    QFileInfoList files;
    QFileInfo file;
    QString filen;
    char name[10];
    int i,j;
    std::string str;

    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    files=dir.entryInfoList();
    int nofiles;
    nofiles=files.size();
    for(i=0;i<nofiles;i++)
        {
            file=files.at(i);
            filen=file.baseName();
            std::string filename=filen.toStdString();
            strcpy(name,filename.c_str());
            for(j=0;name[j]!='-';j++);
            name[j]='';
            filen=file.absoluteFilePath();
            str=filen.toStdString();
            cv::Mat offimage=cv::imread(str.c_str(),-1);
            cv::namedWindow("face",WINDOW_AUTOSIZE);     //show retrieved image in a window
            cv::imshow("face",offimage);
            cvvWaitKey(1000);
            newImages.push_back(offimage);
            newLabels.push_back(atoi(name));

        }

我删除了 for 循环中使用的指针,并且仍然存在相同的问题......

我还发现qt创建者在其问题选项卡中报告了一个问题:

:-1: warning: auto-importing has been activated without --enable-auto-import specified on the command line.

当代码崩溃时,请使用调试器找出崩溃的位置。如果您不了解原因,请在问题中添加回溯。

我假设您的崩溃是在循环文件时的文件名处理中。您通过使用 char* 而不是 std::string 或 QString 打开多个蠕虫罐,并且没有正确操作。

这一次,这是非常不安全的,也是不安全的(缓冲区溢出):

    char name[10];
    ...
    strcpy(name,filename.c_str());

如果文件名长于 9,则行为未定义(很可能是崩溃)。

您也在泄漏内存,因为此分配永远不会释放:char* 路径 = new char [fname.size()+1];

所以我强烈建议使用 QString 而不是摆弄 char*。如果你需要将 char* 传递给 OpenCV,你可以这样做:

const QByteArray ba = filename.toLatin1(); //or toUtf8(), toLocal8Bit(), depending on the encoding you need
... functionTakingChar( ba.constData(), -1 ); // or .data(), if imread() takes a non-const char

Imread 需要一个 std::string,所以:

... imread( filename.toStdString(), -1 );

相关内容

  • 没有找到相关文章