11/28のツイートまとめ

Revetronique

ちなみに、先ほどのねじを外す工程で、ねじは液晶パネル、プレート(大)、プレート(小)で使われるものが違うので、取り付ける際は種類に気を付けます。あと、ガラスを貼り付ける前に外したマグネットを戻すのも忘れずに。
11-28 03:14

液晶パネルまで戻したら、あとはガラスのふちについている両面テープのフィルムを外し、本体に押し付けて貼り付けます。これで全行程は終了ですが、万が一この記事を参照にして修復できなかった場合も一切保証はできません。 https://t.co/X7FVyiI3Fv
11-28 03:11

あとはこれまでと逆の手順となるのですが、まずコネクタ周辺(ケーブルや回路の)部分の接着テープを外して、ケーブルを本体とパネルの間に挟み込むようにして、コネクタを本体にはめてから押し付けて接着します。後は外したねじを取り付けてプレー… https://t.co/BLW99ndflX
11-28 03:08

するとフロントガラスのコネクタが見えるので、これを外すとガラスが本体から離れます。ようやく交換用のガラスが取り付けられる状態になるので、袋から交換用のを出して、取り付けていきます。 https://t.co/fgliCEDXnN
11-28 03:03

プレートを外したら、本体の右下に小さなプレートが見えるので、そちらもねじを外します。開けるといろいろな部品と共にコネクタがあるので、まずはバッテリー(隣の黒くて薄い板状のもの)のケーブルを外し、続けて液晶パネルのコネクタも外します。 https://t.co/lGIIwQNWox
11-28 02:58

なお、液晶パネルを外す際、ねじの上にマグネットがついている箇所があると思いますが、そのマグネットは後で戻すので保管しておきましょう。また、液晶パネルもテープで接着しておりはがしにくい場合があるため、その時は慎重に動かしましょう。
11-28 02:54

フロントガラスが無事にはがせたら、続いて液晶パネルをどかします。四隅のねじを外すと、ホームボタン側にケーブルでつながっているので、そちらを軸に起こして180度回転させて開きます。すると中にプレートが付いているので、続けてねじを外し… https://t.co/YGBEGwj1dv
11-28 02:51

実は、このガラスを剥がす過程が一番時間がかかりました。はがす際は、内部のケーブルや部品(特にカメラやwifiモジュール)を傷つけないよう慎重に少しずつ進めていったほうが良いです。
11-28 02:45

ただ、今回は損傷がひどくガラスもきれいに剥がれなかったので、精密用マイナスドライバーをへら代わりに細かい部分を剥がしています。テープの残った部分も除菌アルコールタオルで落として綺麗にしていました。 https://t.co/sU6Sqnvbuf
11-28 02:41

ドライヤーはiPadの淵に沿ってゆっくり動かしながら、均一に熱が伝わるようにして当てていました。時間はよく覚えていない(汗)のですが、1回につきだいたい10~15秒位だったかと。粘着力が強い場合は、何回か試すとよいでしょう。 https://t.co/91oK1zPmgz
11-28 02:36

続きを読む

11/21のツイートまとめ

Revetronique

そういえば、ソニック君も撮ってきました。#セガフェス https://t.co/BBcbFD5agv
11-21 21:03

アイキャラのでしあな見られな…YouTubeから見られた!
11-21 20:08

いつの間にMMDが公開されていたので、(ツールの力をお借りして)Unity上で動かしてみました。今は単にUnityへと移しただけですが、もうちょっと工夫していろいろできるようにしたい...#アイキャラ #さやべぇ #ひななん https://t.co/QjTiwm8LSk
11-21 19:27

4DジェットコースターVR酔い注意なアトラクション!地上10㎝で悲鳴が聞こえたw楽しい体験でした(≧▽≦) #GearVR https://t.co/xSDVNapbTM
11-21 11:10

腕に心拍センサをつけて体験型エクササイズ!モーションはKinect2で検知。#VR https://t.co/krqVMISwtU
11-21 11:05

GALAXYの防水機能を利用した金魚すくいとお絵かき水族館!紙に描いてスキャンして投影されるのはよくあるけど、スマホに描いて、水につけると泳いでいく演出やストーリーにときめいた。#KITTE #VR https://t.co/swwDu079A5
11-21 11:01

先週末まで開催されていたVR体験、かなり良かった!まずは、カヤックとロードバイク。相方は安定のVR酔いw @KITTE #GearVR #GalaxyS7 https://t.co/MSgykRduw1
11-21 10:54

今年のミッドタウンイルミネーションも始まってた! https://t.co/ks1Xysvby9
11-21 10:45

今年のORFはこんな感じでした。ここからどう発展させるのか楽しみ。@六本木ミッドタウン https://t.co/md6VuxtMsE
11-21 10:43

11/20のツイートまとめ

Revetronique

夜のミクちゃんライブに行くよー! #セガフェス https://t.co/tpJb94lnV6
11-20 16:14

近々動かします(たぶん https://t.co/bKKj2lhuLv
11-20 02:25

これは、絶対聴かねば!! https://t.co/8VM0WaahMW
11-20 02:24

11/19のツイートまとめ

Revetronique

杜仲茶ダイエット #orf https://t.co/OjcAkyMDDg
11-19 14:58

UnityでOpenCV その2

どうもー、Reveです。
先月は全然ブログを更新できなかったので、今月はちょくちょく記事を上げていきたいですね。
とりあえずUnityでOpenCVの続きです。
目指せ月2桁更新!!

【前回のおさらい】
この記事を参照。
前回は、画像をグレースケールに変換する手法を書いてました。
・グレースケールのMatを用意
・テクスチャ素材をグレースケールにしてコピー


【二値化処理】
今回は、前の記事で行った処理を元に、「二値化処理」というのを施してみましょう。
この二値化処理とは、濃淡のある画像を、一つの閾値を境目に白と黒の階調、つまりモノクロ画像に置き換える処理のことです。大体、元の画像をいったんグレースケール(灰色で濃淡だけを表した画像)にしてからこの処理が施されます。
(参照)
http://ipr20.cs.ehime-u.ac.jp/column/gazo_syori/chapter4.html

さて、なぜ二値化処理をしてモノクロ画像を取得するのかというと、輪郭の抽出や文字の判定処理など後の画像処理が容易になるからです。処理する対象とそれ以外の部分を切り離すのに使われるオーソドックスな処理と言えるでしょう。
(この辺りは、電子回路のアナログとデジタルの話にも繋がる気がします。ちなみに、白黒をどちらにするかという話は正論理か負論理かと考えると、電子回路に詳しい方はわかりやすいかも)

この処理で重要なのは、やはり白黒を分ける閾値の設定で、
様々な研究が行われていろいろな手法が提案されてはいますが、OpenCVでは理論や数式を完璧には覚えてなくてもこれらの手法が使えるよう便利なメソッドが用意されています。

【二値化処理を試そう】
Unityプロジェクトは、前回の記事で作成したものを使います。
まず前回作ったシーンを開き、シーン内にあるGlayScaleというオブジェクトを複製して隣に移動させましょう。
その際は複製したオブジェクトを別名にするとよいでしょう。
(オブジェクトは「Ctrl + D」キーで複製すると便利です)
OpenCVUnity_binarythres1.png

そこで複製したオブジェクトにつけられたGlayScaleScript.csをいったんはずし、新しいC#スクリプトを作ります。
オブジェクトのインスペクタ(Inspector)のボタン「Add Component」で「BinaryThresholdScript」と名前を入力して、新しいスクリプトの生成画面に入るので、「C Sharp」スクリプトにして生成します。

続けて、スクリプトの編集に入ります。
スクリプトの中身は以下の通りです。

using UnityEngine;
using OpenCVForUnity;

public class BinaryThresholdScript : MonoBehaviour {

/// <summary>
/// リソースの読み込み先
/// </summary>
public string texturePath = "test001";

/// <summary>
/// 二値化の閾値
/// </summary>
[SerializeField, Range(0, 256)]
int ThresBinary = 128;

/// <summary>
/// 閾値処理の反転を行うかどうか
/// </summary>
[SerializeField]
bool binInv = false;

// 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 mat_proc = new Mat(origin.rows(), origin.cols(), CvType.CV_8UC1);
Imgproc.cvtColor(origin, mat_proc, Imgproc.COLOR_RGBA2GRAY);

//------------------(今回追加した処理)--------------------
//2値化処理(反転する場合は Imgproc.THRESH_BINARY_INVを使う)
if (ThresBinary < 0 || ThresBinary > 255)
{
//GaussianCによる適応的閾値処理
//adaptiveMethod: Imgproc.ADAPTIVE_THRESH_MEAN_C と分けて使う
//thresholdType: Imgproc.THRESH_BINARY と分けて使う
int type = (binInv) ? Imgproc.THRESH_BINARY_INV : Imgproc.THRESH_BINARY;
Imgproc.adaptiveThreshold(mat_proc, mat_proc, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, type, 201, 11);

//大津の手法による、単純2値化処理
//Imgproc.THRESH_OTSUを指定すると、thresの値に関係なく自動で閾値を設定する
//Imgproc.threshold(mat_proc, mat_proc, 0, 255, Imgproc.THRESH_BINARY_INV | Imgproc.THRESH_OTSU);
}
else
{
int type = (binInv) ? Imgproc.THRESH_BINARY_INV : Imgproc.THRESH_BINARY;
Imgproc.threshold(mat_proc, mat_proc, ThresBinary, 255, type);
}
//------------------(今回追加した処理)--------------------

//二値化処理したMatをテクスチャに変換
Texture2D texture_out = new Texture2D(mat_proc.cols(), mat_proc.rows(), TextureFormat.RGBA32, false);
Utils.matToTexture2D(mat_proc, texture_out);

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


御覧のように、前回のようなグレースケール化処理の後に二値化処理を加えていることがわかります。
今回の二値化処理をするには、Imgproc.thresholdメソッドを使います

//元画像(Mat):mat_procを使うとする

//2値化処理メソッド
//引数は、元画像(Mat)、出力先(Mat)、閾値(int)、濃淡の最大値(int)、オプション
//オプションは、値の反転、適応的閾値処理を使うかなどを指定
Imgproc.threshold(mat_proc, mat_proc, ThresBinary, 255, Imgproc.THRESH_BINARY);

//大津の手法による、単純2値化処理
//Imgproc.THRESH_OTSUを指定すると、thresの値に関係なく自動で閾値を設定する
//Imgproc.threshold(mat_proc, mat_proc, 0, 255, Imgproc.THRESH_BINARY_INV | Imgproc.THRESH_OTSU);

//2値化処理(反転する場合は Imgproc.THRESH_BINARY_INVを使う)
//Imgproc.threshold(mat_proc, mat_proc, ThresBinary, 255, Imgproc.THRESH_BINARY_INV);

//GaussianCによる適応的閾値処理
//引数は、元画像(Mat)、出力先(Mat)、濃淡の最大値(int)、適用する手法、オプション、ブロックサイズ(int)、定数(double)
//adaptiveMethod(適用する手法)): Imgproc.ADAPTIVE_THRESH_MEAN_C と分けて使う
//thresholdType(オプション): Imgproc.THRESH_BINARY_INV と分けて使う
//ブロックサイズは偶数だとエラー
//Imgproc.adaptiveThreshold(mat_proc, mat_proc, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 201, 11);

そして、実行してみると下の画像のように、処理前の画像と処理後(グレースケール化)の画像が並べられます。
インスペクタから「Thres Binary」のスライダーを調整すると、処理結果が変わります(実行前に設定すること)。
OpenCVUnity_binarythres2.png

また、勘の良い方ならお気づきかもしれませんが、今回作ったスクリプトは適応的閾値処理にも対応しています。
適応的閾値処理は簡単に言うと、画像のピクセルごとに明るいか暗いかを判別して、それぞれに適した閾値を取ることで抽出したい部分を綺麗に二値化する手法を指します。一定の閾値だと明るい部分や暗い部分などの差異を無視してしまい望ましい結果にならない場合も多いため、この手法が生まれました。

技術的な部分など詳細を知りたい方はこちらを参照。
(参照)
http://schima.hatenablog.com/entry/2013/10/19/085019

では、Unityのプロジェクトをもう一度操作します。
二値化処理用のオブジェクトをもう一つ複製して、今度はThresBinaryの値を最大(256)にしてみましょう。
オブジェクトを横に並べて、再びゲームを実行すると下のような結果になります。
OpenCVUnity_binarythres3.png

やはり手動で二値化を設定する場合と比べて、絵の輪郭がわかりやすくなっています。
ただ、こちらの手法も内部のパラメータ調整は必須なので、場合によっては単純な二値化でもよいかもしれません。
状況に応じて使い分けるとよいでしょう。

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

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

11/01のツイートまとめ

Revetronique

この間買ったVRFREEKという雑誌にmilboxtouchがオマケで付いてた #VR #milboxtouch https://t.co/vuB14Ju3kQ
11-01 17:05

10/31のツイートまとめ

Revetronique

数年前に秋月で買った録音再生ボイスキットを発掘、組立、録音、再生。以上。 https://t.co/F7t3FSISDP
10-31 00:41

昨日、IOT展に行ってみた。思ったよりデバイスが少なかった気がする。サーバーとか上位レイヤ側のシステムが重要と言うことなのかと。夢担当はAU未来研究所が楽しかったらしい。@幕張メッセ https://t.co/zUYCpyDZwu
10-31 00:38

秋葉原神社の手水舎は自動w巫女さん可愛くて癒されました(´∇`) https://t.co/RQ1i3YEr7e
10-31 00:30

草月流の生け花展はアートでした。VRとかと融合させたくなりました。@日本橋高島屋 https://t.co/u4TixywcJZ
10-31 00:24

プロフィール

Reveちゃん

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

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

リンクフリーです。

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

この人とブロともになる

QRコード
QR