OpenCV tutorial 〜フーリエ変換など〜

イントロダクション

以下の記事にて、OpenCVチュートリアルをやってきたのと、この先のチュートリアルを眺めてみたところ、ネックになっている「数式の理解」部分は難しいと判断しました。なので。。。

Java OpenCv Lv1 〜入門: 写真の表示〜
Java OpenCV Lv2 〜JavaFXでの画像表示〜
Java OpenCV Lv2 〜画像を表示する〜
Java OpenCV Lv3 〜画像の平滑化(smooth())〜
Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
Java OpenCV Lv3 〜画像に中央値フィルタ(medianBlur())〜
Java OpenCV Lv4 〜画像の中身をみてみる〜
Java OpenCV Lv5 〜Matクラスで描画処理〜
Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
Java OpenCV Lv8 〜ROIについて〜
Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
Java OpenCV Lv9 〜画像の掛け算〜
Java OpenCV Lv10 〜行列演算Mat#submat()〜
Java OpenCv Lv10〜画像の平均輝度をだす〜
Java OpenCv ビデオキャプチャ〜カメラからの入力を表示〜
OpenCV tutorial〜ヒストグラム〜
OpenCV tutorial 解析 〜ヒストグラム〜

現在(2020-11-11)ではAndroidアプリでOpenCVを動かす方向で実装しています。
Android OpenCV 〜サンプルアプリを動かす〜

アプローチ方法をちょっと変えます。

今までは、チュートリアルにあるコードを実行してみるという手法で学習を進めていましたが。。。
とりあえず、写経(コピペしました(笑))してチュートリアルを起動する。

そして、そのアプリをカスタムして行く方向に切り替えます。

その御誂え向きなチュートリアルがこちらです。

「フーリエ変換」をやるチュートリアルになっていますが、こいつをカスタムして読み込んだイメージファイルをいろんな風に変換できるように修正しようと考えています。

とりあえずはアプリを起動してみました。※PNGではないイメージファイル

PNGファイルを選択した場合の動画

とりあえずは、準備ができた状態です。ここからどのようにカスタムして行くか?これが課題になりそうです。

結局はわからなかった

画像ファイル編集とか、部分的に学習を進めてきましたが、そうではなく、チュートリアルにある内容を1つずつ理解していく必要がありました。
なんか学生位の頃に「わからないときは戻って学習し直す」というところが懐かしく感じます。

ポイントは。。。

実行したメソッドの意味がわかれば、何をやっているのか理論的にも理解できそうです。

例えば、輪郭の取得に関して輪郭を描画するための頂点座標のリストを取得しますが、このリストが示す座標(値)の意味がわかればOpenCVの理解が深まりそうです。

自分は少し分かってきたような感じがしています。
Androidタブレットを使用してOpenCVで取得した輪郭内を赤く塗りつぶしてみました。



OpenCV tutorial 解析2 〜ヒストグラム計算〜

イントロダクション

前回は、チュートリアルにあるコード(Git)を起動して、そのプログラムの内容について解析しました。

実際にはチュートリアルの「Calculate a Histogramのところにたどり着いた状態です。

ヒストグラムとは

ヒストグラムは、事前に定義されたビンのセットにまとめられたデータの収集数です。私たちの場合、データはピクセルの強度を表しているので、(0、256)のような範囲になります

チュートリアルには記載があるのですが、理解したのは色のデータ(0-256)を持っていることくらいです。

やっぱりコードから。。。

いつも通りコードから理解していきます。「なんやらわからんが、ヒストグラムを表示している(下のように)

この赤、緑、青のグラフ?が表示されているのはどうやらRGBの度合いが表示されているくさい(チュートリアルの文言から推測)

じゃ、コードで見て見ましょう。

ヒストグラムの表示領域

ImageView fx:id="histogram"

VideoControllerにある、ImageViewクラスの変数名が「histogram」を探す。。。

/** FXML ヒストグラム -> fx:id="histogram" */
@FXML
private ImageView histogram;

ありました、そしてこいつは、「showHistogram()」で処理しているようなのでこのメソッドを追いかけます。

// set the number of bins at 256
MatOfInt histSize = new MatOfInt(256);
// only one channel
MatOfInt channels = new MatOfInt(0);
// set the ranges
MatOfFloat histRange = new MatOfFloat(0, 256);

この部分で3つに分けているようです。

Imgproc.calcHist(images.subList(0, 1), channels, new Mat(), hist_b, histSize, histRange, false);

Core.calcHist()メソッドで細かい計算をしてくれるようです。

	// effectively draw the histogram(s)
	for (int i = 1; i < histSize.get(0, 0)[0]; i++)
	{
		// B component or gray image
		Imgproc.line(histImage, new Point(bin_w * (i - 1), hist_h - Math.round(hist_b.get(i - 1, 0)[0])),
				new Point(bin_w * (i), hist_h - Math.round(hist_b.get(i, 0)[0])), new Scalar(255, 0, 0), 2, 8, 0);
		// G and R components (if the image is not in gray scale)
		if (!gray)
		{
			Imgproc.line(histImage, new Point(bin_w * (i - 1), hist_h - Math.round(hist_g.get(i - 1, 0)[0])),
					new Point(bin_w * (i), hist_h - Math.round(hist_g.get(i, 0)[0])), new Scalar(0, 255, 0), 2, 8,
					0);
			Imgproc.line(histImage, new Point(bin_w * (i - 1), hist_h - Math.round(hist_r.get(i - 1, 0)[0])),
					new Point(bin_w * (i), hist_h - Math.round(hist_r.get(i, 0)[0])), new Scalar(0, 0, 255), 2, 8,
					0);
		}
	}
	
	// display the histogram...
	Image histImg = Utils.mat2Image(histImage);
	updateImageView(histogram, histImg);
	
}

こんな風にプログラムを起動しているようです。

わかったこと

  1. ROI(Rectクラス)でイメージの中に領域を作る
  2. Coreクラスの「calcHist()」「normalize()」「addWeighted()」などで色データの扱いができる

感想

単純にカメラからのデータをいじったり、成分解析したりできるのは魅力的だ!

ここで作成したアプリをラズパイなどに乗っけても面白そうだ。

続きは次回

でわでわ。。。









OpenCV tutorial 解析 〜ヒストグラム〜

イントロダクション

前回は、チュートリアルを読んでもよくわかならなかったので。。。

必殺の解析パターンをやろうという事になりました。(自分の中で)

  1. 写経する
  2. 動かす
  3. 中身を理解する

蒸気が解析パターンです。よくわからないものを触ったりして調べるのに似ていますね(笑)。そして、前回は上記工程の1と2を行いましたので、まぁ動いたかな?という感じです。ちょっと中途半端な表現ですがこれにはわけがあります。

https://www.youtube.com/watch?v=rNjiWQpfqQM

上の動画が作成したものを動かしたときのものですが「Show logo」のチェックボックスをONにするとエラリます。

この部分の解決も含めてチュートリアルの記載とコードを解析して理解をしようというわけです。

参照するチュートリアルはこちらです。

解析開始

まずは、Mainメソッドからいきますので、「Tutorial2.java」からみていきます。

/**
 * Copyright (c) 2012-present Lightweight Java Game Library All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
 * Neither the name Lightweight Java Game Library nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
 */
package zenryokuservice.opencv.fx.tutorial;

import org.opencv.core.Core;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

/**
 * OpenCVのチュートリアルを写経します。
 * @author takunoji
 * 2019/02/02
 */
public class Tutorial2 extends Application {
    /** ネイティブライブラリを読み込む */
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    /**
     * メインメソッド。
     * @param args
     */
    public static void main(String[] args) {
        // 親クラス(Superクラス)のメソッド起動
        launch();
    }

    /* (non-Javadoc)
     * @see javafx.application.Application#start(javafx.stage.Stage)
     */
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("Video.fxml"));
        BorderPane root = (BorderPane) loader.load();
        Scene scene = new Scene(root, 800, 600);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());

        primaryStage.setTitle("Video Processing");
        primaryStage.setScene(scene);
        primaryStage.show();
        // 作成するクラス
        VideoController controller = loader.getController();
        primaryStage.setOnCloseRequest((new EventHandler() {
            public void handle(WindowEvent we) {
                controller.setClosed();
            }
        }));
    }
}

今までにJavaFXを作成したりしていたので、細かいところは省きます。

「start()」メソッドが走りFXMLLoaderにより、FXMLが読み込まれます。

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.text.*?>
<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="zenryokuservice.opencv.fx.tutorial.VideoController">
<center>
   <ImageView fx:id="currentFrame" />
   </center>
   <right>
      <VBox alignment="CENTER_LEFT" spacing="10">
         <padding>
            <Insets left="10" right="20"/>
         </padding>
         <ImageView fx:id="histogram" />
         <Text text="Controls" />
         <CheckBox fx:id="grayscale" text="Show in gray scale" />
         <CheckBox fx:id="logoCheckBox" text="Show logo" onAction="#loadLogo" />
      </VBox
   </right>
   <bottom>
      <HBox alignment="CENTER" >
         <padding>
            <Insets top="25" right="25" bottom="25" left="25"/>
         </padding>
         <Button fx:id="button" alignment="center" text="Start camera" onAction="#startCamera" />
      </HBox>
   </bottom>
</BorderPane>

「fx:controller」に指定されている「VideoController」クラスにあるフィールド変数がこのタグの中に記載されている「fx:id」に対応しています。

名前を間違うとエラーが出ます。

ついでに、SceneBuilderで「FXML」を開いてみます。

https://www.youtube.com/watch?v=g0u0YXKJfDg&feature=youtu.be

表示されたのはチュートリアルにあるものと同じです、でも実際にアプリを起動したときには下のような感じです。

どうやら問題ないようですが、ちょっと納得がいきません。なのでコードを見ますと。。。

// フレームサイズ指定
this.currentFrame.setFitWidth(600);

これでFXMLにある「fx:id="currentFrame"」の部分(赤くなっています)に幅を600に設定しているようです。つまりSceneBuilderに表示されたときはサイズが0になっていたので下のような表示になっていた、という予測ができます。まぁ検証はしないのでここで終わりにします。時間があればFXMLにある「currentFrma」に横幅を与えて表示させてみると結果が見れると思います。

ちなみに「Show logo」のチェックボックスをクリックするとエラーが出る原因はファイルの指定が間違っていたからでした。チュートリアルは「resources」フォルダの直下にイメージファイルを置いていましたが、自分のところは違う場所に置いていたので。。。

チュートリアルを読み進める

実行してみると記載内容が驚くほど簡単にわかります。(実行した後だから当然といえば当然か(笑))

まとめると、JavaFXで画面を表示するのにFXMLとControllerクラスの関連付けを行なった後に。。。

ロゴを表示する

チェックされると、カメラストリーム上に画像の表示をトリガーします

この文言は翻訳したものです、「チェックされると」とあるのでその部分のコードを見ます。

fx:id="logoCheckBox" text="Show logo" onAction="#loadLogo"

とFXMLに記載があるので「VideoController#loadLogo」メソッドを見ます。※VideoControllerクラスのloadLogoメソッド

シンプルにロゴのイメージファイルを読んでフィールドに設定する処理でした。

this.logo = Imgcodecs.imread("resources/images/Poli.png");

これだけでなんで下にロゴが表示されるのでしょうか?

「startCamera」ボタンが謳歌された後に、キャプチャクラスの設定をしてRunnableインターフェースを実装しています(匿名クラス)というやつです。)

// フレームを30ミリ秒ごとに掴む (30 frames/sec)
Runnable frameGrabber = new Runnable() {
    @Override
    public void run() {
        Mat frame = grabFrame();
        Image imageToShow = Utils.mat2Image(frame);
        updateImageView(currentFrame, imageToShow);
    }
};

こいつをTimerクラスでスケジュールしてやるとそのように動いてくれるようです。※Timerクラスの中身はわからないけどそのように動いているので。。。

この実装はいろんなところで使えそうです。自分で無限ループの処理を書かなくてもこのクラスに登録(2行目の処理)をしてやれば、そのように動いてくれるようです。

this.timer = Executors.newSingleThreadScheduledExecutor();
this.timer.scheduleAtFixedRate(frameGrabber, 0, 33, TimeUnit.MILLISECONDS);

OpenCVの操作に入る

ストリームの特定の領域にロゴを表示するために、コードにいくつかのバリアントを追加します。つまり、フレームキャプチャごとに、画像を1つまたは3つのチャンネルに変換する前に、ロゴを配置するROI(関心領域)を設定する必要があります。通常、画像のROIはその一部です。ROIをRectオブジェクトとして定義できます。Rectは、次のパラメータで記述された2D矩形のテンプレートクラスです。

loadLogoメソッドの処理での説明文です。画面上では確かに右下部分にロゴが表示されています。

https://www.youtube.com/watch?v=eeWOXJPD-SQ&feature=youtu.be

[rakuten ids="rakutenkobo-ebooks:15232098"]

そして、this.logo(フィールド変数)はVideoController#grabFrame()メソッドで使用されていて、なにやら処理を行っていました。ちなみに「grabFrame()」は上記の「Runnable」インターフェースを実装した匿名クラスで呼ばれていて、カメラが起動したら無限ループがスタートします(33(30)ミリ秒ごと)。

下の処理部分でROI(イメージファイルの表示領域)を指定しているのですが、

Rect roi = new Rect(frame.cols() - logo.cols()
     , frame.rows() - logo.rows(), logo.cols(),logo.rows());

「frame」 のcolsとrowsはキャプチャを読み込んでそのサイズが入っているので以下のようになります。

https://www.youtube.com/watch?v=UwULnaX3Dtg&feature=youtu.be

デバックして見た結果、キャプチャ全体のサイズからロゴのサイズを引き算した領域(Rectクラス)をキャプチャの領域に載せたように見せるための計算処理を行います。

今の所、ロゴのサイズがやたら小さいのがおかしいので「なんで?」と疑問に思っているのですが、このドキュメントを見て「addWeighted」の処理内容を調べましたが、よくわからなかった。。。

とりあえずは、画像の上に指定領域(Rect)部分を乗せることができるようだ。

そして、今回はここまでにします。(頭から煙が出てきたようで。。。)

でわでわ。。。

関連記事一覧

Java OpenCv Lv1 〜入門: 写真の表示〜
Java OpenCV Lv2 〜JavaFXでの画像表示〜
Java OpenCV Lv2 〜画像を表示する〜
Java OpenCV Lv3 〜画像の平滑化(smooth())〜
Java OpenCV Lv3 〜画像にガウシアンフィルタ(GaussianBlur())〜
Java OpenCV Lv3 〜画像に中央値フィルタ(medianBlur())〜
Java OpenCV Lv4 〜画像の中身をみてみる〜
Java OpenCV Lv5 〜Matクラスで描画処理〜
Java OpenCV Lv7 〜MatクラスでEllipseしてみる〜
Java OpenCV Lv8 〜ROIについて〜
Java OpenCV Lv9 〜画像編集「足し算」(cvAdd)〜
Java OpenCV Lv9 〜画像編集「引き算」(cvSubtract)〜
Java OpenCV Lv9 〜画像の掛け算〜
Java OpenCV Lv10 〜行列演算Mat#submat()〜
Java OpenCv Lv10〜画像の平均輝度をだす〜
Java OpenCv ビデオキャプチャ〜カメラからの入力を表示〜
OpenCV tutorial〜ヒストグラム〜
OpenCV tutorial 解析 〜ヒストグラム〜


OpenCV tutorial〜ヒストグラム〜

イントロダクション

ようやく、OpenCVのチュートリアルを続ける準備ができました。

前回は、ビデオキャプチャを作成してJavaFXで起動しました。

問題というか気に入らない事

せっかく作成したビデオキャプチャと次に作成するヒストグラムのプログラムを別々に作成、もしくは変更するという方向でチュートリアルが記載されているので「画面切り替え」という形で今まで作成したものを残していく方法でやっていこうと思います。

画面切り替え作成はこんな感じでやりました。

そして、プロジェクトの構成を変えました。(リソースフォルダを使用するように修正)

スクリーンショット 2019-02-02 14.26.11.png

いざ、チュートリアル

参考にするサイトはこちらです。

今回のチュートリアルは「ビデオキャプチャ」作成後の状態(ソース)から始まっているようです。※自分にはふた通りの解釈ができました。

さぁ読み込んで理解してやるぞ!

結局。。。

よくわからなかった(記載している文言とキャプチャがずれているように見えた)のでソースから入ります。コードから入るのは理解力不足なのかもしれない。。。が、わからないなら結論から入るのもアリだと思うのです。

というわけで、チュートリアルページの一番下、以下キャプチャ参照(日本語に翻訳してます。。。)スクリーンショット 2019-02-02 14.58.55.png

Gitにあるソースを参照して写経します。元々の画面への追加は後日。。。

写経、そして起動

写経したら、早速動かしてみたいと思うのが人情(だと思う。。。)と言うわけで動かしてみました。

早速Exception

こんなのでました。

ちょっとわかりづらいけど、選択している部分に

at zenryokuservice.opencv.fx.tutorial.Tutorial2.start(Tutorial2.java:35)

実行したクラス名があります、そのクラス「start」メソッドTutorial2.javaの35行目でエラってます。。。という内容です。下の部分がそうです。

「Video.xml」とコーディングしてます。。。ファイルがないから落ちるな(笑)

「Video.fxml」に修正、サイド実行する

どーん!

またException、いつものことなので「なんだまだかよ?」みたいな感じです。

ポイントは下の方に記載がある、赤い字の部分です。

Caused by: java.lang.ClassNotFoundException: it.polito.teaching.cv.VideoController
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920)

「java.lang.ClassNotFoundException」は「クラスが見つかりませんよ!」というExceptionです。

作成したパッケージが「zenryokuservice.〜」で始まっているのに「it.polito〜」で始まっているのは明らかにおかしい→コピペが犯人です。自分が悪いわけじゃありません(ちゃんとやらないのがいけません。。。)というわけで、Video.fxmlのパッケージ名を修正します。

it.polito.teaching.cv.VideoController」
   →「zenryokuservice.opencv.fx.tutorial.VideoController」

そして再度実行!はい!いらっしゃい!

今度は、FXMLローダあたりのエラーのようです。

Caused by: java.lang.UnsatisfiedLinkError: org.opencv.videoio.VideoCapture.VideoCapture_3()J
at org.opencv.videoio.VideoCapture.VideoCapture_3(Native Method)
at org.opencv.videoio.VideoCapture.<init>(VideoCapture.java:72)
at zenryokuservice.opencv.fx.tutorial.VideoController.initialize(VideoController.java:72)
... 24 more

この「UnsatisfiedLinkError」は自分にもよくわかりませんでした。。。が赤い字で示す通り、VideoController.javaの72行目

this.capture = new VideoCapture();

「んー!なんでだ?わからんぞ?。。。」と5分くらい考えましたがわからなかったです。駄菓子菓子、OpenCVのライブラリの設定をしていなかった事に気がつきました(笑)

そう!OpenCVでプロジェクトにライブラリを設定する、実行時にライブラリを読み込む事が必要なのです。

/** ネイティブライブラリを読み込む */
static {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}

「static { 〜 }」の部分はメインメソッドの前に起動される部分です。

【補足】

Javaを起動するときに走る順番

  1. 「JVM(javaコマンドだと思ってください)
  2. 「staic」のついているフィールド、メソッド、スコープ(「{」と「}」で囲まれている部分)がJVMに読み込まれます。
  3. メインメソッド

大雑把にこんな感じです。そして修正して再実行!

Caused by: java.lang.ClassCastException: javafx.scene.layout.BorderPane cannot be cast to javafx.fxml.FXMLLoader
	at zenryokuservice.opencv.fx.tutorial.Tutorial2.start(Tutorial2.java:45)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
	at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
	at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Exception running application zenryokuservice.opencv.fx.tutorial.Tutorial2

BorderPaneはFXMLLoaderにキャストできません。というわけで下のように修正をします。

<変更前>

FXMLLoader loader = FXMLLoader.load(getClass().getResource("Video.fxml"));

<変更後>

FXMLLoader loader = new FXMLLoader(getClass().getResource("Video.fxml"));

凡ミスのようです。。。これで最後であって欲しい。。。

どーだぁ!

キターーーー!

[rakuten ids="book:19143914"]

[rakuten ids="book:18350556"]

ちなみに「Show Logo」のチェックボックスを押下するとエラリます。。。

これでなんとか動いたので、この処理の内容をみていきます。

ただし、次回にします。

でわでわ。。。









Java OpenCv ビデオキャプチャ〜カメラからの入力を表示〜

イントロダクション

TensorFlowでの機械学習のチュートリアルを多少やりました。下にリンクにあるような感じでやりました。

 Javaでの実装は時間がかかるように思ったので、理解する方を優先してPythonでチュートリアル通りに実行しました。

詳細はわからなかった

チュートリアルでやったことはあくまでフレームワークとしてのTensorFlowの使い方なので、キモになる部分は、つまり、機械学習の中身はわからなかったと言うことです。

実装して、思った事は学習モデルに対する理解が必要だと思いました。

具体的には、以下の様に処理を行い計算結果からどの様な判断をするか?を考えられないと、学習処理などのデータ集め〜決定する処理が実装出来ませんで。

  1. テストデータを用意
  2. 学習処理を行う
  3. テストを行い学習のレベルを調整
  4. 返却値より判定を行う

じゃあどーするか?

OpenCvの機械学習から理解していこうと思います。OpenCvでは、画像データ(ピクセル値の行列)より前景と背景を分けるなど、データの分布を分割するための線(境界)を算出し、それに対する処理を行います。

これらの処理を行うのに使用しているのが、「畳み込み(Convolution)」です。TensorFlowで使っている畳み込みフィルターと同じ様なモノだと思い、これの理解から始めようという考えです

どこからやるのか?

JavaFxで途中までやっていたのですが、ちょっとバグっぽいのがあったので放置していたもの(GIT)を持ってきて再開しようと思います。

参考にしているサイトはこちらです。

前回までのOpenCv関連のやったこと

  1. EclipseにSceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. Java OpenCv Lv1 〜入門: 写真の表示〜
  4. Java OpenCV Lv2 〜JavaFXでの画像表示〜

その前にバグ退治をやります。

どこから改修しようかととりあえずは参照元ソースを見た所。。。

実装していない部分を発見、Mainメソッドのクラスにありました。。。どーりで気づかないわけだ。。。Conrollerクラスしか見てなかったもんなぁ。。。

そんなわけでコードを追加してやったらご覧の通り動きした。

次回からは、このチュートリアルの続きをやっていこうと思います。

そして次回は

カラーチャンネルについてやるようです。

下の方法での実装を始めました。

Android OpenCV 〜サンプルアプリを動かす〜


関連ページ一覧

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. Java Git clone in Eclipse 〜サンプルの取得〜
  3. Eclipse Gitリポジトリの取得 〜GitからソースをPullしよう〜
  4. IntelliJ IDEA Git〜Gitリポジトリからクローン〜
  5. Java Basic Level 1 〜Hello Java〜
  6. Java OpenCV 環境セットアップ(on Mac)