1
  1. 我正在使用 luxand Face SDK 使用 Visual Studio 开发人脸识别应用程序。我正在尝试修改示例应用程序。在应用程序中,样本保存在计算机内存中,但我试图将其写入文件,然后再从中读取。代码摘录如下。

  2. 该应用程序运行良好并保存文件。但是,当它尝试读取文件时,应用程序停止工作并且我收到错误“ LiveRecognition_VS2008.exe 中发生'System.NullReferenceException'类型的未处理异常附加信息:对象引用未设置为对象的实例”和这部分代码的突出显示“ br1.Read(t1.templateData, 0, t1.templateData.Length)

  3. 请指导我是什么错误。我读错文件了?

        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 = "看相机";
            }
        }
    }

4

2 回答 2

2

t1.templateDatanull。写入时,应先将长度存储到文件中。然后在读取时,读取大小,创建数组,然后读取其内容。

尝试这样的事情:

using ( BinaryWriter bw = new BinaryWriter(fs))
{
    bw.Write(template.templateData.Length);
    bw.Write(template.templateData, 0, template.templateData.Length);
}



using( BinaryReader br1 = new BinaryReader(fs1))
{
    int length = br1.ReadInt32();
    t1.templateData = new byte[length];
    br1.Read(t1.templateData, 0, t1.templateData.Length);
}
于 2012-08-15T13:46:03.140 回答
1

你有一个空参考——去br1.Read(t1.templateData, 0, t1.templateData.Length);看看哪个没有设置(我打赌t1.templateData

于 2012-08-15T13:48:58.597 回答