• トップ
  • ブログ一覧
  • Unity+OpenCVで画像処理に挑戦!
  • Unity+OpenCVで画像処理に挑戦!

    広告メディア事業部広告メディア事業部
    2021.02.03

    IT技術

    Unity に OpenCV が対応

    ゲームエンジンの中でも世界最大のシェアを誇る「Unity」。

    画像処理ライブラリ「OpenCV」が Unity に対応したため、画像処理が簡単にできるようになりました。

    今回は、Unity で OpenCV を使い、画像処理する方法を解説していきます。

    OpenCV とは?

    対応言語C/C++、Java、Python、MATLAB

    「OpenCV」とは、Intel が開発したコンピュータビジョン向けライブラリです。

    画像処理機能だけではなく、解析や機械学習機能も備えています。

    マルチプラットフォーム対応かつ、オープンソースなので、基本的には無料で使うことができます。

    【OpenCV 公式サイト】
    https://opencv.org/

    OpenCV でできること

    1. リサイズ、トリミング、モザイク処理、色処理などの基本的な画像処理
    2. 物体検出・追跡
    3. カメラキャリブレーション
    4. コンピュテーショナルフォトグラフィ
    5. 機械学習
    6. 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 を配置

    ソースコードの記述

    最後に、以下のソースコードを、先ほど用意した 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 には便利な機能がたくさんあるのでオススメです!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.28Unity 特集知識編おすすめのゲームエンジン5選実装編※最新記事順に並べています。VR環境でテキストを表示する方法非同期式の入れ子処...
    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事