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