Java OpenCV 〜背景除去、輪郭を学習する準備1: SceneBuilder〜

ゲームを作ろとしていて、詰まってしまいました。
画像の扱いが全くできない、というところに至りました。。。

まとめるとOpenCVで画像処理をして、ゲームに使うイメージファイルを作成しようという考えです(笑)。

Java版 OpenCV

今までに、OpenCVは色々と触ってきました、しかし、細かいところが理解できず、放置。。。という残念な状況でしたが。。。

今回は、ゲームを作るという大義名分があるのでとことん進められそうです。

今回の目的

今回OpenCVでやりたいことは「背景除去」です。
こちらのリンク先で、ゲームで使用できる、イメージファイルを配布してくれているのですが、如何せん「せっかくの透過PINGファイルなのに、ImageIO(Javaの部品)でロードすると背景が白になってしまう事件に見舞われ。。。

OpenCVで元々あったファイルを32x32に切り出したものです。

これをゲームで使用すると。。。透過できてた。。。

昨日は背景に白い部分が残っていたのですが。。。
JavaFXのキャッシュ処理かなんかでしょう。。。今後は気をつけよう。。。

しかしOpenCV!

今回は、背景を除去することを目標に進めようと思いますが、参考にする書籍(これの古いものを、結構前に購入しました。OpenCV3→OpenCV)

【送料無料】 詳解 OpenCV 3 コンピュータビジョンライブラリを使った画像処理・認識 / Gary Bradski 【本】

背景除去を行うには

まずは、「輪郭がなんなのか?を理解する」というところから学習していきます。
そのためには、理論と実践を行う必要があるのですが、これを行う準備(アプリケーション作成)を行おうと思っています。

処理を確認するためのアプリ

大まかに以下のようなアプリを作成しようと考えています。

  1. 画面を開く
  2. 起動するプログラムを選択できる
  3. 書くプログラムの実行結果を画面上で確認できる
  4. なんどもプログラムの起動ができる
  5. 当然、プログラムはいくらでも追加可能とする

ちなみに、この仕組みはデザインパターンですでに出来上がっているものなので、簡単に作れます。
以前、下のようなものを作成しました。
Java Discord Listener実装〜コマンドを好きなだけ追加しよう〜

こんな感じで、アプリの作成を行います。

ステップ1:画面の土台

この土台はSceneBuilderというアプリを使用します。GUIで画面の土台を作成できるツール(アプリ)です。

作成した動画がありますのでこちらも参考になれば。。。

今日は作業時間の都合で、ここまでにしますが、とりあえずは、土台になる画面ができたので。。。作るのには10分かからなかったと思う。。。

実際に起動するプログラムを見てみます。

FXMLローダー?

作成したコードはGithubにアップしてあります。

一部抜粋

@Override
public void start(Stage primaryStage) throws Exception {
    // FXMLを読み込む
    FXMLLoader loader = new FXMLLoader(ClassLoader.getSystemResource("TestingCv.fxml"));
    // 画面のルートコンテナ(Pane)を取得(FXMLで作成されたもの)
    BorderPane root = (BorderPane) loader.load();
    // シーン(画面を表示する用のコンテナ)
    Scene scene = new Scene(root, 800, 600);
    // FX用のCSSを読み込む
    scene.getStylesheets().add(getClass().getResource("ap   plication.css").toExternalForm());

    primaryStage.setTitle("Video Processing");
    primaryStage.setScene(scene);
    primaryStage.show();
    // 作成するクラス(これはFXMLで指定する)
    OpenCvController controller = loader.getController();
    primaryStage.setOnCloseRequest((new EventHandler<WindowEvent>() {
        public void handle(WindowEvent we) {
            controller.setClosed();
        }
    }));
}

これは、単純にJavaFXを起動、FXMLを読み込み(ロード)それを表示する。。。というものです。

今後は、このFXMLにコントローラークラスを設定してやる必要があります。上のコードで

// 作成するクラス(これはFXMLで指定する)

と記載している部分がコントローラーを呼び出しているところです。
今回作成したFXMLにはコントローラーを定義していないのでNULLが入ります。なのでエラーになりませんでした。
※多分終了ボタンとか押した時に落ちる。。。

まとめ

今回作成したというか作成してあったプログラムは「OpenCvTest.fxml」を読み込むプログラムだったのですが、それを新規に作成したFXMLを読み込むように修正して起動しました。

FXMLLoader loader = new FXMLLoader(ClassLoader.getSystemResource("TestingCv.fxml"));

しかし、他のところに気を取られて、コントローラーの実装まで行きませんでした(笑)

次回は、この画面にプログラム起動するコントローラーの実装と画面の細かい調整をしようと思います。

でわでわ。。。



投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す