Android　で OpenCV のサンプルを試す

[AndroidStudio で OpenCV をインポートする](https://qiita.com/ohwada/items/71eb18296aac46f9f5ee)
の続きです。

### 概要

Android 用 OpenCV　には、
８個のサンプルが同封されている。
これを試す。

 - tutorial-1-camerapreview
- tutorial-2-mixedprocessing
 - tutorial-3-cameracontrol
 - image-manipulations
 - 15-puzzle
 - color-blob-detection
 - camera-calibration
- face-detection

[OpenCV4Android Samples](https://opencv.org/opencv4android-samples/)

### tutorial-1-camerapreview

カメラのプレビュー画像を表示する。
![opencv42_preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/071ef71f-22fb-f824-c82e-b6f4006e0b9c.png)


基本となるサンプルなので、別の記事で解説する。

[Android　で OpenCV のサンプル camerapreview を試す](https://qiita.com/ohwada/items/53305d29f33bd14e6683)

### tutorial-2-mixedprocessing


OpenCVの Java API と Native API の２つの方法で、
カメラからの画像を変換して、表示する。

特徴点抽出の例
![opencv48_find._feature.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/ce1b531d-df6d-62de-021f-16ff6f5bfd2e.png)


Native API  を使うサンプルなので、別の記事で解説する。

[Android　で OpenCV のサンプル mixedprocessing を試す](https://qiita.com/ohwada/items/6991e8e3a37d03149b16)

### tutorial-3-cameracontrol


OpenCV の Java API を使って、
Androidアプリでカメラを操作する方法を示す。

sepia の例
![opencv43_sepia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/3f3cbc7f-cdfb-c336-3100-48356f93680f.png)


下記の機能がある。
- カメラの Color Effect を有効にする。
- カメラのプレビュー解像度を変更する。
- カメラ画像をキャプチャしてファイルに保存する。

カメラの Color Effect には、下記の選択肢がある。
- none 
- mono 
- negative 
- solarize 
- sepia 
- posterize 
- whiteboard 
- blackboard 
- aqua 

注意：
これらの機能は　API 21以降で、廃止予定 (Deprecated) になった旧来の Camera API により実現される。

[reference : setColorEffect](https://developer.android.com/reference/android/hardware/Camera.Parameters.html#setColorEffect(java.lang.String))

サンプルコードはこちら
https://github.com/ohwada/Android_Samples/tree/master/Opencv43

Camera2 API を使って同様の機能を実現する方法は、
下記の記事を参照ください。

[Android の Camera2 API を使って Color Effect する]( https://qiita.com/ohwada/items/6b4bb3dbd2794b58f228)

### image-manipulations

複数のフィルターをサポートし、色空間の変換とヒストグラムの操作を示す。

ヒストグラムの例
![opencv45_histgram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/d1ef851c-42aa-4e0e-f34f-11611d6a2ee3.png)

下記の選択肢がある
- Preview RGBA
- Histograms
- Canny 
キャニー ( Canny) 法によりエッジを検出して描画する
- Sobel <br/>
ソーベル ( Sobel) 法によりエッジを検出して描画する
- Sepia
- Zoom
- Pixelize
モザイク処理
- Posterize
階調変更

- [opencv : 画像処理　ヒストグラム　cv::calcHist](http://opencv.jp/opencv-2svn/cpp/imgproc_histograms.html)

- [opencv : エッジ検出（Sobel，Laplacian，Canny）](http://opencv.jp/opencv2-x-samples/edge_detection)


サンプルコードはこちら
https://github.com/ohwada/Android_Samples/tree/master/Opencv45

### 15-puzzle


カメラ画像を分割して、15パズルにする。
![opencv44_15puzzle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/698ec5d7-635f-5c76-a91d-01a04af1030f.png)


メニューは下記の２つ
- Show/hide tile numbers
- Start new game

画像の分割には、Mat#submat　を使用する。
タイル画像の中央に赤い文字でタイル番号。
タイル画像の境に緑の線


- [wikipedia : 15パズル](https://ja.wikipedia.org/wiki/15%E3%83%91%E3%82%BA%E3%83%AB)


- [opencv : Mat#submat](https://docs.opencv.org/3.4/javadoc/org/opencv/core/Mat.html#submat(int,int,int,int))

- [opencv : 描画関数　cv::putText](http://opencv.jp/opencv-2svn/cpp/drawing_functions.html#cv-puttext)

- [opencv : 描画関数　cv::line](http://opencv.jp/opencv-2svn/cpp/drawing_functions.html#cv-line)

サンプルコードはこちら
https://github.com/ohwada/Android_Samples/tree/master/Opencv44

### color-blob-detection


Blobは、いくつかの共通のプロパティ（グレースケール値など）を共有する画素の集合です

このサンプルは、タッチされた場所の色と同じ色の領域を検出し、
領域に輪郭を描画する。

![opencv46_blob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/7e99e9f2-573c-32ec-b747-e0d6875c5cf9.png)

InRange で、同じ色の領域を検出する
findContours　で、輪郭を検出する
drawContours　で、輪郭を描画する

- [opencv : 配列操作 InRange](http://opencv.jp/opencv-2svn/py/core_operations_on_arrays.html#inrange)

- [opencv : findContours](http://opencv.jp/opencv-2svn/cpp/structural_analysis_and_shape_descriptors.html#cv-findcontours)

- [opencv : drawContours](http://opencv.jp/opencv-2svn/cpp/structural_analysis_and_shape_descriptors.html#cv-drawcontours)

サンプルコードはこちら
https://github.com/ohwada/Android_Samples/tree/master/Opencv46

### 　camera-calibration

カメラの歪みを較正する

グリッドパターンを検出した例
![opencv47_calibration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/c4392299-e07f-a28b-21aa-5ff3089c1016.png)

このサンプルは、下記を基にしている。
[Camera calibration With OpenCV](https://docs.opencv.org/3.4/d4/d94/tutorial_camera_calibration.html)

使い方

OpenCV非対称円グリッドパターン11x4 を使用する。
 https://github.com/opencv/opencv/blob/3.4/doc/acircles_pattern.png 

グリッドパターンを検出すると、ハイライト表示される。

グリッドパターンを様々な距離、角度から画面をタッチして、キャプチャーする。

メニューバーの「calibrate」ボタンを押す。
結果として、5つの歪み係数が得られる。

プレビューモードは３通りある。

- Calibration 
グリッドパターンを検出してハイライト表示する
- Undistortion 
歪みを較正した画像を表示する
- Comparison
元の画像と歪みを較正した画像を並べて表示する

[opencv : cv::calibrateCamera](http://opencv.jp/opencv-2svn/cpp/camera_calibration_and_3d_reconstruction.html#cv-calibratecamera)

サンプルコードはこちら
https://github.com/ohwada/Android_Samples/tree/master/Opencv47

### 　face-detection

顔検出機能の最もシンプルなサンプルです。
![opencv49_face_detect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/9f083f50-07f3-e3f9-bbf8-dbb6fa2cf038.png)

別の記事で解説する。
https://qiita.com/ohwada/items/d4cae2924aabe18cc9c4