gpt4 book ai didi

android - 如何从适用于Android的OpenCV中的指针创建FaceRecognizer

转载 作者:行者123 更新时间:2023-12-02 17:12:44 25 4
gpt4 key购买 nike

我正在使用OpenCV 2.4.10。

JNI-训练面部识别

JNIEXPORT jlong JNICALL Java_com_sample_facialRecognition_DetectionBasedRecognition_nativeTrain
(JNIEnv * jenv, jstring pathIn)
{
vector<Mat> images;
vector<int> labels;
try {

std::string path;
std::string classlabel = "A";
GetJStringContent(jenv,pathIn,path);

if(!path.empty() && !classlabel.empty()) {
images.push_back(imread(path, 0));
labels.push_back(atoi(classlabel.c_str()));
}
Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
model->train(images, labels);

model.addref(); //don't let it self-destroy here..
FaceRecognizer * pf = model.obj;
return (jlong) pf;

}
catch (...)
{
return 0;
}

}

Java-训练识别器
mNativeRecognition = nativeTrain(getFilesDir().toString());

Java-做检测和识别
nativeDetect(mGray, faces, mNativeRecognition);

JNI-认识
JNIEXPORT jint JNICALL Java_com_sample_facialRecognition_DetectionBasedTracker_nativeDetect
(JNIEnv * jenv, jclass, jlong thiz, jlong imageGray, jlong faces, jlong recog)
{
jint whoAreYou= 0;

try
{
vector<Rect> RectFaces;
((DetectionBasedTracker*)thiz)->process(*((Mat*)imageGray));
((DetectionBasedTracker*)thiz)->getObjects(RectFaces);

Ptr < FaceRecognizer > model = recog; //here is the problem

vector_Rect_to_Mat(RectFaces, *((Mat*)faces));

for (int i = 0; i < faces.size(); i++)
{
cv::Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
cv::Point pt2(faces[i].x, faces[i].y);

cv::Rect face_i = faces[i];

cv::Mat face = grayscaleFrame(face_i);
cv::Mat face_resized;

cv::resize(face, face_resized, cv::Size(100, 120), 1.0, 1.0, INTER_CUBIC);
whoAreYou = model->predict(face_resized);
}
}
catch (...)
{

//catch...
}

return whoAreYou;
}

因此,我试图从nativeTrain转换存储的指针,并使用它实时地在一个函数中检测和识别人脸。如何将指针转换回nativeDetect中可用的FaceRecognizer?

最佳答案

编辑:正如在berak的评论中,最好使用原始指针版本,否则您将需要使用addref保存对象。

如果仍然更喜欢cv::Ptr版本,而不是Ptr < FaceRecognizer > model = recog;,我们应该给出

Ptr < FaceRecognizer > model( (FaceRecognizer *)recog );
model->addref();

C++中的智能指针实现( std::shared_ptrstd::unique_ptr或不建议使用的 std::auto_ptr)将不支持从原始指针到智能指针的分配。在此处查看旧的 cv::Ptr实现( 1)。他们还添加了一个 explicit关键字( 2),以防止从原始指针到智能指针的意外转换。

注意:在OpenCV 3.0的 Ptr类中, obj成员是private( 3),并且 addref方法已删除。因此,这不适用于3.0。还好奇为什么所有这些调用都通过JNI进行。没有Java包装器?

关于android - 如何从适用于Android的OpenCV中的指针创建FaceRecognizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28290270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com