读取错误 C#

Posted

技术标签:

【中文标题】读取错误 C#【英文标题】:Reading error C# 【发布时间】:2012-08-11 19:13:58 【问题描述】:

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

【问题讨论】:

我在代码中的什么地方看不到br1.Read,而且这个错误太笼统了,很难以任何方式帮助你。 那是您发布的代码中的序列号吗? @DavidB 将该评论作为答案,您将获得支持。 【参考方案1】:

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);

【讨论】:

但我也使用相同的参数写入文件 @user1138880 - 请记住接受有用的答案:meta.stackexchange.com/questions/5234/…【参考方案2】:

你有一个空引用 - 转到 br1.Read(t1.templateData, 0, t1.templateData.Length); 并找到哪个没有设置(我打赌 t1.templateData

【讨论】:

@user1138880 如果你的templateDatatemplateData.Length 在创建对象t1 时没有设置,那么它会给你这个错误。这基本上意味着您没有指向任何东西,并且程序无法在任何东西上运行!

以上是关于读取错误 C#的主要内容,如果未能解决你的问题,请参考以下文章

c#读取Config文件的问题

C# 错误:RestClient 从 SoapENV XML 读取值

C#读取Excle文件时报错,怎么处理?

在 C# winforms 中读取 csv 文件时出现数据错误

c# 访问 c++ dll 时尝试读取或写入受保护的内存错误

C# & C++:“试图读取或写入受保护的内存”错误