CV Drone日本語版 更新 (1年ぶり)

日本語版ユーザの皆様、大変お待たせいたしました。

約1年ぶりとなりますが、CV Droneの日本語版を更新します。


cvdrone.jpg
CV Drone 日本語版のダウンロード - 34.1MB
※本ソフトウェアはGitHub上に公開している英語版のCV Droneを日本語化したものです。英語版からの機能変更はありません。



今回の更新の内容は以下のとおりです。
・getImage()をIplImage/cv::Mat両方に対応
・cv::Mat用に>>演算子によるカメラ画像取得を追加
・カーソルキー用のマクロCV_VK_xxxを追加
・初期化処理を修正(最大速度/角速度の設定やLEDアニメーションの追加等)
・付属のOpenCVライブラリを3.0-alphaに更新(Visual Studio用)
・Xcodeへの試験的な対応
・サンプルをOpenCV 2.x系に書き直し(古いものはoldフォルダへ)
・マーカ有りARのサンプル追加
・コメントをDoxygenスタイルに変更(一部はそのまま)
・サンプルのバグ修正
スポンサーサイト



AndroidでOpenCV (3)

オプティカルフローのサンプルがないよ!

ということで作ってみました。
苦戦されている方どうぞ。

package org.opencv.samples.tutorial1;

// Java
import java.util.List;
import java.util.Vector;

// OpenCV
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Size;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfInt;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.MatOfPoint3f;
import org.opencv.core.Point;
import org.opencv.core.Point3;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.TermCriteria;
import org.opencv.features2d.Features2d;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.video.Video;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;

// UI
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.Toast;

public class Tutorial1Activity extends Activity implements CvCameraViewListener2 {
private static final String TAG = "OCVSample::Activity";

// カメラ
private CameraBridgeViewBase mOpenCvCameraView;

// カメラ画像
private Mat image, image_small;

// オプティカルフロー用
private Mat image_prev, image_next;
private MatOfPoint2f pts_prev, pts_next;

// OpenCVライブラリのロード
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
break;
}
default: {
super.onManagerConnected(status);
break;
}
}
}
};

// コンストラクタ
public Tutorial1Activity() {
Log.i(TAG, "Instantiated new " + this.getClass());
pts_prev = new MatOfPoint2f();
pts_next = new MatOfPoint2f();
}

// 起動時
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.tutorial1_surface_view);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
}

// 停止時
@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null) mOpenCvCameraView.disableView();
}

// 再開時
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}

// 破棄時
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null) mOpenCvCameraView.disableView();
}

// カメラ開始時
public void onCameraViewStarted(int width, int height) {
image = new Mat(height, width, CvType.CV_8UC3);
image_small = new Mat(height/8, width/8, CvType.CV_8UC3);
image_prev = new Mat(image_small.rows(), image_small.cols(), image_small.type());
image_next = new Mat(image_small.rows(), image_small.cols(), image_small.type());
}

// カメラ停止時
public void onCameraViewStopped() {
}

// 画像取得時
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
// 縮小
image = inputFrame.rgba();
Imgproc.resize(image, image_small, image_small.size(), 0, 0, Imgproc.INTER_NEAREST);

// グレースケール
Mat gray = new Mat(image_small.rows(), image_small.cols(), CvType.CV_8UC1);
Imgproc.cvtColor(image_small, gray, Imgproc.COLOR_RGB2GRAY);

// 特徴点抽出
MatOfPoint features = new MatOfPoint();
Imgproc.goodFeaturesToTrack(gray, features, 50, 0.01, 10);

// 特徴点が見つかった
if (features.total() > 0) {
// 過去のデータが存在する
if (pts_prev.total() > 0) {
// 現在のデータ
gray.copyTo(image_next);
pts_next = new MatOfPoint2f(features.toArray());

// オプティカルフロー算出
MatOfByte status = new MatOfByte();
MatOfFloat err = new MatOfFloat();
Video.calcOpticalFlowPyrLK(image_prev, image_next, pts_prev, pts_next, status, err);

// 表示
long flow_num = status.total();
if (flow_num > 0) {
List<Byte> list_status = status.toList();
List<Point> list_features_prev = pts_prev.toList();
List<Point> list_features_next = pts_next.toList();
double scale_x = image.cols() / image_small.cols();
double scale_y = image.rows() / image_small.rows();
for (int i = 0; i < flow_num; i++) {
if (list_status.get(i) == 1) {
Point p1 = new Point();
p1.x = list_features_prev.get(i).x * scale_x;
p1.y = list_features_prev.get(i).y * scale_y;
//Core.circle(image, p1, 3, new Scalar(255,0,0), -1, 8, 0 );
Point p2 = new Point();
p2.x = list_features_next.get(i).x * scale_x;
p2.y = list_features_next.get(i).y * scale_y;
//Core.circle(image, p2, 3, new Scalar(255,255,0), -1, 8, 0 );

// フロー描画
int thickness = 5;
Core.line(image, p1, p2, new Scalar(0,255,0), thickness);
}
}
}
}

// 過去のデータ
gray.copyTo(image_prev);
pts_prev = new MatOfPoint2f(features.toArray());
}

return image;
}
}

オプティカルフローできるからどうしたという話ですが、動きベクトルが表示されると楽しいですよね。

AndroidでOpenCV (2)

せっかくAndroidの開発環境をインストールしたので、何か動かして遊んでみましょう。

と、その前にAndroid SDKのインストールを忘れずに。

「ウィンドウ」→「Android SDK マネージャー」を開くとなんかもうチェックが入っているので、

adt_sdk_manager_1.jpg

ポチポチっとボタンを押していってインストールすればOKです。

adt_sdk_manager_2.jpg
※結構時間がかかります

今回はOpenCV for Androidのサンプルを利用します。

OpenCVのダウンロードページからOpenCV for Androidのパッケージをダウンロードし、任意のディレクトリに解凍しましょう。

「ファイル」→「インポート」で既存のワークスペースをインポートします。

adt_import_1.jpg

OpenCV for Androidのフォルダを指定して「完了」を押しましょう。

adt_import_2.jpg

あとは好きなプロジェクトを選んでデバイスにインストールしてやれば大丈夫ですね。
Tutorial 1のカメラプレビューが良いでしょう。

adt_build_tutrial1.jpg

記事が手抜き?仕様です。
CV Drone日本語版の更新中だから許して!

AndroidでOpenCV (1)

今回はAndroidの開発環境を揃えます。

1. Android SDKのダウンロード
まずはhttp://developer.android.com/sdk/へ移動してAndroid SDKをダウンロードしましょう。

download_android_sdk_1.jpg

使用許諾書に「同意する」にチェックし、下の青いボタンを押すとダウンロードが開始されます。

download_android_sdk_2.jpg

わかりやすいところ(C\: 等)に解凍しておきましょう。

2. JDKのダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/へ移動しましょう。

download_jdk_1.jpg

32bit環境の場合は「jdk-8u20-windows-i586.exe」を64bit環境の場合は「jdk-8u20-windows-x64.exe」をダウンロードしてインストールしましょう。

download_jdk_2.jpg

3. Eclipse日本語化プラグインのダウンロード
http://mergedoc.sourceforge.jp/ からPleiades - Eclipse 日本語化プラグインをダウンロードし、

download_pleiades.jpg

「plugin」と「features」を「C:\adt-bundle-windows-x86_xx-xxxxxxxx\eclipse」にコピーします。
さらに、日本語化プラグインを有効化するために、
C:\adt-bundle-windows-x86_xx-xxxxxxxx\eclipse\config.iniの一番下の行に
-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=default.splash
を追加します。

4. OpenCVのダウンロード
http://opencv.org/downloads.html に移動しましょう。

download_opencv_android.jpg

OpenCV 3.0-AlphaはまだAndroid用のパッケージがないため、ここでは2.4.9をダウンロードします。


5. Nexus7ドライバのダウンロード
http://developer.android.com/sdk/win-usb.htmlからNexus7用ドライバをダウンロードしましょう。

download_google_usb_driver.jpg


とりあえず今回はここまで!

再開します

だまして悪いが、気まぐれなんでな。



再開のメドが付きましたのでブログ再開します。
心待ちにされていた皆様、本当にお待たせしました。

最近Nexus7を手に入れたので、ちょっとこれで遊んでみようかと思います。

nexus-7.jpg

あとはOpenCVでARやったりとか、日本語版の更新やらなんやら...準備中です。
プロフィール

puku

Author:puku
暇な時はゲームかプログラミングしてる人だよ。
だいたい月1更新。
CV Drone はこちら(GitHub)

最近はQiitaでOnsenUI2で遊んでいる。

最新記事
最新コメント
最新トラックバック
検索フォーム
カレンダー
09 | 2014/10 | 11
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
月別アーカイブ
カテゴリ
スポンサードリンク
RSSリンクの表示
FC2カウンター
リンク
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
754位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
158位
アクセスランキングを見る>>
FC2ブログランキング

FC2Blog Ranking

QRコード
QR