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

Cannot save processed fingerprint image with VeriFinger

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

VeriFinger 附带一些教程和示例,主要的一个称为 FingersSampleWX

看起来像这样:

以这个应用程序的源代码为指导,我能够assemble这段代码应该做我想做的,或者我相信:

#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");
}

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

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

handle=0x00000000 isDisposed=false

GetProcessedImage()returnsNULL,这很奇怪,因为test1returnsfinger对象的文件名正确。我肯定遗漏了一些东西......现在已经为此苦苦挣扎了几个小时。

VeriFinger 是 available as a 30-day trial (700MB)。 SDK 文档以 CHM 和 PDF 格式位于 Documentation 文件夹中。

谢谢。

通过仔细阅读示例代码和进行一些阅读,您的问题似乎是两个可能的问题之一。

要么图片不正确。我找不到比不喜欢的输入图像更多的信息,所以尝试一些不同尺寸的不同输入图像。这就是为什么我问 GetImage() 输出到 test2 var 中的是什么?如果这不能正常工作,则表明您输入的图像不喜欢。

在我阅读的所有示例代码中,NFinger 实例似乎是在对 NFinger 实例执行任何操作之前添加到主题中的。我不确定这是否以某种方式修改了 NFinger 实例,因为文档似乎相当简单。查看 NSubject.hpp,它表明手指已添加到 FingersCollection,但似乎没有做更多的事情。

在"testing"部分之前,将手指代码添加到主题中:

NSubject subject;
subject.SetId("Some Unique String");
subject.GetFingers().Add(finger);

最后,失败了,看看示例代码中 m_biometricClient 变量的使用,尤其是它的初始化,m_biometricClient.SetFingersReturnProcessedImage(true) 看起来很有趣不是吗! FingersSampleForm.cpp 中有相当多的初始化代码。添加手指时,客户端似乎负责通过任务注册它(请参阅 void FingersSampleForm::OnEnroll) 方法和 nboEnroll.

的操作

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

  1. 定义类型为Client::NBiometricClient

  2. 的对象
  3. 使用true作为参数调用其成员函数SetFingersReturnProcessedImage()

  4. 定义一个NSubject

  5. 类型的对象
  6. 调用它的成员函数 SetId() 接受一个类型为 NStringWrapper 的参数——这个类型有一个 C 风格字符串(以 null 终止的字符数组)的默认构造函数,与问题示例中的 finger.SetFileName() 相同

  7. 调用它的另一个成员函数 GetFingers(),并在返回的对象上调用 Add(),使用类型为 Add() 的对象作为参数21=] 之前定义的(在问题正文中称为 finger

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

  9. 调用其成员函数 GetSubjects() 并在返回的对象上调用 Add(),使用在步骤 3[=32= 中定义的对象作为 Add() 的参数]

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

实践起来比较简单:

// (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

// (...)

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