Recommended
PPTX
PDF
OpenCV/ARCore/Unityで作る塗り絵AR
PDF
OpenCVとARCoreで作るスタンプAR in 宮崎
PDF
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
PDF
PDF
はじめようARCore:自己位置推定・平面検出・FaceTracking
PDF
最新Mayaを使ったUnity 5向けキャラクターセットアップセミナー&使いこなしTips
PDF
PDF
PDF
【Unity】 Behavior TreeでAIを作る
PDF
Epic Online Services でできること
PDF
PDF
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
PDF
PPTX
OpenVRやOpenXRの基本的なことを調べてみた
PDF
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
PDF
フロー効率性とリソース効率性、再入門 #devlove #devkan
PDF
PDF
【出張ヒストリア2019】COLORSプロジェクトフォトグラメトリに挑戦してみた!
PDF
【Unite Tokyo 2018】トゥーンシェーダートークセッション#1『リアルタイムトゥーンシェーダー徹底トーク』
PPTX
HoloLens2とMeta QuestではじめるWebXR
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
PDF
Bloodstainedで世界のバッカーの期待に応えたUE4事例紹介
PDF
cvpaper.challenge 研究効率化 Tips
PDF
【Unity道場 建築スペシャル2】点群ビジュアライゼーション
PDF
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
PPTX
PDF
PDF
はじめようARCore: Motion Tracking & Image Tracking編
More Related Content
PPTX
PDF
OpenCV/ARCore/Unityで作る塗り絵AR
PDF
OpenCVとARCoreで作るスタンプAR in 宮崎
PDF
猫でも分かるUE4を使った VRコンテンツ開発 超入門編 2021
PDF
PDF
はじめようARCore:自己位置推定・平面検出・FaceTracking
PDF
最新Mayaを使ったUnity 5向けキャラクターセットアップセミナー&使いこなしTips
PDF
What's hot
PDF
PDF
【Unity】 Behavior TreeでAIを作る
PDF
Epic Online Services でできること
PDF
PDF
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
PDF
PPTX
OpenVRやOpenXRの基本的なことを調べてみた
PDF
ピクサー USD 入門 新たなコンテンツパイプラインを構築する
PDF
フロー効率性とリソース効率性、再入門 #devlove #devkan
PDF
PDF
【出張ヒストリア2019】COLORSプロジェクトフォトグラメトリに挑戦してみた!
PDF
【Unite Tokyo 2018】トゥーンシェーダートークセッション#1『リアルタイムトゥーンシェーダー徹底トーク』
PPTX
HoloLens2とMeta QuestではじめるWebXR
PPTX
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
PDF
Bloodstainedで世界のバッカーの期待に応えたUE4事例紹介
PDF
cvpaper.challenge 研究効率化 Tips
PDF
【Unity道場 建築スペシャル2】点群ビジュアライゼーション
PDF
UE4とBlenderでランニングコストを抑えるモダンなワークフロー
PPTX
Similar to OpenCVでつくろうARスタンプアプリ in 熊本
PDF
PDF
はじめようARCore: Motion Tracking & Image Tracking編
PDF
PDF
ARコンテンツ作成勉強会 in 宮崎: はじめようARCore
PDF
PDF
PDF
PDF
OpenCVとRGB-Dセンサで作ろう壁面タッチパネル
PDF
第19回SOIL水曜セミナー:RGB-DカメラでAR空間に入り込もう
PPTX
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
PDF
PPTX
[Netlify版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
PDF
PPTX
Unreal Engine でアプリ開発~ MRTK UXTools for Unreal V0.9.0 ~
PDF
HoloLensハンズオン:AirTap & SpatialMapping編
KEY
PPTX
【Unity道場スペシャル 2017博多】Unityと歩んだCC2アプリ開発の舞台裏
PPTX
AI x WebAR! MediaPipeの顔認識を使ってみよう!
PPTX
Introduction to AR Foundation
PPTX
AI x WebAR MediaPipeの顔認識を使ってみよう! in 織りなすラボ
More from Takashi Yoshinaga
PPTX
【準備編】OculusQuest/HoloLens2対応WebXR開発
PPTX
ARコンテンツ作成勉強会( #AR_Fukuoka )紹介
PPTX
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
PPTX
iPad LiDARでエンジニアカフェを3Dスキャン
PPTX
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
PPTX
PPTX
PPTX
【準備編!】HoloLens 2/Oculus Quest対応WebXRハンズオン
PPTX
Holo-SDKハンズオン:はじめようヘッドトラッキングを用いた3D表現
PPTX
FUKUOKA Engineers Day 2021 発表資料:AR Fukuoka & HoloBox紹介
PPTX
Voxon Photonics VX1で遊んでみた
PPTX
PPTX
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
PPTX
PPTX
PPTX
PPTX
iPad LiDARで作ってみた in AR Fukuoka 忘年会2020
PPTX
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
PPTX
OSC2020 Fukuoka: インストールいらず、WebAR入門
PPTX
Oculus Quest 1&2 開発のはじめの一歩 with A-Frame WebVR
Recently uploaded
PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #2
PPTX
楽々ナレッジベース「楽ナレ」3種比較 - Dify / AWS S3 Vector / Google File Search Tool
PDF
エンジニアが選ぶべきAIエディタ & Antigravity 活用例@ウェビナー「触ってみてどうだった?Google Antigravity 既存IDEと...
PDF
流行りに乗っかるClaris FileMaker 〜AI関連機能の紹介〜 by 合同会社イボルブ
PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #1
PDF
20251210_MultiDevinForEnterprise on Devin 1st Anniv Meetup
OpenCVでつくろうARスタンプアプリ in 熊本 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. OpenCV Plus Unity
画像処理ライブラリの定番としてお馴染みのOpenCVのUnity版
C#版のOpenCVSharpをベースにUnityに対応させたアセット
Windows/Mac/Android/iOSに対応。しかも無料!
11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 準備:まずは画面全体をキャプチャしてみる
//UIが張り付けられたCanvas
public GameObject canvas;
//プレビュー領域
public RawImage preview;
//キャプチャ領域を保持
UnityEngine.Rect capRect;
//キャプチャ画像を保持
Texture2D capTexture;
void Start () {
int w = Screen.width;
int h = Screen.height;
//原点(0,0)から画面の縦横の長さまでをキャプチャ領域とする
capRect = new UnityEngine.Rect(0, 0, w, h);
//画面サイズの空画像を作成
capTexture =
new Texture2D(w, h, TextureFormat.RGBA32, false);
//capTextureをプレビュー領域に貼り付け
preview.material.mainTexture = capTexture;
}
width
height
(0,0)
102. 画像処理用の関数
void Start () {
/*省略:前ページで記述した初期化*/
}
IEnumerator ImageProcessing()
{
canvas.SetActive(false);//Canvas上のUIを一時的に消す
yield return new WaitForEndOfFrame();//フレーム終了を待つ
capTexture.ReadPixels(capRect, 0, 0);//キャプチャ開始
capTexture.Apply();//各画素の色をテクスチャに反映
canvas.SetActive(true);//Canvas上のUIを再表示
}
public void StartCV()
{
StartCoroutine(ImageProcessing());//コルーチンの実行
}
ここに記述
103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 二値化
void CreateImages()
{
capTexture.ReadPixels(capRect, 0, 0);
capTexture.Apply();
//Texure2DをMatに変換
bgraMat = OpenCvSharp.Unity.TextureToMat(capTexture);
//カラー画像をグレースケール(濃淡)画像に変換
binMat = bgraMat.CvtColor(ColorConversionCodes.BGRA2GRAY);
//大津の方法で二値化。結果を白黒反転
binMat = binMat.Threshold(100, 255, ThresholdTypes.Otsu);
//あとで色を変えられるようにカラー(BGR)に変換
bgraMat = binMat.CvtColor(ColorConversionCodes.GRAY2BGRA);
}
bgraMat binMat(GrayScale) binMat (Binarized) bgraMat (B=G=R)
117. 118. 119. 120. 121. 122. 黒画素に色を付ける (1/2)
void SetColor(Texture2D texture)
{
//Matが初期化されていない場合は何もしない
if (bgraMat == null || binMat == null) { return; }
unsafe
{
//各Matのピクセル情報の配列(ポインタ)を取得
byte* bgraPtr = bgraMat.DataPointer;
byte* binPtr = binMat.DataPointer;
//全ピクセル数を算出
int pixelCount = binMat.Width * binMat.Height;
//各ピクセルを参照して黒画素なら色を塗る
for (int i = 0; i < pixelCount; i++)
{
}
}
OpenCvSharp.Unity.MatToTexture(bgraMat, texture);
}
後ほど処理を記述
123. 124. この次の作業
void SetColor(Texture2D texture)
{
//Matが初期化されていない場合は何もしない
if (bgraMat == null || binMat == null) { return; }
unsafe
{
//各Matのピクセル情報の配列(ポインタ)を取得
byte* bgraPtr = bgraMat.DataPointer;
byte* binPtr = binMat.DataPointer;
//全ピクセル数を算出
int pixelCount = binMat.Width * binMat.Height;
//各ピクセルを参照して黒画素なら色を塗る
for (int i = 0; i < pixelCount; i++)
{
}
}
OpenCvSharp.Unity.MatToTexture(bgraMat, texture);
}
これから処理を記述
125. 黒画素に色を付ける (2/2)
byte* bgraPtr = bgraMat.DataPointer;
byte* binPtr = binMat.DataPointer;
int pixelCount = binMat.Width * binMat.Height;
for (int i = 0; i < pixelCount; i++)
{
//白黒画像のi番目に相当するBGRAのデータの位置
int bgraPos = i * 4;
//白かったら無視(あとで透過させる)
if (binPtr[i] == 255)
{
}
//黒かったら色を塗る
else
{
bgraPtr[bgraPos] = 255; //B
bgraPtr[bgraPos+1] = 0; //G
bgraPtr[bgraPos+2] = 0; //R
}
}
126. 127. 色の配列を作成
//14色の色情報
byte[,] colors = { { 255, 255, 255 },{ 18, 0, 230 },
{ 0, 152, 243 }, { 0, 241, 255 }, { 31, 195, 143 },
{ 68, 153, 0 }, { 150, 158, 0 }, { 233, 160, 0 },
{ 183, 104, 0 }, { 136, 32, 29 }, { 131, 7, 146 },
{ 127, 0, 228 }, { 79, 0, 229 }, { 0, 0, 0 } };
//何番目の色かを表す変数 (colNo=0~13)
int colorNo = 0;
void Start()
{
int w = Screen.width;
int h = Screen.height;
/*資料のスペースの都合により省略*/
}
①color.txtからコピペ
②自分で書く
128. 黒画素の色の切り替え(1/3)
void SetColor(Texture2D texture)
{
//Matが初期化されていない場合は何もしない
if (bgraMat == null || binMat == null) { return; }
unsafe
{
//各Matのピクセル情報の配列(ポインタ)を取得
byte* bgraPtr = bgraMat.DataPointer;
byte* binPtr = binMat.DataPointer;
//全ピクセル数を算出
int pixelCount = binMat.Width * binMat.Height;
//各ピクセルをチェックして黒かったら色を付ける
for (int i = 0; i < pixelCount; i++)
{
}
}
OpenCvSharp.Unity.MatToTexture(bgraMat, texture);
}
ここで色を指定 (次のページで解説)
129. 黒画素の色の切り替え(2/3)
for (int i = 0; i < pixelCount; i++)
{
//白黒画像のi番目に相当するBGRAのデータの位置
int bgraPos = i * 4;
//白かったら無視(あとで透過にする)
if (binPtr[i] == 255)
{
}
//黒かったら色を付ける
else
{
bgraPtr[bgraPos] = colors[colorNo, 0]; //B
bgraPtr[bgraPos + 1] = colors[colorNo, 1]; //G
bgraPtr[bgraPos + 2] = colors[colorNo, 2]; //R
}
}
130. 黒画素の色の切り替え(3/3)
public void ChangeColor()
{
colorNo++;
colorNo %= 14; //またはcolors.Length / 3;
SetColor(capTexture);
}
//色を変更する関数
void SetColor(Texture2D texture)
{
//Matが初期化されていない場合は何もしない
if (bgraMat == null || binMat == null) { return; }
unsafe
{
//各Matのピクセル情報の配列(ポインタ)を取得
byte* bgraPtr = bgraMat.DataPointer;
byte* binPtr = binMat.DataPointer;
/*資料のスペースの都合により以下省略*/
131. 132. 133. 134. 135. 136. 137. 138. 白画素を透過させる(1/2)
void SetColor(Texture2D texture)
{
//Matが初期化されていない場合は何もしない
if (bgraMat == null || binMat == null) { return; }
unsafe
{
//各Matのピクセル情報の配列(ポインタ)を取得
byte* bgraPtr = bgraMat.DataPointer;
byte* binPtr = binMat.DataPointer;
//全ピクセル数を算出
int pixelCount = binMat.Width * binMat.Height;
//各ピクセルに対して透過/非透過の処理を行う
for (int i = 0; i < pixelCount; i++)
{
}
}
OpenCvSharp.Unity.MatToTexture(bgraMat, texture);
}
ここで色を指定 (次のページで解説)
139. 白画素を透過させる(2/2)
for (int i = 0; i < pixelCount; i++)
{
//白黒画像のi番目に相当するBGRAのデータの位置
int bgraPos = i * 4;
//白かったら透過
if (binPtr[i] == 255)
{
bgraPtr[bgraPos + 3] = 0;
}
//黒かったら非透過
else
{
bgraPtr[bgraPos] = colors[colorNo, 0]; //B
bgraPtr[bgraPos + 1] = colors[colorNo, 1]; //G
bgraPtr[bgraPos + 2] = colors[colorNo, 2]; //R
bgraPtr[bgraPos + 3] = 255;
}
}
140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. スタンプの実サイズを計算
//カメラの情報を取得
Camera cam = Camera.main;
//画面左下のxy座標を3次元に変換(0.6m手前に置くとする)
Vector3 v1 =
cam.ViewportToWorldPoint(new Vector3(0, 0, 0.6f));
//画面右上のxy座標を3次元に変換
Vector3 v2 =
cam.ViewportToWorldPoint(new Vector3(1, 1, 0.6f));
//画面左上のxy座標を3次元に変換
Vector3 v3 =
cam.ViewportToWorldPoint(new Vector3(0, 1, 0.6f));
//キャプチャ領域の実空間でのサイズを計算
float w = Vector3.Distance(v2, v3);
float h = Vector3.Distance(v1, v3);
/*次のページに続く*/
(0,0)
(1,1)
(0,1)
v1
v2
v3
153. 空間にスタンプを固定
/*前のページに記述したコードからの続き*/
GameObject stamp = GameObject.Instantiate(original);
//オブジェクトの生成とカメラに対する位置・向き・サイズを設定
stamp.transform.parent = cam.transform;
stamp.transform.localPosition = new Vector3(0, 0, 0.6f);
stamp.transform.localRotation = Quaternion.identity;
stamp.transform.localScale = new Vector3(w, h, 1);
//上記で作ったオブジェクトに貼るテクスチャを作成
Texture2D stampTexture =
new Texture2D(capTexture.width, capTexture.height);
//色を塗り、そのあとテクスチャとして貼り付ける
SetColor(stampTexture);
stamp.GetComponent<Renderer>().material.mainTexture
= stampTexture;
//スタンプの原点をカメラではなくワールドに変更
stamp.transform.parent = null;
preview.enabled = false;
154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164.