Я хочу сделать обертку над 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 как компилятор.
если вы хотите вызвать пустой конструктор перед параметризованным, вам придется сделать это следующим образом:
Identifier::Identifier()
: model_( cv::createLBPHFaceRecognizer() )
{
}
Identifier::Identifier(const string& filename)
: Identifier()
{
...
}
ваш идентификатор(); вызов выше делает локальную копию и удаляет ее