无法使用 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
部分的原因。
使用调试器检查 test2
和 test3
的值告诉我:
handle=0x00000000 isDisposed=false
GetProcessedImage()
returnsNULL
,这很奇怪,因为test1
returnsfinger
对象的文件名正确。我肯定遗漏了一些东西......现在已经为此苦苦挣扎了几个小时。
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
.
的操作
为了保存图像,首先必须:
定义类型为Client::NBiometricClient
的对象
使用true
作为参数调用其成员函数SetFingersReturnProcessedImage()
定义一个NSubject
类型的对象
调用它的成员函数 SetId()
接受一个类型为 NStringWrapper
的参数——这个类型有一个 C 风格字符串(以 null 终止的字符数组)的默认构造函数,与问题示例中的 finger.SetFileName()
相同
调用它的另一个成员函数 GetFingers()
,并在返回的对象上调用 Add()
,使用类型为 Add()
的对象作为参数21=] 之前定义的(在问题正文中称为 finger
)
定义一个 NBiometricTask
类型的对象,并通过从步骤 1 中定义的对象调用另一个成员函数来初始化它,该对象是 CreateTask()
并接受两个参数: nboEnroll
(枚举)和 NULL
调用其成员函数 GetSubjects()
并在返回的对象上调用 Add()
,使用在步骤 3[=32= 中定义的对象作为 Add()
的参数]
从第 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 为我指明了正确的方向。
我正在尝试使用名为 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
部分的原因。
使用调试器检查 test2
和 test3
的值告诉我:
handle=0x00000000 isDisposed=false
GetProcessedImage()
returnsNULL
,这很奇怪,因为test1
returnsfinger
对象的文件名正确。我肯定遗漏了一些东西......现在已经为此苦苦挣扎了几个小时。
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
.
为了保存图像,首先必须:
定义类型为
Client::NBiometricClient
的对象
使用
true
作为参数调用其成员函数SetFingersReturnProcessedImage()
定义一个
NSubject
类型的对象
调用它的成员函数
SetId()
接受一个类型为NStringWrapper
的参数——这个类型有一个 C 风格字符串(以 null 终止的字符数组)的默认构造函数,与问题示例中的finger.SetFileName()
相同调用它的另一个成员函数
GetFingers()
,并在返回的对象上调用Add()
,使用类型为Add()
的对象作为参数21=] 之前定义的(在问题正文中称为finger
)定义一个
NBiometricTask
类型的对象,并通过从步骤 1 中定义的对象调用另一个成员函数来初始化它,该对象是CreateTask()
并接受两个参数:nboEnroll
(枚举)和NULL
调用其成员函数
GetSubjects()
并在返回的对象上调用Add()
,使用在步骤 3[=32= 中定义的对象作为Add()
的参数]从第 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 为我指明了正确的方向。