Unity+OpenCVで画像処理に挑戦!
IT技術
Unity に OpenCV が対応
ゲームエンジンの中でも世界最大のシェアを誇る「Unity」。
画像処理ライブラリ「OpenCV」が Unity に対応したため、画像処理が簡単にできるようになりました。
今回は、Unity で OpenCV を使い、画像処理する方法を解説していきます。
OpenCV とは?
対応言語 | C/C++、Java、Python、MATLAB |
「OpenCV」とは、Intel が開発したコンピュータビジョン向けライブラリです。
画像処理機能だけではなく、解析や機械学習機能も備えています。
マルチプラットフォーム対応かつ、オープンソースなので、基本的には無料で使うことができます。
【OpenCV 公式サイト】
https://opencv.org/
OpenCV でできること
- リサイズ、トリミング、モザイク処理、色処理などの基本的な画像処理
- 物体検出・追跡
- カメラキャリブレーション
- コンピュテーショナルフォトグラフィ
- 機械学習
- GUI
実際に Unity + OpenCV で画像処理に挑戦!
それでは、実際に Unity と OpenCV を使って画像処理をやってみましょう!
アセットストアからアセットをダウンロード
まずは、以下のリンクからアセットをダウンロードしましょう。
その後、Unity エディタでインポートしてください。
【OpenCV plus Unity】
https://assetstore.unity.com/packages/tools/integration/opencv-plus-unity-85928
安全ではないコードの実行を許可
Unity で OpenCV を使うには、コードの実行を許可する必要があります。
Build Settings → Player Settings のインスペクタから「Unsafecode」を許可します。
ポインタなどを使う時も、これと同様です。
必要なファイルとオブジェクトを用意する
今回は、以下の画像ファイルを使います。
この画像ファイルをダウンロードし、コピーの上、名前を変えて2つのファイルをインポートしましょう。
画像設定を変更
さらに、画像の設定を以下の通りに変更してください。
「Read/Write Enable」で、外部ソースコードからの処理を許可します。
RawImage を配置
次に、Unity の Scene 内に、2つの RawImage を配置します。
ソースコードの記述
最後に、以下のソースコードを、先ほど用意した RawImage にアタッチします。
「originalimage」の部分に、元の画像が代入されます。
1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4using OpenCvSharp;
5using UnityEngine.UI;
6
7namespace OpenCvSharp
8{
9 public class AttackeffectLookOperator : MonoBehaviour
10 {
11 public Texture2D originalimage;
12
13 Mat originmat;
14 Mat hsver;
15 Mat bindata;
16 Texture2D binary_tex;
17
18 private readonly static Scalar LOWER = new Scalar(50, 150, 10);//抽出したい色のHSV形式での下限ベクトル
19 private readonly static Scalar UPPER = new Scalar(100, 255, 255);//抽出したい色のHSV形式での上限ベクトル
20
21 // Start is called before the first frame update
22 void Start()
23 {
24 originmat = OpenCvSharp.Unity.TextureToMat(this.originalimage);//画像の取り込み
25 hsver = new Mat();
26 Cv2.CvtColor(originmat, hsver, ColorConversionCodes.BGR2HSV);//形式をRGBからHSVに変換
27 bindata = hsver.InRange(LOWER, UPPER);//抽出したい色のHSVでの上限下限を設定
28 binary_tex = OpenCvSharp.Unity.MatToTexture(bindata);//グレースケールで色を抽出し二値化
29 GetComponent<RawImage>().texture = binary_tex;
30 }
31
32 // Update is called once per frame
33 void Update()
34 {
35 }
36 }
37}
結果を確認
結果は、以下のようになります。
見事、青色のみを抽出することが出来ました!
OpenCV と HSV 形式
今回は「HSV形式」で色を指定しています。
HSV は一般に用いられる RGB と違い、「色相」「彩度」「明度」の3成分で色を決定します。
OpenCV の HSV 色空間
OpenCV で HSV 形式を使う場合、各成分の値は以下の通りです。
色相(Hue) | 0~180 |
彩度(Saturation) | 0~255 |
明度(Value) | 0~255 |
本来、HSV 形式の色相の値は「0~360」なのですが、OpenCV の色相最大値は「180」なので注意してください。
黄色を指定
例として、黄色を指定してみましょう。
上記のコードでは、この部分で青色を指定しています。
1 private readonly static Scalar LOWER = new Scalar(50, 150, 10);
2 private readonly static Scalar UPPER = new Scalar(100, 255, 255);
ここを以下のように変えれば、黄色が抽出されます。
1 private readonly static Scalar LOWER = new Scalar(10, 150, 10);
2 private readonly static Scalar UPPER = new Scalar(50, 255, 255);
実行
実行してみると、以下のようになるはずです。
さいごに
今回は、Unity と OpenCV を使って画像処理する方法をご紹介しました。
アセットを使えば、「ゲームの処理」と「画像処理」を一つのソフトに統合できるため便利ですよ。
画像処理以外にも、OpenCV には便利な機能がたくさんあるのでオススメです!
こちらの記事もオススメ!
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit