我正在尝试使用来自Neurotechnology的名为VeriFinger的软件开发工具包来处理包含指纹捕获的BMP文件(用于增强),并将其保存为新的BMP文件。
VeriFinger附带了一些教程和示例,其中主要的一个称为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");
}
但是,图像不会保存。由于某种原因,行if (image.GetHandle())
返回false
。这就是我添加testing
部分的原因。
使用调试器检查test2
和test3
的值告诉我:
handle=0x00000000 isDisposed=false
GetProcessedImage()
返回NULL
,这非常奇怪,因为test1
正确地返回了finger
对象的文件名。我肯定错过了什么..。我已经为此挣扎了几个小时了。
VeriFinger为available as a 30-day trial (700MB)。SDK文档位于CHM和PDF格式的Documentation
文件夹中。
谢谢。
发布于 2018-04-21 05:46:00
为了使图像保存起作用,必须首先:
定义一个类型为Client::NBiometricClient
NSubject
SetFingersReturnProcessedImage()
接受类型为SetId()
的参数-此类型有一个默认的C样式字符串(以空值结尾的字符数组)的构造函数,与question
finger.SetFileName()
相同,它的另一个成员函数GetFingers()
,并在返回的对象上调用Add()
。将先前定义的NFinger
类型的对象(在问题主体中称为finger
)用作Add()
的自变量,
NBiometricTask
类型的对象,并通过调用来自在步骤1定义的对象的另一成员函数来初始化它,该另一成员函数是CreateTask()
并具有两个自变量:nboEnroll
(枚举)及其成员函数GetSubjects()
,并对返回的对象调用D31,使用在步骤3定义的对象H233的自变量H134从步骤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为我指明了正确的方向。
发布于 2015-10-05 14:14:41
从仔细阅读示例代码和一些阅读来看,您的问题似乎是两个可能的问题之一。
图像不正确。除了不喜欢的输入图像之外,我找不到更多的信息,所以尝试几个不同大小的不同输入图像。这就是为什么我问GetImage()
输出到test2变量中的是什么?如果这不能正常工作,则表明您的输入图像不受欢迎。
在我阅读的所有示例代码中,在对NFinger实例执行任何操作之前,NFinger实例似乎已添加到主题中。我不确定这是否以某种方式修改了NFinger实例,因为文档似乎很少。看看NSubject.hpp,它暗示手指被添加到FingersCollection中,但似乎并没有做更多的事情。
在“测试”部分之前,将finger代码添加到主题中:
NSubject subject;
subject.SetId("Some Unique String");
subject.GetFingers().Add(finger);
最后,如果失败了,看看示例代码中m_biometricClient
变量的用法,特别是它的初始化,m_biometricClient.SetFingersReturnProcessedImage(true)
看起来很有趣,不是吗!你会在FingersSampleForm.cpp中看到相当多的初始化代码。当添加手指时,客户端似乎负责通过任务对其进行注册(请参阅带有nboEnroll
操作的void FingersSampleForm::OnEnroll)
方法。
https://stackoverflow.com/questions/32918095
复制相似问题