首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法使用VeriFinger保存已处理的指纹图像

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

Stack Overflow用户
提问于 2015-10-03 09:42:32
回答 2查看 1.5K关注 0票数 5

我正在尝试使用来自Neurotechnology的名为VeriFinger的软件开发工具包来处理包含指纹捕获的BMP文件(用于增强),并将其保存为新的BMP文件。

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

它看起来是这样的:

遵循这个应用程序的源代码作为指导,我能够组装这段代码,这段代码应该可以做我想做的事情,或者我相信:

代码语言:javascript
复制
#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())返回false。这就是我添加testing部分的原因。

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

handle=0x00000000 isDisposed=false

GetProcessedImage()返回NULL,这非常奇怪,因为test1正确地返回了finger对象的文件名。我肯定错过了什么..。我已经为此挣扎了几个小时了。

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-21 05:46:00

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

定义一个类型为Client::NBiometricClient

  • call的对象,它的成员函数使用argument

  • define作为NSubject

  • call类型的对象,它的成员函数SetFingersReturnProcessedImage()接受类型为SetId()的参数-此类型有一个默认的C样式字符串(以空值结尾的字符数组)的构造函数,与question

  • call中的示例中的finger.SetFileName()相同,它的另一个成员函数GetFingers(),并在返回的对象上调用Add()。将先前定义的NFinger类型的对象(在问题主体中称为finger )用作Add()的自变量,

  • 定义NBiometricTask类型的对象,并通过调用来自在步骤1定义的对象的另一成员函数来初始化它,该另一成员函数是CreateTask()并具有两个自变量:nboEnroll (枚举)及其成员函数GetSubjects(),并对返回的对象调用D31,使用在步骤3定义的对象H233的自变量H134从步骤1定义的对象调用另一成员函数,这是PerformTask(),使用在步骤6中定义的对象作为参数。

在实践中看起来更简单:

代码语言:javascript
复制
// (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为我指明了正确的方向。

票数 1
EN

Stack Overflow用户

发布于 2015-10-05 14:14:41

从仔细阅读示例代码和一些阅读来看,您的问题似乎是两个可能的问题之一。

图像不正确。除了不喜欢的输入图像之外,我找不到更多的信息,所以尝试几个不同大小的不同输入图像。这就是为什么我问GetImage()输出到test2变量中的是什么?如果这不能正常工作,则表明您的输入图像不受欢迎。

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

在“测试”部分之前,将finger代码添加到主题中:

代码语言:javascript
复制
NSubject subject;
subject.SetId("Some Unique String");
subject.GetFingers().Add(finger);

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32918095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档