0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

openCVとKotlinを使った塗り絵アプリ#2

Posted at

はじめに

前回の記事
前回は環境の導入方法とデザインの表示について書きました。
今回は実際にopenCVを使ってみて苦労した点を書いていこうと思います。
画像はペイントで適当に作ったもので大丈夫です。

必要になる引数の型はリファレンスで確認しながら作業しました。
openCVリファレンス

塗りつぶし

openCVではfloodFillという関数で色を塗ることができます。
はじめはfindcontoursという関数を使って線の輪郭を抽出してその輪郭の範囲内を
floodFillで色を塗るという考えでした。

MainActivity.kt

//drawableに格納した画像を変数に入れる
var bitmap: Bitmap= BitmapFactory.decodeResource(resources, R.drawable.画像ファイル名)
//画像を行列の状態に変換(詳しい仕組みは理解できていません。)
var mat: Mat = Mat.zeros(bitmap.height,bitmap.widht, CV_8UC1)
var list: MutableList<MatOfPoint> = ArrayList()

//輪郭抽出
findContours(mat, list, mat(), 0, 0)

//指定した座標から抽出された輪郭までを指定の色で塗りつぶす
floodFill(mat, mat, Point(x,y), Color(R,G,B))

これだけだとエラーが起きました。

画像処理するにはまず2値化という処理をしないといけないらしい。
(2値化というのは画像を白か黒でしか表現できない形にすること。)
2値化処理はcvtColorというものが使えるので追記します。

MainActivity.kt

//drawableに格納した画像を変数に入れる
var bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.画像ファイル名)

//画像を行列の状態に変換(詳しい仕組みは理解できていません。)
var mat: Mat = Mat.zeros(bitmap.height,bitmap.widht, CV_8UC1)

//輪郭抽出した階層を保存しているらしい
var list: MutableList<MatOfPoint> = ArrayList()

//Mat型でしか変換できない為型変換処理
bitmapToMat(bitmap, mat)

//2値化処理(グレースケール変換)
cvtColor(mat, mat, COLOR_BGR2GRAY)

//輪郭抽出
findContours(mat, list, mat(), 0, 0)

//指定した座標から抽出された輪郭までを指定の色で塗りつぶす
floodFill(mat, mat, Point(x,y), Color(R,G,B))

これで2値化の状態で塗りつぶすことができます。
これでは塗り絵にならないので色情報を追加しなければいけないのでこれも追記します。

MainActivity.kt

//drawableに格納した画像を変数に入れる
var bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.画像ファイル名)

//画像を行列の状態に変換(詳しい仕組みは理解できていません。)
var mat: Mat = Mat.zeros(bitmap.height,bitmap.widht, CV_8UC1)

//輪郭抽出した階層を保存しているらしい
var list: MutableList<MatOfPoint> = ArrayList()

//Mat型でしか変換できない為型変換処理
bitmapToMat(bitmap, mat)

//2値化処理(グレースケール変換)
cvtColor(mat, mat, COLOR_BGR2GRAY)

//色情報を戻す
cvtColor(mat, mat, COLOR_GRAY2BGR)

//輪郭抽出
findContours(mat, list, mat(), 0, 0)

//指定した座標から抽出された輪郭までを指定の色で塗りつぶす
floodFill(mat, mat, Point(x,y), Color(R,G,B))

これでRGB指定で色を塗れるようになりました。

これでは一か所にしか色を塗ることができません。
次回は複数個所に塗れるようにしていこうと思います。

さいごに

開発してる際に便利だと思ったものを紹介しようと思います。
xmlで定義したIDを使おうとすると必要になる「findViewById」
こいつが省略できるみたいです。

1.Gradle Scripts 内の bulid.gradle(拡張子が.app)に一番下の行に下記のコードをコピペ
[apply plugin: 'kotlin-android-extensions']
2.プロジェクトと同期が必要になるので画面上側に出てくる[Sync Now]をクリック
3.使いたいソースファイルに下記コードをコピペ
[import kotlinx.android.synthetic.main.activity_main.*]

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?