1

Webカメラからのオンザフライ画像処理にJavaCVを使用しています。それは素晴らしい働きをします!画像内の関心領域を定義し、表示する前にすべての画像をトリミングすることができますが、それでも問題なく1秒あたり30フレームを実行できます。良い!

ただし、CanvasFrameオブジェクトを使用してライブ画像を表​​示しています。それは素晴らしい(そして簡単な)動作をしますが、アプリケーションに含めるのに完全に使い勝手が良いです。アプリケーションウィンドウの1つの要素として、ライブイメージをパネル(またはキャンバスなど)に配置したいと思います。

問題:CanvasFrameは独自のフレームに存在し、ウィンドウにフォーカスが移るとウィンドウの後ろに表示されなくなります。また、ウィンドウを移動しても移動しません。

通常のUI要素と統合できる要素にライブ画像を取得するにはどうすればよいですか?

繰り返しますが、JavaCVでCanvasFrameを置き換える必要があります。TIA。

4

2 に答える 2

0

どんなUIでも使用できるCanvasFrameの代替品を探していましたが、今はそれを持っています. これが、ライブ (または静止) 画像を表示できるスイング要素です。

import java.awt.Graphics;
import java.awt.image.*;

import javax.swing.JPanel;

public class CamImagePanel extends JPanel {

    private BufferedImage image;

    public CamImagePanel() {
        super();
        // Note that at this point, image = null
        // so be sure to call setImage() before setVisible(true)
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image != null)      // Not efficient, but safer.
            g.drawImage(image, 0, 0, this);
    }

    public void setImage(BufferedImage img) {
        image = img;
        repaint();
    }
}

次に、1 秒あたり 20 ~ 30 回 (30 ~ 50 ミリ秒) ウェイクアップするようにメイン イベント スレッドにタイマーを設定し、アラーム コールバック メソッドで mypanel.setImage(latestPhoto); を呼び出すだけです。まるでライブ映像のようです。

カメラからの画像でバッファをできるだけ速く埋める独自のスレッドを持つコントローラーオブジェクトがあり、コントローラーに最新の画像を要求するだけです。この方法では、同期は必要ありません。実際に、カメラが作成できるよりも速くまたは遅く画像を要求することができ、私のロジックは引き続き正常に機能します。

UI のボタンでタイマーが停止し、最終的な画像をパネルに残したままにするか、setVisible(false) を使用してパネルを完全にダウンさせることができます。

于 2013-01-11T17:51:01.330 に答える
0

UI ボタン​​が押されるまで、ループで取得して CanvasFrame を描画するカメラ スレッドを開始します。これはうまくいきます。

UI ボタン​​の押下に応答して、スレッドを停止します (grabber.stop をトリガーします)。次に、最後の画像を取得し、その画像をパネルに表示します。これは正常に機能します(画像を表示する方法を知っています、ありがとう)。CanvasFrameが別のウィンドウであり、ちょっとひどいことを除けば、私は終わりです。

代わりに、ループで取得し、CanvasFrame に描画しないカメラ スレッドを開始したいと考えています。代わりに、最後のイメージの内部コピーを保持するだけです。次に、UI に表示するために、(正しく起動する) タイマーを設定し、パネルに最新の画像を表示します。これは機能しません。パネルは空白のままです。それでも、このケースは機能するケースとどのように違うのでしょうか? 唯一の違いは、カメラ スレッドのグラバーがまだ停止していないことです。カメラがグラビング ループにない場合は問題ありませんが、ループしている場合は表示されません。また、UI に渡す画像の cvCopy を作成するように注意しているので、メモリの競合の問題はありません。

また、CanvasFrame をループで表示すると、Logitech C920 のオート フォーカスがトリガーされるように見えますが、単一の画像を取得して表示するだけでは (グラバーが停止している限り簡単に実行できます)、オート フォーカスが機能しないようです。 -集中。

結果として、CanvasFrame はバックグラウンドで多くのトリッキーなことを行っているように見えますが、これは、grabber.start、grabber.grab、grabber.stop だけでは対応できず、独自のパネルに表示されます。

サム、CanvasFrame のソース コードであなたの名前を見たことがあるので、私の 2 つのシナリオの違いを誰よりもよく知っているはずです。

于 2013-01-04T16:47:14.747 に答える