0

Emgucv を使用してビデオ ファイルからフレームをキャプチャしています。これが私のコードです。

private void Frame(object sender, EventArgs arg)
    {
        try
        {
            timesbetweenframes++;
            Image<Bgr, Byte> frame = FrameExtractor.QueryFrame();
            if (timesbetweenframes == 10 || timesbetweenframes == 0)
            {

                if (frame != null)
                {
                    Bgr min = new Bgr(65, 65, 65);
                    Bgr threshold = new Bgr(128, 128, 128);
                    Image<Bgr, Byte> Frame2 = frame;
                    //Noise Removal 
                    frame._SmoothGaussian(5);

                    VideoBox.Image = Frame2;
                    Bgr drawColor = new Bgr(Color.Blue);
                    using (Image<Gray, byte> gray = frame.Convert<Gray, Byte>())
                    {
                        TextExtract.Recognize(gray);
                        Tesseract.Charactor[] charactors = TextExtract.GetCharactors();
                        foreach (Tesseract.Charactor c in charactors)
                        {
                            Frame2.Draw(c.Region, drawColor, 1);
                        }

                    }
                    cptrdImage.Image = frame;
                    String text = TextExtract.GetText();
                    //removal of noise in this section 
                    Tags.Items.Add(text);
                    WriteData(text, fileName,frame);
                    fileName++;
                }
                else
                {
                    MessageBox.Show("Done!");
                    FrameExtractor = null;
                    InProgress = false;
                    timer1.Elapsed -= Frame;
                }
                timesbetweenframes = 0;
            }

        }

フレーム関数がタイマー イベントに追加されています。これにより、500 ミリ秒ごとにフレーム関数が自動的に起動され、10 フレームごとに抽出されます。問題は、queryframe() 関数を呼び出した後、次のエラーでプログラムがクラッシュすることです。 0x7777f7a99 は 0x00000000 のメモリを参照しました。しばらくすると、メモリを読み取れませんでした。

私はそれを間違った方法で使用していますか、またはこのエラーを発生させずにこれを行う他の方法はありますか?

4

1 に答える 1

0

多分時間(500ミリ秒)が短すぎる??

この関数を Application.Idle イベントにアタッチし、さらに遅延が必要な場合は Thread.Sleep(neededTime - consumerTimeByFrameFunction) を実行します。これにより、タイミングの問題が発生する可能性を排除できます。

于 2013-07-26T15:23:54.213 に答える