读取错误 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.templateData
是 null
。写入时,应先将长度存储到文件中。然后在读取时,读取大小,创建数组,然后读取其内容。
试试这样的:
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 如果你的templateData
或templateData.Length
在创建对象t1
时没有设置,那么它会给你这个错误。这基本上意味着您没有指向任何东西,并且程序无法在任何东西上运行!以上是关于读取错误 C#的主要内容,如果未能解决你的问题,请参考以下文章
c#读取Config文件的问题
C# 错误:RestClient 从 SoapENV XML 读取值
C#读取Excle文件时报错,怎么处理?
在 C# winforms 中读取 csv 文件时出现数据错误
c# 访问 c++ dll 时尝试读取或写入受保护的内存错误
C# & C++:“试图读取或写入受保护的内存”错误