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

    メディアチームメディアチーム
    2021.02.03

    IT技術

    Unity+OpenCVで画像処理に挑戦!

    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機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background