2016-11-21 14 views
0

OCRを使用してC#WPF自動番号プレートの認識を開発しています。ビデオストリームの処理中にCPUオーバーヘッドを減らす

フローはです。私はビデオストリームMJPEGから画像を取得しています。この画像は、プレート番号やその他の詳細を取得するためにOCRに渡す必要があります。

問題はです:ビデオストリームは約30フレーム/秒を生成しており、CPUはこの処理をほとんど処理できません。また、1フレームを処理するのに約1秒かかります。また、待ち行列上でCPUは​​70%使用されます(Intel I7 4th G)。

誰もが解決策とより良い実装を提案できますか?

まず、フレームを処理する価値であるかどうかを把握:あなたは何をすべき

//This is the queue where it will hold the frames 
     // produced from the video streaming(video_Newfram1) 

     private readonly Queue<byte[]> _anpr1Produces = new Queue<byte[]>(); 


     //I am using AForg.Video to read the MJPEG Streaming 
     //this event will be triggered for every frame 
     private void video_NewFrame1(object sender, NewFrameEventArgs eventArgs) 
     { 

      var frameDataAnpr = new Bitmap(eventArgs.Frame); 
      AnprCam1.Source = GetBitmapimage(frameDataAnpr); 

      //add current fram to the queue 
      _anpr1Produces.Enqueue(imgByteAnpr); 

      //this worker is the consumer that will 
      //take the frames from the queue to the OCR processing 
      if (!_workerAnpr1.IsBusy) 
      { 
       _workerAnpr1.RunWorkerAsync(imgByteAnpr); 
      } 
     } 

     //This is the consumer, it will take the frames from the queue to the OCR 

     private void WorkerAnpr1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      while (true) 
      { 
       if (_anpr1Produces.Count <= 0) continue; 
       BgWorker1(_anpr1Produces.Dequeue()); 
      } 
     } 

     //This method will process the frames that sent from the consumer 
     private void BgWorker1(byte[] imageByteAnpr) 
     { 
      var anpr = new cmAnpr("default"); 
      var objgxImage = new gxImage("default"); 

      if (imageByteAnpr != null) 
      { 
       objgxImage.LoadFromMem(imageByteAnpr, 1); 
       if (anpr.FindFirst(objgxImage) && anpr.GetConfidence() >= Configs.ConfidanceLevel) 
       { 
        var vehicleNumber = anpr.GetText(); 
        var vehicleType = anpr.GetType().ToString(); 
        if (vehicleType == "0") return; 

        var imagename = string.Format("{0:yyyy_MMM_dd_HHmmssfff}", currentDateTime) + "-1-" + 
            vehicleNumber + ".png"; 

        //this task will run async to do the rest of the process which is saving the vehicle image, getting vehicle color, storing to the database ... etc 
        var tsk = ProcessVehicle("1", vehicleType, vehicleNumber, imageByteAnpr, imagename, currentDateTime, anpr, _anpr1Produces); 

       } 
       else 
       { 
        GC.Collect(); 
       } 
      } 
     } 

答えて

0

はこれです。圧縮ビデオストリームを使用している場合は、通常、フレームの圧縮されたサイズを素早く読み取ることができます。現在のフレームと前のフレームの差分を格納します。

小さくても、あまり変わらない(車が走っていない)。

これは、フレームをデコードする必要がなく、動きの検出を行うための技術的な方法ではありません。非常に速くなければなりません。

こうすれば、フレームの80%を数ミリ秒でスキップすることができます。

処理を必要とするフレームは、しばらくして取得します。遅い処理をしている間は録画を続けられるように、十分なフレームをバッファリングできることを確認してください。

次は、関心のある領域を見つけて、それらの領域に焦点を当てます。色が変わった部分を見るだけで、または長方形の形を見つけることができます。

最後に、30fpsを処理する必要がある場合は、1秒の処理が遅くなります。あなたは物事をより速くする必要があるか、巨大な緩衝地帯を建設しなければならず、道が忙しいと追いつくことを願っています。

複数のコアが使用可能であることを確認してください。ただし、最終的には、画像のどの部分が適切でないかを知ることは、ここでのパフォーマンスを向上させる鍵です。

関連する問題