Opencv Ptr класс. Указатель объекта удаляется после вызова функции

0

Я хочу сделать обертку над opencv классом FaceRecognizer. Я назвал его "Идентификатор" и здесь код

заголовок

class Identifier
{
public:
Identifier();
Identifier(const std::string& filename);
Identifier(const TrainData& trainData);

~Identifier();

void train(const TrainData& trainData);

private:

cv::Ptr<cv::FaceRecognizer> _model;
};

CPP

#include "Identifier.h"

#include <fstream>
#include <iostream>
#include <cstdlib>

using namespace std;

Identifier::Identifier()
{
cout << "default constructor\n";
if(_model.empty())
    cout << "model has not been created\n";
}

Identifier::Identifier(const string& filename)
{
Identifier();

TrainData td;
td.load(filename);

if(_model.empty())
    cout << "constructor model is empty\n";

train(td);
}

Identifier::~Identifier()
{
_model.delete_obj();
}

Identifier::Identifier(const TrainData& trainData)
{
Identifier();

train(trainData);
 }

 void Identifier::train(const TrainData& trainData)
 {
cout << "train enter\n";
if(_model.empty())
    cout << "model is empty\n";

vector<cv::Mat> images;
vector<int> labels;

for(int i = 0; i < trainData.size(); ++i)
{
    Person curPerson = trainData[i];

    vector<string> curPersonImages = curPerson.getImages();

    int j = 0;

    for(auto imagePath: curPersonImages)
    {
        cv::Mat mat = cv::imread(imagePath, CV_LOAD_IMAGE_GRAYSCALE);

        images.push_back(mat);
        labels.push_back(curPerson.getId());
    }
}

cout << "here\n" 
        << images.size() << " - " << labels.size();

try
{
    _model->train(images, labels);
} catch(cv::Exception& e)
{
    cout << e.msg;
} catch(...)
{
    cout << "something goes wrong\n";
}
cout << "here 1\n";
 }

У меня проблема с cv :: Ptr, так как я понимаю, что это какой-то умный указатель, но есть проблема, как только я вызываю cv :: createLBPHFaceRecognizer(); в конструкторе указатель освобождается в следующей функции, и моя программа разбивается, потому что объект _model пуст. Кто-нибудь может мне помочь. Как я могу инициализировать _model один раз в конструкторе, а затем использовать его в других местах?

Я использую opencv v2.4.9, MinGW как компилятор.

Теги:
opencv
smart-pointers
abstract-class

1 ответ

2
Лучший ответ

если вы хотите вызвать пустой конструктор перед параметризованным, вам придется сделать это следующим образом:

Identifier::Identifier()
   : model_( cv::createLBPHFaceRecognizer() )
{
}

Identifier::Identifier(const string& filename)
   : Identifier()
{
...
}

ваш идентификатор(); вызов выше делает локальную копию и удаляет ее

  • 0
    большое большое спасибо! Я провожу все утро, пытаясь решить эту проблему! Я смешал это с Java-способом, где вы можете вызывать конструктор внутри другого конструктора, как этот (params ...);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню