0

我正在为 Qt 使用 OpenCV。

我正在做一个能够检测多个对象的程序。到目前为止,我可以制作面部、眼睛和鼻子检测器,但是当我尝试进行全身检测时,要么得到完全错误的检测,要么根本没有检测到,要么程序崩溃。为了检测全身,我只使用与其他检测相同的代码,但使用 haarcascade_fullbody.xml 文件。不能使用相同的代码吗?为什么它适用于其他功能而不适用于全身?

我还尝试使用来自https://github.com/Itseez/opencv_extra/tree/master/testdata/cv/latentsvmdetector/models_VOC2007的 OpenCV 预训练模型来实现汽车检测,但我得到了解析错误。

提前致谢!

来自 MainWindow 的代码:

    void MainWindow::on_btnFullBody_clicked()
{
        WriteInLog("Full body detection requested");
        QString xml = tr("%1/%2").arg(QApplication::applicationDirPath()).arg(FULL_BODY_FILE);
        FeatureDetector detector(xml);
        std::vector<QRect> rest;
        float scaleFactor= 1.1f;
        uint neighbours= 2;
        bool ret = detector.DetectFeature(&mSelectedImage, rest, scaleFactor, neighbours);
        if (!ret)
        {
            WriteInLog("No full body has been detected");
        }
        else
        {
            QVector<QRect> qRect = QVector<QRect>::fromStdVector(rest);
            processedImage(qRect);
            WriteInLog("Bodys detected: "+QString::number(qRect.size()));
        }
}

来自 DetectFeature 的代码:

bool FeatureDetector::DetectFeature(QImage* image, std::vector<QRect> &returnList, float scaleFactor, uint neighbours)
{ 
    returnList.clear();
    bool ok  = false;
    qDebug() << "Starting...";
    if (!image->isNull()) {
        //Changing from QImage to matrix
        QImage temp = image->copy();
        cv::Mat res(temp.height(),temp.width(),CV_8UC3,(uchar*)temp.bits(),temp.bytesPerLine());
        cv::Mat res_gray;
        //Changing the image to grey scale an equalizing the result
        cvtColor(res, res_gray,CV_BGR2GRAY);
        cv::equalizeHist(res_gray,res_gray);
        cv::CascadeClassifier detector;
        std::vector< cv::Rect > featureVec;
        bool retDetector=true; // detector.load("C:/Users/ansurbcn_2/Pictures/cara.jpg");
        qDebug()<<mXmlFilePath;
        if (!detector.load(mXmlFilePath.toLatin1().constData()))
        {
             qDebug() << "Error loading detector";
             return false;
        }

        detector.detectMultiScale(res_gray, featureVec);
        //detector.detectMultiScale(res_gray, featureVec, scaleFactor, neighbours, 18|9);

        if (retDetector) {
            qDebug() << "OK Detector";
        }
        else {
            qDebug() << "Failed Detector";
        }
        for(size_t i=0; i<featureVec.size();i++)
        {
            cv::Rect oneFeature =featureVec[i];
            QRect qrect(oneFeature.x, oneFeature.y, oneFeature.width, oneFeature.height);

            returnList.push_back(qrect);
            ok = true;
        }
    }
    return ok;

}
4

0 回答 0