我正在使用 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 = "看相机"; } } }