使用VeriFinger无法保存已处理的指纹图像

Mar*_*377 5 c++ image-processing fingerprint

我正在尝试使用来自Neurotechnology的名为VeriFinger的SDK 来处理包含指纹捕获(用于增强)的BMP文件,并将其保存到新的BMP文件中.

VeriFinger附带了一些教程和示例,主要的一个叫做FingersSampleWX.

它看起来像这样:

FingersSampleWX截图

按照这个应用程序的源代码作为指导,我能够组装这段代码,它应该做我想要的,或者我相信:

#include <iostream>
#include <NLicensing.hpp>
#include <NMedia.hpp>
#include <NBiometrics.hpp>

using namespace Neurotec::Biometrics;
using namespace Neurotec::Images;
using namespace Neurotec::Licensing;

int main()
{
    if (NLicense::ObtainComponents("/local", "5000", "Biometrics.FingerExtraction"))
        std::wcout << L"License OK\n";
    else
        std::wcout << L"License fail\n";

    NFinger finger;
    finger.SetFileName("F:\\input\\000001\\MDT1.BMP");
    finger.SetPosition(nfpUnknown);
    finger.SetImpressionType(nfitNonliveScanPlain);

    // testing
    auto test1 = finger.GetFileName();
    auto test2 = finger.GetImage();
    auto test3 = finger.GetProcessedImage();

    NImage image(NULL);
    if (finger.GetHandle())
    {
        image = finger.GetProcessedImage();

        if (image.GetHandle())
            image.Save("F:\\output\\000001\\MDT1_out.bmp");
    }   
    NLicense::ReleaseComponents("Biometrics.FingerExtraction");
}
Run Code Online (Sandbox Code Playgroud)

但是,图像不会保存.由于某种原因,该行if (image.GetHandle())返回false.这就是我添加该testing部分的原因.

检查test2test3使用调试器的值告诉我:

handle = 0x00000000 isDisposed = false

GetProcessedImage()返回NULL,这很奇怪,因为正确test1返回finger对象的文件名.我肯定错过了一些东西......现在已经挣扎了好几个小时了.

VeriFinger 可以进行为期30天的试用(700MB).SDK文档位于DocumentationCHM和PDF格式的文件夹中.

谢谢.

Mar*_*377 1

为了使图像保存工作,必须首先:

  1. 定义一个类型的对象Client::NBiometricClient

  2. SetFingersReturnProcessedImage()使用trueas 参数调用其成员函数

  3. 定义一个类型的对象NSubject

  4. 调用其SetId()接受类型参数的成员函数NStringWrapper- 该类型具有 C 样式字符串(以 null 终止的 char 数组)的默认构造函数,与finger.SetFileName()问题中的示例相同

  5. 调用其另一个成员函数 ,GetFingers()并调用返回的对象,使用先前定义的类型的对象Add()作为参数(在问题正文中调用)Add()NFingerfinger

  6. 定义一个类型的对象NBiometricTask,并通过从步骤 1 中定义的对象调用另一个成员函数来初始化它,该函数是CreateTask()和 接受两个参数:(nboEnroll一个枚举)和NULL

  7. 调用其成员函数GetSubjects()并调用Add()返回的对象,用作Add()步骤 3 中定义的对象的参数

  8. 使用步骤 6 中定义的对象作为参数,从步骤 1 中定义的PerformTask()对象调用另一个成员函数(此成员函数)。

实践中看起来更简单:

// (previous code from question)
NFinger finger;
finger.SetFileName("F:\\input\\000001\\MDT1.BMP");
finger.SetPosition(nfpUnknown);
finger.SetImpressionType(nfitNonliveScanPlain);

// Needed initializations:
Client::NBiometricClient m_biometricClient;
m_biometricClient.SetFingersReturnProcessedImage(true);
NBiometricTask task = m_biometricClient.CreateTask(nboEnroll, NULL);

NSubject subject;
subject.SetId("F:\\input\\000001\\MDT1.BMP");   // I'm just using the filename as argument as its purpose is rather temporary
subject.GetFingers().Add(finger);

task.GetSubjects().Add(subject);
m_biometricClient.PerformTask(task);
// ok, everything should work now

// (...)
Run Code Online (Sandbox Code Playgroud)

感谢user3791372为我指明了正确的方向。