2016-10-25 8 views
0

私はJava opencvライブラリを使ってビデオを処理し、その結果をSwing GUIに表示しようとしていました。私は、各フレームを処理するためのスレッドを作成した(ビデオ読み出し、フィルタ、キャニー輪郭等)とスイング呼び出しに結果を更新「SwingUtilities.invokeAndWait」スイングでopencvを使ってビデオを表示する

VideoCapture vc = new VideoCapture(); 
vc.open(...); 
while(...){ 
vc.read(img); 
// image processing on img; 
// processed 'BufferedImage' image was saved in 'imgToPublish.img' 
try{ 
    SwingUtilities.invokeAndWait(new Runnable() { 
     public void run() {    
      long t1 = Core.getTickCount(); 
      //displayWindow is a JLabel 
      displayWindow.setIcon(new ImageIcon(imgToPublish.img)); 
      displayWindow.revalidate(); 
      displayWindow.repaint(); 
      pack(); 
      try{ 
       Thread.sleep(1); 
      }catch (Exception exc){ 
       System.out.println(exc); 
      } 
      frameCount++; 
      System.out.format("No %d display time %.2f on EDT %n",frameCount, ((double)(Core.getTickCount() - t1))/((double)tickCountFrequency)*1000.0); 
     } 
    }); 
} 
catch(Exception e){ 
    e.printStackTrace(); 
} 
} 

速度が驚くほど速く、それだけモニタがその速さに応答できないため、表示には約2msかかるが、意味をなさない。私はここで何が欠けていますか?処理された画像が実際にスイングUIに表示されるまで待つことを望みます。

答えて

0

私はこれに2つのスレッドを使用していますか? その場合、操作を同期させる必要があります。さもなければ、表示スレッドは、部分的に完了した画像を表示することができる。 同じことをしても、処理が完了したらキャプチャスレッドにイメージを表示させる方が賢明だと思います。 スレッドを互いに強制的に待機させることは、本質的にマルチスレッドの利点を打ち消します(そして、頭痛の原因となります)。

+0

はい、画像処理用のスレッドを追加します。これまでのところ、不完全な画像は見ていません。私はJavaスイングのために、私は画像を表示するためにリース2つのスレッドで使用する必要があります。それは、UI関連の操作のためにEDT上でスレッドセーフであるためです。 –

関連する問題