ゲームを作ろとしていて、詰まってしまいました。
画像の扱いが全くできない、というところに至りました。。。
まとめるとOpenCVで画像処理をして、ゲームに使うイメージファイルを作成しようという考えです(笑)。
Java版 OpenCV
今までに、OpenCVは色々と触ってきました、しかし、細かいところが理解できず、放置。。。という残念な状況でしたが。。。
今回は、ゲームを作るという大義名分があるのでとことん進められそうです。
今回の目的
今回OpenCVでやりたいことは「背景除去」です。
こちらのリンク先で、ゲームで使用できる、イメージファイルを配布してくれているのですが、如何せん「せっかくの透過PINGファイルなのに、ImageIO(Javaの部品)でロードすると背景が白になってしまう事件に見舞われ。。。
OpenCVで元々あったファイルを32x32に切り出したものです。
これをゲームで使用すると。。。透過できてた。。。
昨日は背景に白い部分が残っていたのですが。。。
JavaFXのキャッシュ処理かなんかでしょう。。。今後は気をつけよう。。。
しかしOpenCV!
今回は、背景を除去することを目標に進めようと思いますが、参考にする書籍(これの古いものを、結構前に購入しました。OpenCV3→OpenCV)
【送料無料】 詳解 OpenCV 3 コンピュータビジョンライブラリを使った画像処理・認識 / Gary Bradski 【本】
背景除去を行うには
まずは、「輪郭がなんなのか?を理解する」というところから学習していきます。
そのためには、理論と実践を行う必要があるのですが、これを行う準備(アプリケーション作成)を行おうと思っています。
処理を確認するためのアプリ
大まかに以下のようなアプリを作成しようと考えています。
- 画面を開く
- 起動するプログラムを選択できる
- 書くプログラムの実行結果を画面上で確認できる
- なんどもプログラムの起動ができる
- 当然、プログラムはいくらでも追加可能とする
ちなみに、この仕組みはデザインパターンですでに出来上がっているものなので、簡単に作れます。
以前、下のようなものを作成しました。
<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"));
しかし、他のところに気を取られて、コントローラーの実装まで行きませんでした(笑)
次回は、この画面にプログラム起動するコントローラーの実装と画面の細かい調整をしようと思います。
でわでわ。。。