我正在使用 luxand Face SDK 使用 Visual Studio 开发人脸识别应用程序。我正在尝试修改示例应用程序。在应用程序中,样本保存在计算机内存中,但我试图将其写入文件,然后再从中读取。代码摘录如下。
该应用程序运行良好并保存文件。但是,当它尝试读取文件时,应用程序停止工作并且我收到错误“ LiveRecognition_VS2008.exe 中发生'System.NullReferenceException'类型的未处理异常附加信息:对象引用未设置为对象的实例”和这部分代码的突出显示“ br1.Read(t1.templateData, 0, t1.templateData.Length) ”
请指导我是什么错误。我读错文件了?
struct FaceTemplate { // 单个模板
公共字节[]模板数据;
}
列出 faceTemplates;// 一组人脸模板(我们存储 10 个)
字符串相机名称;
布尔需要关闭=假;
字符串用户名;
// 释放 FSDKCam.GrabFrame 返回的 HBITMAP 句柄的 WinAPI 过程
[DllImport("gdi32.dll")]
静态外部布尔删除对象(IntPtr hObject);
公共表格1()
{
初始化组件();
}
私人无效Form1_Load(对象发送者,EventArgs e)
{
if (FSDK.FSDKE_OK != FSDK.ActivateLibrary("# snip serial key #"))
{
MessageBox.Show("请运行许可证密钥向导(开始-Luxand-FaceSDK-许可证密钥向导)", "激活FaceSDK时出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
应用程序.Exit();
}
FSDK.InitializeLibrary();
FSDKCam.InitializeCapturing();
字符串 [] 摄像机列表;
整数计数;
FSDKCam.GetCameraList(out cameraList, out count);
如果(0 ==计数){
MessageBox.Show("请附加相机", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
应用程序.Exit();
}
FSDKCam.VideoFormatInfo [] 格式列表;
FSDKCam.GetVideoFormatList(ref cameraList[0], out formatList, out count);
图片框1.Width = formatList[0].Width;
图片框1.高度=格式列表[0].高度;
this.Width = formatList[0].Width + 48;
this.Height = formatList[0].Height + 116;
相机名称 = 相机列表 [0];
}
私人无效Form1_FormClosing(对象发送者,FormClosingEventArgs e)
{
需要关闭=真;
}
私人无效按钮1_Click(对象发送者,EventArgs e)
{
this.button1.Enabled = false;
int 相机手柄 = 0;
int r = FSDKCam.OpenVideoCamera(ref cameraName, ref cameraHandle);
如果 (r != FSDK.FSDKE_OK)
{
MessageBox.Show("打开第一台相机时出错", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
应用程序.Exit();
}
btnRemember.Enabled = true;
// 设置实时人脸检测参数
FSDK.SetFaceDetectionParameters(false, false, 100);
FSDK.SetFaceDetectionThreshold(3);
// 列出我们存储人脸模板的位置
faceTemplates = 新列表();
而(!需要关闭)
{
Int32 图像句柄 = 0;
if (FSDK.FSDKE_OK != FSDKCam.GrabFrame(cameraHandle, ref imageHandle)) // 从相机中抓取当前帧
{
应用程序.DoEvents();
继续;
}
FSDK.CImage 图像 = 新 FSDK.CImage(imageHandle);
图像 frameImage = image.ToCLRImage();
图形 gr = Graphics.FromImage(frameImage);
FSDK.TFacePosition facePosition = image.DetectFace();
// 如果检测到人脸,我们可以识别它
如果 (facePosition.w != 0)
{
gr.DrawRectangle(Pens.LightGreen, facePosition.xc - facePosition.w / 2, facePosition.yc - facePosition.w / 2,
脸位置.w, 脸位置.w);
// 创建一个新的人脸模板
FaceTemplate 模板 = 新的 FaceTemplate();
if (programState == ProgramState.psRemember || programState == ProgramState.psRecognize)
template.templateData = image.GetFaceTemplateInRegion(ref facePosition);
开关(程序状态)
{
case ProgramState.psNormal: // 正常状态 - 什么都不做
休息;
case ProgramState.psRemember: // 记住我状态 - 存储面部模板
faceTemplates.Add(模板);
label1.Text = "存储的模板:" + faceTemplates.Count.ToString();
if (faceTemplates.Count > 0)
{
// 获取用户名
输入名称 inputName = new InputName();
输入名称.ShowDialog();
用户名 = 输入名.用户名;
FileStream fs = File.Open(userName + ".bin", FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs); //打开一个二进制写入器(写入文件流)
bw.Write(template.templateData, 0, template.templateData.Length);
bw.Close();
fs.Close();
programState = ProgramState.psRecognize;
}
休息;
case ProgramState.psRecognize: // 识别用户
布尔匹配=假;
/*
foreach(faceTemplates 中的 FaceTemplate t)
{
浮动相似度 = 0.0f;
人脸模板 t1 = t;
FSDK.MatchFaces(ref template.templateData, ref t1.templateData, refsimilarity);
浮动阈值 = 0.0f;
FSDK.GetMatchingThresholdAtFAR(0.01f, 参考阈值); // 将 FAR 设置为 1%
如果(相似度 > 阈值)
{
匹配=真;
休息;
}
}
*/
FaceTemplate t1 = 新的 FaceTemplate();
FileStream fs1 = File.Open(userName + ".bin", FileMode.Open,FileAccess.Read);
BinaryReader br1 = 新的 BinaryReader(fs1);
br1.Read(t1.templateData, 0, t1.templateData.Length);
浮动相似度 = 0.0f;
FSDK.MatchFaces(ref template.templateData, ref t1.templateData, refsimilarity);
浮动阈值 = 0.0f;
FSDK.GetMatchingThresholdAtFAR(0.01f, 参考阈值); // 将 FAR 设置为 1%
如果(相似度 > 阈值)
{
匹配=真;
}
如果(匹配)
{
StringFormat 格式 = new StringFormat();
format.Alignment = StringAlignment.Center;
gr.DrawString(userName, new System.Drawing.Font("Arial", 16),
新 System.Drawing.SolidBrush(System.Drawing.Color.LightGreen),
facePosition.xc,facePosition.yc + facePosition.w * 0.55f,格式);
}
休息;
}
}
// 显示当前帧
图片框1.Image = frameImage;
GC.Collect(); // 删除后收集垃圾
// 使 UI 控件可访问
应用程序.DoEvents();
}
FSDKCam.CloseVideoCamera(cameraHandle);
FSDKCam.FinalizeCapturing();
}
私人无效btnRemember_Click(对象发送者,EventArgs e)
{
faceTemplates.Clear();
programState = ProgramState.psRemember;
label1.Text = "看相机";
}
}
}