UnityでOpenCV

どうもー、Reveです。
今日は久しぶりにブログの記事を色々とあげていこうかと思います。
ここの内容は、こちらの記事の続きになっています。

OpenCVで画像処理ことはじめ】
では、いよいよOpenCVを使ってみましょう。
今回は画像をモノクロに変換する処理を施します。

といっても、OpenCVやることは2つだけです。
・グレースケールのMatを用意
・テクスチャ素材をグレースケールにしてコピー


早速、OpenCVアセットを使ってこの機能を実装したUnityプロジェクトを作りましょう。
(前回の記事でOpenCVUnityに導入した前提です)

プロジェクトを作成したら、まずオブジェクトの中でQuad(Planeのような平面オブジェクト)を2つ用意して、
そのうちの一つには画像処理をしたいテクスチャ画像を貼ったマテリアルを付けてみます。画像はあらかじめリソースフォルダ(Project内に"Resources"という名前でフォルダを作成)して、そこに入れておきます。

OpenCVUnity_grayscale3.png
なお、画像サイズはオブジェクトのスケール比に影響されるので、オブジェクトの縦横サイズを変えて調整しましょう。

そして、テクスチャ画像を割り当てていない平面に、新しいC#スクリプトを取り付けます。
ここではGrayScaleScript.csと名付けています。
OpenCVUnity_grayscale3.png

スクリプトの中身は以下の通りです

using UnityEngine;
using OpenCVForUnity;

public class GrayScaleScript : MonoBehaviour {
// リソースの読み込み先
public string texturePath = "test001";

// Use this for initialization
void Start () {
//テクスチャ画像を読み込む
Texture2D texture_src = Resources.Load(texturePath) as Texture2D;

//テクスチャをMat画像へコピー
Mat origin = new Mat(texture_src.height, texture_src.width, CvType.CV_8UC4);
Utils.texture2DToMat(texture_src, origin);

//グレイスケールMat
Mat gray = new Mat(origin.rows(), origin.cols(), CvType.CV_8UC1);
//RGBA画像をグレイスケールに変換
Imgproc.cvtColor(origin, gray, Imgproc.COLOR_RGBA2GRAY);

//グレイスケールのMatをテクスチャに変換
Texture2D texture_out = new Texture2D(gray.cols(), gray.rows(), TextureFormat.RGBA32, false);
Utils.matToTexture2D(gray, texture_out);

//テクスチャの割り当て
GetComponent<Renderer>().material.mainTexture = texture_out;
}
}

そして、実行してみると下の画像のように、処理前の画像と処理後(グレースケール化)の画像が並べられます。
OpenCVUnity_grayscale1.png

このように、アセットを使えばUnityでOpenCVによる画像処理が簡単にできるので、
95ドルかかるのですが、その価値は十分にあるのではないかと。

ちなみに、UnityとOpenCVでこんなものを作ってみたので、ご覧いただけるとうれしい限りです。

テーマ : ゲーム開発
ジャンル : コンピュータ

UnityにOpenCVを導入する

どうもー、Reveです。
最近、UnityOpenCVを使う仕事があったので、備忘録がてらにUnityでの画像処理について書こうかと。

【何を使う?】
画像処理に使うライブラリとしておなじみのOpenCVですが、Unityでも使えるようになりました。
有料アセットですが、購入してインストールすればすぐに画像処理ができるようになるのでお勧めです。
(アセット詳細)
https://www.assetstore.unity3d.com/jp/#!/content/21088

...一応、OpenCVSharpを導入する手法(こちらは無料)もあるようですが、導入の手順も少し面倒で、iOSやAndroidへの対応も一筋縄ではいかなさそうなので、時間を節約したい人などは購入したほうが手っ取り早いと思います。
(OpenCVアセットの方はAndroid&iOSもサポート済み)

【導入の手順】
(ここからはUnityをインストールしている前提で進めます)

OpenCV for Unityのインストール
Unityからアセットストアを開いて、アセットを購入しましょう。
そのままインストールに入るので、すべての項目をインポートすれば導入は完了です。

...以上!これだけw
ただ、画像処理を実行するにはまだいくつか設定が必要なので、次節でそれらを書いて行きます。

【画像処理に使う素材について】
ここでは、あらかじめ用意した素材(jpg, pngなど)に画像処理を施すという前提で。

実は、画像の形式はUnityが対応するものであればなんでもよいのですが、
画像の設定(インスペクタ)はデフォルトの設定ではアセットに対応していません
そのため、設定を(結構)変更する必要があります。
texture_setting.jpg

アセットのサンプルによると、テクスチャの種類や読み書きの有効化など必要な設定がいくつかあるようですが、
ひとまず上の画像のようにすればOKです。

と、ここまで一通りの準備を終えたところで、
画像処理については次の記事で書いていこうかと思います。

続きを読む

テーマ : ゲーム開発
ジャンル : コンピュータ

初音ミクのライブVR体験しました

どうも、Reveです。
最近、ブログの更新がtwitterのつぶやきばかりだったので、今日は少し前に行われていた初音ミクのライブVRを取り上げようかと。

【イベント概要】
まあ、いきなり初音ミクのVRライブと言われても何ぞやという話になると思うので、まずは概要から。
このイベントは7月16日に秋葉原UDXギャラリーで行われた「初音ミクVRフューチャーライブ」の先行体験会のことで、秋葉原の近所に住んでる当方は朝の7時くらいから近くで待機してました(が、この時点ですでに列があったり...)

この「初音ミクVRフューチャーライブ」というのが、実はVR界で何かと話題のPS VRのコンテンツの一つであり、発売前にPS VRが体験できるということで、前日から興奮冷めやらぬまま朝の秋葉原に繰り出していきましたw

実は、秋葉原でUNITY VR EXPOというイベントがあったのですが(この記事を参照)、その前日に行われていました。後日あげようと思っていたのですが、何やかんやで2か月以上が経過してしまったので(汗)、今更ながらここであげていこうかと。

【会場の様子】
会場に入るとこんな感じ。
写真 2016-07-16 9 58 25

会場入って左側が体験ブースでした。
写真 2016-07-16 10 03 17

写真 2016-07-16 10 03 37

早速、相方に体験してもらいましょう。
写真 2016-07-16 10 49 00

写真 2016-07-16 10 49 53

写真 2016-07-16 10 52 28

写真 2016-07-16 10 52 49

写真 2016-07-16 10 52 46

写真 2016-07-16 10 53 19

写真 2016-07-16 10 53 06

写真 2016-07-16 10 53 44

写真 2016-07-16 10 55 14

当方も体験してきました。
写真 2016-07-16 10 57 49

写真 2016-07-16 10 58 21

ちなみに、ライブと連動したミニゲームみたいなものもいくつかあり、それをクリアすると特別な演出が追加で見られます。
当方もそれを見られたのですが、ちょっと写真がなかったのでもしあればまたアップします。

テーマ : 行ってきました☆
ジャンル : ブログ

ArduinoのSDカードからファイル名を一覧で取得する

こんにちは、Reveです。
このところtwitterでのつぶやき連携ばかりだったのですが、今日はちゃんとブログ記事を書こうかと思い、
久々のArduinoネタでつらつらと書いていきます。
(仕事しててちょうどネタが見つかったので)

ArduinoSDカード
このブログをご覧いただいている皆様はおおよそ承知かと思いますが、
Arduinoというのは電子回路の試作開発などに大変便利なマイコンボードで、世界で最も普及しているプロトタイピングツールといっても過言ではないでしょう。

そんなArduinoSDカードの読み書きも標準のライブラリから可能で、まさに至れり尽くせりなツールなのですが、
今日はSDカードの読み込みで、特定のファイルの名前だけを一覧で取り出す方法を記事にしたいと思います。

【ファイル名の一覧を作成】
ArduinoSDカード用ライブラリではファイル名の取得も当然できるのですが、
例えばSDカード内にあるファイルを一定時間ごとにランダムで開きたい時などは、わざわざ毎回SDカードにアクセスして調べると処理が重くなる可能性もあります。

かといって、事前にファイル名をArduinoのプログラム側に書いておくのも実装は楽ですが、頻繁にファイルを入れ替える場合は毎回わざわざ書き換えるのも面倒です。

そこで、SDカードに入っているファイルをいったん調べ、そのファイル名を配列のようにリスト化してしまえば動的に処理できるし、アクセス速度や負荷の心配もまずありません。

【実装手法とサンプル】
早速、サンプルを見てみましょう。
ここではルートフォルダ、つまりSDカードの一番上のフォルダにあるファイルをすべて読み込む処理になっています。

//SDカードライブラリの読み込み
#include <SD.h>
//SDライブラリで、SPI通信のライブラリも使うので、一緒に読み込む
#include <SPI.h>

//ファイル名を記憶しておくリスト変数
char** nameList;
//リスト内に含まれるファイル数
int numList;

void setup(){
//シリアル通信の設定
Serial.begin(9600);
while(!Serial){
//シリアル通信が準備できるまでの待機。Leonardoなどでのみ必須
}

//SDカードの読み込み
if(!SD.begin(4)){ //4番ピンをアクセス制御ピンとして使う
//SDカードの初期読み込みができない場合はエラー
Serial.println("initialization failed!");
return;
}

//内部のファイルにアクセス
File root = SD.open("/"); //SDカードのルートフォルダ
String listTemp = "";
while (true) {
File entry = root.openNextFile();
if (!entry) {
//これ以上ファイルがない場合
break;
}

//ディレクトリ名ではない場合
if (!entry.isDirectory()) {
String fileName = entry.name();
listTemp += String(fileName);
listTemp += ",";

/*
//特定の種類のファイルだけを選び出すことも可能(ここでは音楽ファイルを抽出)
//ファイルの拡張子を取り出す
//一番後ろのピリオドから後の文字を抽出
String ext = fileName.substring(fileName.lastIndexOf('.'));
//拡張子が指定のものだけを入れていく
if (ext.equalsIgnoreCase(".wav") || ext.equalsIgnoreCase(".mp3")) { //大文字か小文字かを無視する
listTemp += String(fileName);
listTemp += ",";
}
*/
}
else{
//ディレクトリ内部を 検索する場合は、再起関数として同じ処理を呼び出す
}
}

if (listTemp.length() > 0) {
//Serial.println(listTemp);

//リストの要素数を数え上げる
for (int i = 0; i < listTemp.length(); i++) {
i = listTemp.indexOf(',', i); //コンマの位置を探す
numList++;
}

//リストの初期化
nameList = new char*[numList];

for (int i = 0; i < numList; i++) {
//カンマの位置を見つけ、
int index = listTemp.indexOf(',');
String temp = String(listTemp.substring(0, index));
nameList[i] = new char[temp.length() + 1];
temp.toCharArray(nameList[i], temp.length() + 1);
Serial.println(nameList[i]);
listTemp.remove(0, index + 1);
}

Serial.println(numList);
}
else {
//ファイルが見つからなかった場合は強制終了
return;
}
}

void loop(){
//リストを利用する
}


今回のポイントは主に2つ。
1) ライブラリSDのFileクラスによるフォルダ検索とファイル名取得
2) ポインタのポインタによる文字列のリストの動的生成


これらを順番に見ていきましょう。
1) ライブラリSDのFileクラスによるフォルダ検索とファイル名取得
SDカードのライブラリでは、Fileクラスというものでファイル情報を管理します。
参照する親元を指定した後は、中のファイル情報を順番にFileクラスで取得していく流れになっています。

順序としては、以下のようになっています。
(a) SDカードの初期化: SD.begin(4);
(b) 参照するフォルダ(ルートフォルダ)を指定: File root = SD.open("/");
(c) フォルダ内のファイル名を順番に見ていく: File entry = root.openNextFile();
(d) ファイルがディレクトリでなければ、ファイル名を取得: if(!entry.isDirectory()){String filename = entry.name();}

なお、SDカードとArduinoのつなぎ方についてはこちらのリンク先を参照。
http://arms22.blog91.fc2.com/blog-entry-502.html

2) ポインタによる文字列のリストの動的生成
Arduinoは基本的にC++ベースですが、動的配列のテンプレートライブラリであるvector等は入っていないため、可変長の配列を実現するにはポインタなどのメモリ操作が必要になってきます。

ここでの処理は以下のようになります。
(a) グローバル変数として配列(ポインタ)を確保: char** nameList;
(b) ファイルの数をもとに配列の初期化: nameList = new char*[numList];
(c) 配列の中にそれぞれ値をコピーしていく

値のコピーについては色々と手法がありますが、今回はファイル名をStringクラスで取得しているため、toCharArrayメソッドで配列の要素へと値を入れています。

ちなみに、今回は文字列配列のため、要素それぞれの長さが別々になっています。
(C#でいうところのジャグ配列に近いイメージ)。
そのため、要素数を配列から直接求めるのは難しいので、要素数は別の変数で記憶しておきましょう。


と、このような形でファイル名のリストが作れるので、メインの処理などでファイルを参照するときにこのリストでファイル名を取得して操作するということが可能になります。
ぜひ試してみてください。

続きを読む

テーマ : 電子工作
ジャンル : 趣味・実用

09/16のツイートまとめ

Revetronique

Laval virtualのメールがいつもフランス語だからさっぱり読めない…orz
09-16 18:02

昨日のVR学会でいただきました。デザインが可愛い! #VRSJ #ハコスコ https://t.co/Gpv7do2xdh
09-16 08:50

さやべぇ役の寧々さんにいいね!してもらえた\(・∀・)/ヒャッホゥ https://t.co/Cer2dWKoVY
09-16 05:57

Unityのライティング雑記

ちょっとしたメモ。
開発のtipsというほど大げさなものでもないですが、ライティングのスカイボックス(Skybox)でちょっとした話です。

Unityのスカイボックスは、ゲーム画面の全体を覆う空を見せるための背景画像みたいなもので、ゲーム中の空間を広く見せる機能です(https://docs.unity3d.com/jp/current/Manual/class-Skybox.html)。

デフォルトのスカイボックスも用意されているのですが、Android用のアプリを開発する際にこれを表示させたままにすると、どうもアプリの処理が一部動かない現象が発生しました。
で、WindowメニューのLightingという項目があるのですが、それを選んで
SceneタブのEnvironment Lightingという項目の中にある「Skyboxを選択して何もスカイボックスを入れない(none)ように設定すると、動作が軽くなるのかその現象が解消できました。

テスト用機種のスペックや開発中のアプリにもよると思いますが、
ビルドして困ったときは一度こちらもお試しいただくと、いいことがあるかも。。。

ちなみに、このアプリを作っているときに上のような現象が発生しました。
ここでは、OpenCVによるWebカメラのリアルタイム画像処理をさせながら、魚の3DCGモデルを同時に何体も動かしています。
Touch水族館(https://www.youtube.com/watch?v=57VoPpHbhWM)

なお、開発機種はFREETELのPriori3 LTEを使ってます。


スペックもさすがに高級機種には劣りますが、値段の割には中々良く、
コストパフォーマンスでいうと現行機種の中でも最高クラスではないでしょうか。

テーマ : ゲーム開発
ジャンル : コンピュータ

09/13のツイートまとめ

Revetronique

クリエイターとして、お手伝いとかでも何でもいいから巻き込まれたい…シーズン3お待ちしております。もちろん2でも‼ #アイキャラ https://t.co/4kUtAi8Ut4
09-13 21:49

アイキャラ最高!最前列最高!神イベありがとう!さやべぇー!!! #アイキャラ https://t.co/5CtbCRDi2V
09-13 21:40

さやべぇをニコ動でも召喚!#アイキャラ #さやべぇ #小林咲彩 #VR https://t.co/UnT3uDwtl9
09-13 14:49

さやべぇ召喚の動画だよ! #アイキャラ #さやべぇ #小林咲彩 #VR https://t.co/kh2CHIaT42
09-13 14:09

今日は祝☆アイキャラFesだから、魔法陣からさやべぇ召喚〜!!! VR対応しました! #アイキャラ #さやべぇ #vr https://t.co/GcSXeJkTyn
09-13 11:16

魔方陣できたー!!これで、さやべえが魔方陣から出てくるぅ! #アイキャラ
09-13 08:20

09/10のツイートまとめ

Revetronique

例のごとく、ニコ動にもあげました。https://t.co/D2kkvPzcQ0#unity3d #VR #AR
09-10 22:51

UnityとOpenCVでVR水族館(っぽいの)を作りました。空間は世界!https://t.co/LCwOfxjATf#unity3d #VR #AR
09-10 22:07

#お菓子のいい音 初音ミクのマジカルミライ企画展に来てます https://t.co/oL7twGcR0j
09-10 15:44

久々のZeppライブな昨日から、今日は幕張メッセで初☆初音ミクちゃんライブなのだ(*´ω`)ノ #マジカルミライ
09-10 11:36

09/07のツイートまとめ

Revetronique

秋葉原ランチ!とってもオシャレなおはし! #秋葉原 https://t.co/m30imEUmAK
09-07 14:51

浅草でカレーパン https://t.co/cSjHkIawQ2
09-07 00:38

09/04のツイートまとめ

Revetronique

今日の教訓。イベント展示といえども、作品・製品にはRをかけること!丸みは大事。
09-04 16:12

Bapa卒展行ってきました!歩いて旅するをテーマに京都と長野でフィールドワークをしたそうです。#bapa #sensors https://t.co/c6Cs96xXfC
09-04 16:08

プロフィール

Reveちゃん

Author:Reveちゃん
コンビでやってます。
夢担当と技術担当がいます。

大学院卒業 → ロボットベンチャー(漆黒)就職 → 1年で退職 → ベトナムで仕事中(今ここ) → メディアアーティスト(未来☆)

リンクフリーです。

最新記事
最新コメント
月別アーカイブ
カテゴリ
アクセス数
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR