1
  1. 私は luxand Face SDK を使用して、Visual Studio を使用して顔認識アプリケーションを開発しています。サンプル アプリケーションを変更しようとしています。アプリケーションでは、サンプルはコンピューターのメモリに保持されますが、ファイルに書き込んで後で読み込もうとしています。コードの抜粋を以下に示します。

  2. アプリケーションは正常に実行され、ファイルが保存されます。しかし、ファイルを読み込もうとすると、アプリケーションは動作を停止し、「LiveRecognition_VS2008.exe で「System.NullReferenceException」タイプの未処理の例外が発生しました 追加情報: オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示され、この部分コードの強調表示 " br1.Read(t1.templateData, 0, t1.templateData.Length) "

  3. エラーの内容を教えてください。私はファイルを間違って読んでいますか?

        struct FaceTemplate { // 単一のテンプレート
                パブリック バイト [] templateData;
            }
            faceTemplate を一覧表示します。// 顔テンプレートのセット (10 個保存)

            文字列 cameraName;
            bool needClose = false;
            文字列ユーザー名;

            // FSDKCam.GrabFrame によって返された HBITMAP ハンドルを解放するための WinAPI プロシージャ
            [DllImport("gdi32.dll")]
            static extern bool DeleteObject(IntPtr hObject);

            パブリック Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(オブジェクト送信者, EventArgs e)
            {

                if (FSDK.FSDKE_OK != FSDK.ActivateLibrary("# snip serial key #"))
                {
                    MessageBox.Show("ライセンス キー ウィザードを実行してください (スタート - Luxand - FaceSDK - ライセンス キー ウィザード)", "FaceSDK のアクティベーション中にエラーが発生しました", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Application.Exit();
                }

                FSDK.InitializeLibrary();
                FSDKCam.InitializeCapturing();

                文字列 [] cameraList;
                int カウント;
                FSDKCam.GetCameraList(out cameraList, out count);

                if (0 == カウント) {
                    MessageBox.Show("カメラを取り付けてください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Application.Exit();
                }

                FSDKCam.VideoFormatInfo [] formatList;
                FSDKCam.GetVideoFormatList(ref cameraList[0], out formatList, out count);
                pictureBox1.Width = formatList[0].Width;
                pictureBox1.Height = formatList[0].Height;
                this.Width = formatList[0].Width + 48;
                this.Height = formatList[0].Height + 116;

                cameraName = cameraList[0];
            }

            private void Form1_FormClosing(オブジェクト送信者, FormClosingEventArgs e)
            {
                ニードクローズ=真;
            }

            private void button1_Click(オブジェクト送信者, EventArgs e)
            {
                this.button1.Enabled = false;
                int cameraHandle = 0;

                int r = FSDKCam.OpenVideoCamera(ref cameraName, ref cameraHandle);
                もし (r != FSDK.FSDKE_OK)
                {
                    MessageBox.Show("最初のカメラを開く際のエラー", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    Application.Exit();
                }
                btnRemember.Enabled = true;

                // リアルタイムの顔検出パラメータを設定
                FSDK.SetFaceDetectionParameters(偽、偽、100);
                FSDK.SetFaceDetectionThreshold(3);

                // 顔テンプレートを保存する場所をリストします
                faceTemplates = 新しいリスト();

                while (!needClose)
                {
                    Int32 imageHandle = 0;
                    if (FSDK.FSDKE_OK != FSDKCam.GrabFrame(cameraHandle, ref imageHandle)) // カメラから現在のフレームを取得します
                    {
                        Application.DoEvents();
                        継続する;
                    }

                    FSDK.CImage イメージ = 新しい FSDK.CImage(imageHandle);

                    画像 frameImage = image.ToCLRImage();
                    Graphics gr = Graphics.FromImage(frameImage);

                    FSDK.TFacePosition facePosition = image.DetectFace();
                    // 顔が検出された場合、認識できます
                    if (facePosition.w != 0)
                    {
                        gr.DrawRectangle(Pens.LightGreen, facePosition.xc - facePosition.w / 2, facePosition.yc - facePosition.w / 2,
                            facePosition.w、facePosition.w);

                        // 新しい顔テンプレートを作成します
                        FaceTemplate テンプレート = new FaceTemplate();

                        if (programState == ProgramState.psRemember || programState == ProgramState.psRecognize)
                            template.templateData = image.GetFaceTemplateInRegion(ref facePosition);


                        スイッチ (programState)
                        {
                            case ProgramState.psNormal: // 通常の状態 - 何もしない
                                壊す;

                            case ProgramState.psRemember: // Remember Me 状態 - フェイシャル テンプレートを保存します
                                faceTemplates.Add(テンプレート);
                                label1.Text = "保存されたテンプレート: " + faceTemplates.Count.ToString();

                                if (faceTemplates.Count > 0)
                                {
                                    // ユーザー名を取得
                                    InputName inputName = new InputName();
                                    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: // ユーザーを認識する
                                ブール一致 = false;

                               /*

                                foreach (faceTemplates の FaceTemplate t)
                                {
                                    フロートの類似性 = 0.0f;
                                    FaceTemplate t1 = t;
                                    FSDK.MatchFaces(ref template.templateData, ref t1.templateData, ref 類似性);
                                    フロートしきい値 = 0.0f;
                                    FSDK.GetMatchingThresholdAtFAR(0.01f、参照しきい値); // FAR を 1% に設定
                                    もし (類似度 > 閾値)
                                    {
                                        一致 = 真;
                                        壊す;
                                    }
                                }

                                */

                                FaceTemplate t1 = 新しい FaceTemplate();
                                FileStream fs1 = File.Open(userName + ".bin", FileMode.Open,FileAccess.Read);
                                BinaryReader br1 = new BinaryReader(fs1);

                                br1.Read(t1.templateData, 0, t1.templateData.Length);
                                フロートの類似性 = 0.0f;
                                FSDK.MatchFaces(ref template.templateData, ref t1.templateData, ref 類似性);
                                フロートしきい値 = 0.0f;
                                FSDK.GetMatchingThresholdAtFAR(0.01f、参照しきい値); // FAR を 1% に設定
                                もし (類似度 > 閾値)
                                {
                                    一致 = 真;
                                }


                                場合 (一致)
                                {
                                    StringFormat フォーマット = 新しい StringFormat();
                                    format.Alignment = StringAlignment.Center;

                                    gr.DrawString(userName, new System.Drawing.Font("Arial", 16),
                                        new System.Drawing.SolidBrush(System.Drawing.Color.LightGreen),
                                        facePosition.xc、facePosition.yc + facePosition.w * 0.55f、フォーマット);
                                }
                                壊す;
                        }
                    }

                    // 現在のフレームを表示
                    pictureBox1.Image = frameImage;

                    GC.Collect(); // 削除後のガベージを回収

                    // UI コントロールをアクセス可能にする
                    Application.DoEvents();
                }

                FSDKCam.CloseVideoCamera(カメラハンドル);
                FSDKCam.FinalizeCapturing();            
            }

            private void btnRemember_Click(オブジェクト送信者, EventArgs e)
            {
                faceTemplates.Clear();
                programState = ProgramState.psRemember;
                label1.Text = "カメラを見てください";
            }
        }
    }

4

2 に答える 2

2

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);
}
于 2012-08-15T13:46:03.140 に答える
1

あなたはnull参照を持っています - に行き、br1.Read(t1.templateData, 0, t1.templateData.Length);設定されていないものを見つけてください(私は賭けていますt1.templateData

于 2012-08-15T13:48:58.597 に答える