Submit Search
Upload
OpenCVで作るスタンプAR
•
0 likes
•
1,697 views
T
Takashi Yoshinaga
Follow
6/28にももち浜TECHカフェで開催したハンズオンの資料
Read less
Read more
Technology
Report
Share
Report
Share
1 of 163
Recommended
OpenCV/ARCore/Unityで作る塗り絵AR
OpenCV/ARCore/Unityで作る塗り絵AR
Takashi Yoshinaga
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
Takashi Yoshinaga
HoloLens2とMeta QuestではじめるWebXR
HoloLens2とMeta QuestではじめるWebXR
Takashi Yoshinaga
ARマーカーを利用したHoloLens同士の位置合わせ
ARマーカーを利用したHoloLens同士の位置合わせ
Takahiro Miyaura
AR-Frame x AR.js入門
AR-Frame x AR.js入門
Takashi Yoshinaga
はじめようARCore:自己位置推定・平面検出・FaceTracking
はじめようARCore:自己位置推定・平面検出・FaceTracking
Takashi Yoshinaga
UnityとVuforiaで始めるAR開発
UnityとVuforiaで始めるAR開発
Takashi Yoshinaga
MRTK-Unreal(UX Tools) を利用した HoloLens 2 アプリ開発 | UNREAL FEST EXTREME 2020 WINTER
MRTK-Unreal(UX Tools) を利用した HoloLens 2 アプリ開発 | UNREAL FEST EXTREME 2020 WINTER
エピック・ゲームズ・ジャパン Epic Games Japan
Recommended
OpenCV/ARCore/Unityで作る塗り絵AR
OpenCV/ARCore/Unityで作る塗り絵AR
Takashi Yoshinaga
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
A-Frameで始めるWebXRとハンドトラッキング (HoloLens2/Oculus Quest対応)
Takashi Yoshinaga
HoloLens2とMeta QuestではじめるWebXR
HoloLens2とMeta QuestではじめるWebXR
Takashi Yoshinaga
ARマーカーを利用したHoloLens同士の位置合わせ
ARマーカーを利用したHoloLens同士の位置合わせ
Takahiro Miyaura
AR-Frame x AR.js入門
AR-Frame x AR.js入門
Takashi Yoshinaga
はじめようARCore:自己位置推定・平面検出・FaceTracking
はじめようARCore:自己位置推定・平面検出・FaceTracking
Takashi Yoshinaga
UnityとVuforiaで始めるAR開発
UnityとVuforiaで始めるAR開発
Takashi Yoshinaga
MRTK-Unreal(UX Tools) を利用した HoloLens 2 アプリ開発 | UNREAL FEST EXTREME 2020 WINTER
MRTK-Unreal(UX Tools) を利用した HoloLens 2 アプリ開発 | UNREAL FEST EXTREME 2020 WINTER
エピック・ゲームズ・ジャパン Epic Games Japan
HoloLens2とPCで、WebRTCで映像をやりとり
HoloLens2とPCで、WebRTCで映像をやりとり
聡 大久保
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
Takashi Yoshinaga
【準備編】OculusQuest/HoloLens2対応WebXR開発
【準備編】OculusQuest/HoloLens2対応WebXR開発
Takashi Yoshinaga
Immersal を活用した AR クラウドなシステム開発とハンズオン!
Immersal を活用した AR クラウドなシステム開発とハンズオン!
NishoMatsusita
OpenCVでつくろうARスタンプアプリ in 熊本
OpenCVでつくろうARスタンプアプリ in 熊本
Takashi Yoshinaga
今改めて見る Plane finding
今改めて見る Plane finding
Takahiro Miyaura
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
聡 大久保
KinectでAR空間に入り込もう
KinectでAR空間に入り込もう
Takashi Yoshinaga
UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所
Takahiro Miyaura
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
Takashi Yoshinaga
ARコンテンツ作成勉強会:UnityとVuforiaではじめるAR [主要部分]
ARコンテンツ作成勉強会:UnityとVuforiaではじめるAR [主要部分]
Takashi Yoshinaga
Dockerを活用したリクルートグループ開発基盤の構築
Dockerを活用したリクルートグループ開発基盤の構築
Recruit Technologies
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
Takashi Yoshinaga
MagicOnion入門
MagicOnion入門
torisoup
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Unity Technologies Japan K.K.
Mixed Reality Toolkit 3 Recap
Mixed Reality Toolkit 3 Recap
Takahiro Miyaura
Web開発者が始める .NET MAUI Blazor App
Web開発者が始める .NET MAUI Blazor App
TomomitsuKusaba
【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現
Unity Technologies Japan K.K.
A-Frameで始めるOculus Quest対応WebVR
A-Frameで始めるOculus Quest対応WebVR
Takashi Yoshinaga
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
OpenCVとARCoreで作るスタンプAR in 宮崎
OpenCVとARCoreで作るスタンプAR in 宮崎
Takashi Yoshinaga
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
Takashi Yoshinaga
More Related Content
What's hot
HoloLens2とPCで、WebRTCで映像をやりとり
HoloLens2とPCで、WebRTCで映像をやりとり
聡 大久保
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
Takashi Yoshinaga
【準備編】OculusQuest/HoloLens2対応WebXR開発
【準備編】OculusQuest/HoloLens2対応WebXR開発
Takashi Yoshinaga
Immersal を活用した AR クラウドなシステム開発とハンズオン!
Immersal を活用した AR クラウドなシステム開発とハンズオン!
NishoMatsusita
OpenCVでつくろうARスタンプアプリ in 熊本
OpenCVでつくろうARスタンプアプリ in 熊本
Takashi Yoshinaga
今改めて見る Plane finding
今改めて見る Plane finding
Takahiro Miyaura
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
聡 大久保
KinectでAR空間に入り込もう
KinectでAR空間に入り込もう
Takashi Yoshinaga
UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所
Takahiro Miyaura
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
Takashi Yoshinaga
ARコンテンツ作成勉強会:UnityとVuforiaではじめるAR [主要部分]
ARコンテンツ作成勉強会:UnityとVuforiaではじめるAR [主要部分]
Takashi Yoshinaga
Dockerを活用したリクルートグループ開発基盤の構築
Dockerを活用したリクルートグループ開発基盤の構築
Recruit Technologies
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
Takashi Yoshinaga
MagicOnion入門
MagicOnion入門
torisoup
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Unity Technologies Japan K.K.
Mixed Reality Toolkit 3 Recap
Mixed Reality Toolkit 3 Recap
Takahiro Miyaura
Web開発者が始める .NET MAUI Blazor App
Web開発者が始める .NET MAUI Blazor App
TomomitsuKusaba
【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現
Unity Technologies Japan K.K.
A-Frameで始めるOculus Quest対応WebVR
A-Frameで始めるOculus Quest対応WebVR
Takashi Yoshinaga
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
祐司 伊藤
What's hot
(20)
HoloLens2とPCで、WebRTCで映像をやりとり
HoloLens2とPCで、WebRTCで映像をやりとり
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
MRTKで始めるAR開発 (HoloLens 1 and 2, ARCore, ARkit)
【準備編】OculusQuest/HoloLens2対応WebXR開発
【準備編】OculusQuest/HoloLens2対応WebXR開発
Immersal を活用した AR クラウドなシステム開発とハンズオン!
Immersal を活用した AR クラウドなシステム開発とハンズオン!
OpenCVでつくろうARスタンプアプリ in 熊本
OpenCVでつくろうARスタンプアプリ in 熊本
今改めて見る Plane finding
今改めて見る Plane finding
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
KinectでAR空間に入り込もう
KinectでAR空間に入り込もう
UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
AI x WebXR: フェイストラッキングを用いた擬似3D表現を解説!
ARコンテンツ作成勉強会:UnityとVuforiaではじめるAR [主要部分]
ARコンテンツ作成勉強会:UnityとVuforiaではじめるAR [主要部分]
Dockerを活用したリクルートグループ開発基盤の構築
Dockerを活用したリクルートグループ開発基盤の構築
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
AI x WebAR: MediaPipeのハンドトラッキングを使ってみよう
MagicOnion入門
MagicOnion入門
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
Mixed Reality Toolkit 3 Recap
Mixed Reality Toolkit 3 Recap
Web開発者が始める .NET MAUI Blazor App
Web開発者が始める .NET MAUI Blazor App
【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現
A-Frameで始めるOculus Quest対応WebVR
A-Frameで始めるOculus Quest対応WebVR
C++からWebRTC (DataChannel)を利用する
C++からWebRTC (DataChannel)を利用する
Similar to OpenCVで作るスタンプAR
OpenCVとARCoreで作るスタンプAR in 宮崎
OpenCVとARCoreで作るスタンプAR in 宮崎
Takashi Yoshinaga
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
Takashi Yoshinaga
Nreal Lightハンズオン
Nreal Lightハンズオン
Takashi Yoshinaga
ARコンテンツ作成勉強会 in 宮崎: はじめようARCore
ARコンテンツ作成勉強会 in 宮崎: はじめようARCore
Takashi Yoshinaga
AI x WebAR! MediaPipeの顔認識を使ってみよう!
AI x WebAR! MediaPipeの顔認識を使ってみよう!
Takashi Yoshinaga
ノンプログラミングで始める AR 開発入門
ノンプログラミングで始める AR 開発入門
Takashi Yoshinaga
Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!
Yamato Honda
AI x WebAR MediaPipeの顔認識を使ってみよう! in 織りなすラボ
AI x WebAR MediaPipeの顔認識を使ってみよう! in 織りなすラボ
Takashi Yoshinaga
オープンソースで始めるAR/VR開発
オープンソースで始めるAR/VR開発
Takashi Yoshinaga
はじめようArcore (修正版)
はじめようArcore (修正版)
Takashi Yoshinaga
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
Takuma Morikawa
VFXGraphでつくろう素敵なARエフェクト In QBSLab on 2020.01.25
VFXGraphでつくろう素敵なARエフェクト In QBSLab on 2020.01.25
Shunsuke Ishimoto
第19回SOIL水曜セミナー:RGB-DカメラでAR空間に入り込もう
第19回SOIL水曜セミナー:RGB-DカメラでAR空間に入り込もう
Takashi Yoshinaga
Vue.js で XSS
Vue.js で XSS
tobaru_yuta
ようこそ! Swift Playgroundsへ
ようこそ! Swift Playgroundsへ
KinkumaDesign
Canvas勉強会
Canvas勉強会
Tsutomu Kawamura
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
Takashi Yoshinaga
【ネイティブアドを支えるPhantomJS】
【ネイティブアドを支えるPhantomJS】
Kengo Shimada
FlutterをRenderObjectまで理解する
FlutterをRenderObjectまで理解する
KeisukeKiriyama
Open Campus 20170820
Open Campus 20170820
Akihiko Shirai
Similar to OpenCVで作るスタンプAR
(20)
OpenCVとARCoreで作るスタンプAR in 宮崎
OpenCVとARCoreで作るスタンプAR in 宮崎
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
AI x OpenCV x WebAR: Selfie Segmentationを使ってみよう
Nreal Lightハンズオン
Nreal Lightハンズオン
ARコンテンツ作成勉強会 in 宮崎: はじめようARCore
ARコンテンツ作成勉強会 in 宮崎: はじめようARCore
AI x WebAR! MediaPipeの顔認識を使ってみよう!
AI x WebAR! MediaPipeの顔認識を使ってみよう!
ノンプログラミングで始める AR 開発入門
ノンプログラミングで始める AR 開発入門
Unityのポストエフェクトで遊ぶ!
Unityのポストエフェクトで遊ぶ!
AI x WebAR MediaPipeの顔認識を使ってみよう! in 織りなすラボ
AI x WebAR MediaPipeの顔認識を使ってみよう! in 織りなすラボ
オープンソースで始めるAR/VR開発
オープンソースで始めるAR/VR開発
はじめようArcore (修正版)
はじめようArcore (修正版)
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
pairsでのAngularJS x TypeScript x e2e @めぐすた#1
VFXGraphでつくろう素敵なARエフェクト In QBSLab on 2020.01.25
VFXGraphでつくろう素敵なARエフェクト In QBSLab on 2020.01.25
第19回SOIL水曜セミナー:RGB-DカメラでAR空間に入り込もう
第19回SOIL水曜セミナー:RGB-DカメラでAR空間に入り込もう
Vue.js で XSS
Vue.js で XSS
ようこそ! Swift Playgroundsへ
ようこそ! Swift Playgroundsへ
Canvas勉強会
Canvas勉強会
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
HTMLを書くだけで誰でも簡単!A-FrameではじめるWeb AR/VR
【ネイティブアドを支えるPhantomJS】
【ネイティブアドを支えるPhantomJS】
FlutterをRenderObjectまで理解する
FlutterをRenderObjectまで理解する
Open Campus 20170820
Open Campus 20170820
More from Takashi Yoshinaga
ARコンテンツ作成勉強会( #AR_Fukuoka )紹介
ARコンテンツ作成勉強会( #AR_Fukuoka )紹介
Takashi Yoshinaga
iPad LiDARでエンジニアカフェを3Dスキャン
iPad LiDARでエンジニアカフェを3Dスキャン
Takashi Yoshinaga
Web技術ではじめようAR/VRアプリ開発
Web技術ではじめようAR/VRアプリ開発
Takashi Yoshinaga
MRTKをNreal Lightに対応させてみた
MRTKをNreal Lightに対応させてみた
Takashi Yoshinaga
【準備編!】HoloLens 2/Oculus Quest対応WebXRハンズオン
【準備編!】HoloLens 2/Oculus Quest対応WebXRハンズオン
Takashi Yoshinaga
Holo-SDKハンズオン:はじめようヘッドトラッキングを用いた3D表現
Holo-SDKハンズオン:はじめようヘッドトラッキングを用いた3D表現
Takashi Yoshinaga
FUKUOKA Engineers Day 2021 発表資料:AR Fukuoka & HoloBox紹介
FUKUOKA Engineers Day 2021 発表資料:AR Fukuoka & HoloBox紹介
Takashi Yoshinaga
Voxon Photonics VX1で遊んでみた
Voxon Photonics VX1で遊んでみた
Takashi Yoshinaga
コロナ禍中のコミュニティ活動
コロナ禍中のコミュニティ活動
Takashi Yoshinaga
Project HoloBox
Project HoloBox
Takashi Yoshinaga
AR Fukuoka紹介2020
AR Fukuoka紹介2020
Takashi Yoshinaga
iPad LiDARで作ってみた in AR Fukuoka 忘年会2020
iPad LiDARで作ってみた in AR Fukuoka 忘年会2020
Takashi Yoshinaga
OSC2020 Fukuoka: インストールいらず、WebAR入門
OSC2020 Fukuoka: インストールいらず、WebAR入門
Takashi Yoshinaga
Oculus Quest 1&2 開発のはじめの一歩 with A-Frame WebVR
Oculus Quest 1&2 開発のはじめの一歩 with A-Frame WebVR
Takashi Yoshinaga
Spatial Copy & Paste @HoloLensゆるっとLT会
Spatial Copy & Paste @HoloLensゆるっとLT会
Takashi Yoshinaga
エンジニアカフェ1周年イベント:WebAR/VR開発入門
エンジニアカフェ1周年イベント:WebAR/VR開発入門
Takashi Yoshinaga
ノンプログラミングで始めるAR (HoloLens 2 / ARCore / ARKit) 開発 with MRTK
ノンプログラミングで始めるAR (HoloLens 2 / ARCore / ARKit) 開発 with MRTK
Takashi Yoshinaga
[Netlify版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
[Netlify版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
Takashi Yoshinaga
[Glitch版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
[Glitch版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
Takashi Yoshinaga
More from Takashi Yoshinaga
(19)
ARコンテンツ作成勉強会( #AR_Fukuoka )紹介
ARコンテンツ作成勉強会( #AR_Fukuoka )紹介
iPad LiDARでエンジニアカフェを3Dスキャン
iPad LiDARでエンジニアカフェを3Dスキャン
Web技術ではじめようAR/VRアプリ開発
Web技術ではじめようAR/VRアプリ開発
MRTKをNreal Lightに対応させてみた
MRTKをNreal Lightに対応させてみた
【準備編!】HoloLens 2/Oculus Quest対応WebXRハンズオン
【準備編!】HoloLens 2/Oculus Quest対応WebXRハンズオン
Holo-SDKハンズオン:はじめようヘッドトラッキングを用いた3D表現
Holo-SDKハンズオン:はじめようヘッドトラッキングを用いた3D表現
FUKUOKA Engineers Day 2021 発表資料:AR Fukuoka & HoloBox紹介
FUKUOKA Engineers Day 2021 発表資料:AR Fukuoka & HoloBox紹介
Voxon Photonics VX1で遊んでみた
Voxon Photonics VX1で遊んでみた
コロナ禍中のコミュニティ活動
コロナ禍中のコミュニティ活動
Project HoloBox
Project HoloBox
AR Fukuoka紹介2020
AR Fukuoka紹介2020
iPad LiDARで作ってみた in AR Fukuoka 忘年会2020
iPad LiDARで作ってみた in AR Fukuoka 忘年会2020
OSC2020 Fukuoka: インストールいらず、WebAR入門
OSC2020 Fukuoka: インストールいらず、WebAR入門
Oculus Quest 1&2 開発のはじめの一歩 with A-Frame WebVR
Oculus Quest 1&2 開発のはじめの一歩 with A-Frame WebVR
Spatial Copy & Paste @HoloLensゆるっとLT会
Spatial Copy & Paste @HoloLensゆるっとLT会
エンジニアカフェ1周年イベント:WebAR/VR開発入門
エンジニアカフェ1周年イベント:WebAR/VR開発入門
ノンプログラミングで始めるAR (HoloLens 2 / ARCore / ARKit) 開発 with MRTK
ノンプログラミングで始めるAR (HoloLens 2 / ARCore / ARKit) 開発 with MRTK
[Netlify版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
[Netlify版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
[Glitch版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
[Glitch版] 0から始めようWebAR/VR入門ハンズオン with 織りなすラボ
OpenCVで作るスタンプAR
1.
OpenCVで作るARスタンプ ももち浜TECHカフェ
2.
自己紹介 氏名:吉永崇(Takashi Yoshinaga) 所属:九州先端科学技術研究所(ISIT) 専門:ARを用いた医療支援や運動計測 コミュニティ:ARコンテンツ作成勉強会 主催
3.
ARコンテンツ作成勉強会の紹介 2013年5月に勉強会をスタート ARコンテンツの作り方をハンズオン形式で学ぶ
人数は5~10名程度の少人数で実施 参加条件はAR/VRに興味がある人(知識不要) 各地で開催 (福岡、熊本、宮崎、長崎、大分、 鹿児島、山口、広島、関東)
4.
Twitterと勉強会ページで情報を発信しています #AR_Fukuoka Googleで「AR勉強会」で検索
5.
事前準備 ①演習用データ http://arfukuoka.lolipop.jp/stampar/Sample.zip ②ARCoreSDK(v1.8.0) https://github.com/google-ar/arcore-unity-sdk/releases/tag/v1.8.0 ③Unity2017.4.15f1 or later https://unity3d.com/jp/unity/qa/lts-releases?version=2017.4 ④Android
SDK https://developer.android.com/studio
6.
今日のゴール https://youtu.be/a8o1ieL01_w
7.
ARCore Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。 【主要機能】 (1) 自己位置推定 (Motion
Tracking) (2) 平面認識 (Environmental Understanding) (3) 明るさ推定 (Light Estimation) (4) マーカー認識 (Augmented Image) (5) 空間共有 (Cloud Anchor) (6) 顔認識 (Augmented Faces) (1) 自己位置推定 (Motion Tracking)
8.
OpenCV Plus Unity
画像処理ライブラリの定番としてお馴染みのOpenCVのUnity版 C#版のOpenCVSharpをベースにUnityに対応させたアセット Windows/Mac/Android/iOSに対応。しかも無料!
9.
処理手順 二値化 capture 色の変更 アルファ値 の追加 2D→3DGOAL!
10.
まずはUnityの操作の基本
11.
プロジェクトを作成 New
12.
プロジェクトを作成 最後にCreate Project プロジェクト名 保存場所
13.
Unityの操作画面(概要) ゲーム空間の設計画面
14.
ゲーム空間にCGを追加しよう ①右クリック ②3D Object ③Quad
15.
実行してみよう クリックして実行 クリックして終了 カメラから見た空間
16.
Scene(設計画面)の視点を変えよう [←] [→]で左右移動 [↑][↓]でズームイン/アウト [Alt]+ドラッグで回転 +ドラッグで上下左右
17.
オブジェクトの位置・向き・サイズを調整 クリックして選択 移動 回転 拡大・縮小
18.
数値を用いた位置・姿勢・サイズの指定 オブジェクトの詳細の確認・追加・変更 はInspectorで行う 例えば、TransformのPositionを 変更すると位置が変わる ②Positionを0
0 0に変更 ① Quad
19.
色情報の設定:テクスチャを指定 既存の3Dモデルにテクスチャ画像を貼り付けて見た目を変更
20.
色情報の設定:マテリアルの作成 ①Assets ②空白を右クリック
21.
色情報の設定:マテリアルの作成 ①Create ②Material
22.
色情報の設定:マテリアルの適用 ①Quadをクリック ②Materialsを開く ※▼をクリック
23.
色情報の設定:マテリアルの適用 ①NewMaterialに注目 ②MaterialsのElement0 にドラッグ&ドロップ
24.
色情報の設定:マテリアルの適用 ①Quadをクリック ②NewMaterialを開く ※▼をクリック
25.
色情報の設定:マテリアルの適用 ここをクリック
26.
色情報の設定:マテリアルの適用 ①Unlit ②Transparent
27.
色情報の設定:マテリアルの適用 Quadの詳細情報として テクスチャを登録する
28.
色情報の設定:画像のインポート ①Assets ②ImportNewAsset...
29.
色情報の設定:画像のインポート ①Sampleフォルダ ②logo.pngを選択 ③Import
30.
色情報の設定:テクスチャの貼り付け ①Quadをクリック
31.
色情報の設定:テクスチャの貼り付け ①logoに注目 ②テクスチャ指定領域に ドラッグ&ドロップ
32.
色情報の設定:テクスチャの貼り付け
33.
ポイント&アイディア 【ポイント】 3Dオブジェクトにテクスチャを貼るというマテリアルを一度設定して しまえば画像を差し替えるだけで見た目は変えられる。 【アイディア】 カメラから得られた画像の黒画素をスクリプトで操作して色を変更 カメラ画像の白画素を透明にした画像を作成
透過画像を貼り付けたQuadを空中に出現させる
34.
一旦、現状を保存 ①File ②Save Scene as...
35.
現状を保存:Sceneの保存 ①適当に名前を付ける (例:StampAR) ②保存 以降はCtrl/Command + Sで現状を保存
36.
ARCore SDKの導入 ①Assets ②Import Package ③Custom
Packageから下記を開く arcore-unity-sdk-v1.8.0.unitypackage
37.
ARCore SDKの導入 Import
38.
ARCore SDKの導入 GoogleARCoreが追加される
39.
AR用カメラの設定 Main Cameraを削除 ※右クリック→Delete
40.
AR用カメラの設定 Assets→GoogleARCore→Prefabs
41.
AR用カメラの設定 ①ARCore Device ②Hierarchyにドラッグ&ドロップ
42.
AR用カメラの設定 ①ARCore Device ②DefaultSessionConfig をダブルクリック
43.
AR用カメラの設定 Camera Focus ModeをAutoに変更
44.
オブジェクト表示位置の調整 Quadをクリック
45.
表示オブジェクトの設定 Position: 0, 0,
0.5 Scale: 全て0.1
46.
オブジェクト表示位置の調整 Quadをダブルクリック
47.
保存 Ctrl + S または Command
+ S
48.
ビルド設定 ①File ②Build Settings...
49.
ビルド設定 ①Android ②Switch Platform
50.
ビルド設定 ①Internal ②Player Settings
51.
ビルド設定 ①Resolution and Presentation ②Default
OrientationをPortraitに変更
52.
ビルド設定 ①Other Settings ②Multithreaded Renderingをオフ
53.
ビルド設定 ①PackageNameを設定 例)com.fukuoka.test ②Minimum API Level をAndrid
7.0に変更
54.
ARCoreの利用設定(Unity2018のみ) Allow unsafe Codeをオン
55.
ARCoreの利用設定 ①XR Settings ②ARCore Supportedをオン
56.
Ctrl/Command+Sで現状を保存
57.
実機インストール ①File ②Build & Run
58.
実機インストール ①インストーラ(.apk)の名前を付ける ②保存
59.
動作確認
60.
画像処理を始める準備
61.
OpenCV Plus Unityの導入 ①Window ②Asset
Store
62.
OpenCV Plus Unityの導入 OpenCV
Plusで検索
63.
OpenCV Plus Unityの導入 OpenCV
Plus Unityをクリック
64.
OpenCV Plus Unityの導入 ダウンロード
65.
OpenCV Plus Unityの導入 インポート
66.
OpenCV Plus Unityの導入 Import
67.
OpenCV Plus Unityの導入 OpenCV
+ Unity が追加されていればOK
68.
UnityEditorの画面設定 Game
69.
UnityEditorの画面設定 ①Free Aspectをクリック ②+をクリック
70.
UnityEditorの画面設定 ①名前を付ける ②800 × 1280
71.
UIのインポート ②Import Package ①Assets ③Custom Package...
72.
UIのインポート ②開く ①StampUI.unitypackage
73.
UIのインポート Import
74.
UIのインポート Scene
75.
UIのインポート ①Assets ②Canvasが追加 されていることを確認
76.
UIのインポート ①Canvas ②Hierarchyにドラッグ&ドロップ
77.
UIのインポート UIが追加されているはず
78.
UIのインポート ①Canvasをダブルクリック ②UIの全体が見える
79.
UIのインポート ①xやzをクリック ②UIを正面に向ける
80.
UIの役割 キャプチャ開始 色変更 空間に貼り付け キャプチャや画像処理 結果の可視化
81.
画像表示部分の設定 ①Canvasを開く ②Assetsを開く
82.
画像表示部分の設定 ①RawImage ②Materialに注目
83.
画像表示部分の設定 ①NewMaterialに注目 ②Materialに ドラッグ&ドロップ
84.
画像表示部分の設定 確認用の領域に透過画像を 表示できるようになった
85.
画像処理スクリプト記述の準備 空白を右クリック
86.
画像処理スクリプト記述の準備 Create Empty
87.
画像処理スクリプト記述の準備 ①Game Object ②Add Component
88.
画像処理スクリプト記述の準備 ①New Script ②スクリプト名を決める (例:StampScript) ③Create and
Add
89.
画像処理スクリプト記述の準備 ①Game Object ②StampScript が追加されていればOK
90.
画像処理スクリプト記述の準備 ダブルクリック
91.
OpenCV等のインポート using UnityEngine; using UnityEngine.UI; using
OpenCvSharp; using OpenCvSharp.Demo; public class StampScript : MonoBehaviour { // Start関数は初期化のために一度だけ実行される void Start () { cg = GameObject.Find ("Robot Kyle"); } // Update関数は毎フレーム実行される void Update () { } }
92.
canvas 変数の用意 //UIが張り付けられたCanvas public GameObject canvas; //プレビュー領域 public
RawImage preview; //キャプチャ領域を保持 UnityEngine.Rect capRect; //キャプチャ画像を保持 Texture2D capTexture; void Start () { } void Update () { } preview
93.
UIと変数の関連付け ①GameObjectをクリック ②CanvasとPreview が追加されていればOK
94.
UIと変数の関連付け Canvasに注目 StampScriptの Canvasにドラッグ&ドロップ
95.
UIと変数の関連付け RawImageに注目 StampScriptの Previewにドラッグ&ドロップ
96.
処理手順 二値化 capture 色の変更 アルファ値 の追加 2D→3DGOAL!
97.
処理手順 二値化 色の変更 アルファ値 の追加 2D→3DGOAL! capture
98.
準備:まずは画面全体をキャプチャしてみる //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)
99.
画像処理用の関数 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());//コルーチンの実行 } ここに記述
100.
StartCV()を呼び出す ①CaptureBtnをクリック ②Buttonを探す ③OnClick()の 下方にある+をクリック
101.
StartCV()を呼び出す GameObjectに注目 OnClick()内のNoneと 書かれた箇所にドラッグ&ドロップ
102.
StartCV()を呼び出す ①No Functionをクリック ②StampScript
103.
StartCV()を呼び出す StartCV()
104.
Build & Run!
105.
動作確認 キャプチャ画像が表示される Capture
106.
コードを整理(1/2) IEnumerator ImageProcessing() { canvas.SetActive(false); yield return
new WaitForEndOfFrame(); capTexture.ReadPixels(capRect, 0, 0); capTexture.Apply(); canvas.SetActive(true); } void CreateImages() { /*ここに画像生成コードを移す*/ } 画像の生成 このあと、画像生成のコードが増えるため関数にまとめて整理しておく
107.
コードを整理(2/2) このあと、画像生成のコードが増えるため関数にまとめて整理しておく IEnumerator ImageProcessing() { canvas.SetActive(false);//Canvas上のUIを一時的に消す yield return
new WaitForEndOfFrame(); CreateImages(); //画像の生成 canvas.SetActive(true);//Canvas上のUIを再表示 } void CreateImages() { capTexture.ReadPixels(capRect, 0, 0); capTexture.Apply(); }
108.
処理手順 二値化 色の変更 アルファ値 の追加 2D→3DGOAL! capture
109.
capture 処理手順 色の変更 アルファ値 の追加 2D→3DGOAL! 二値化
110.
ここからOpenCV!
111.
capture 処理手順 色の変更 アルファ値 の追加 2D→3DGOAL! 二値化
112.
グレースケール画像の二値化 0 255 0 255 0~255の輝度値を、ある値(しきい値)以上か未満かで分離することを二値化と呼ぶ。 画像処理すべき領域か否かをはっきり分けることができるため非常に重要なテクニック。
113.
OpenCVで画像を扱う準備 //スクショ領域を保持 UnityEngine.Rect capRect; //スクショ画像を保持 Texture2D capTexture; //OpenCVで扱う画像を保持 Mat
bgraMat, binMat; 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; }
114.
二値化 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)
115.
二値化結果の表示 IEnumerator ImageProcessing() { canvas.SetActive(false); yield return
new WaitForEndOfFrame(); CreateImages();//画像を生成 SetColor(capTexture);//テクスチャに色をセット canvas.SetActive(true); } //bgraMatが保持する色をテクスチャにセットする void SetColor(Texture2D texture) { OpenCvSharp.Unity.MatToTexture(bgraMat, texture); }
116.
動作確認 ①Capture ②二値化結果
117.
Matに関するメモリの開放 IEnumerator ImageProcessing() { canvas.SetActive(false); //Mat用に確保したメモリを解放 if (bgraMat
!= null) { bgraMat.Release(); } if (binMat != null) { binMat.Release(); } yield return new WaitForEndOfFrame(); CreateImages(); SetColor(capTexture); canvas.SetActive(true); }
118.
capture 処理手順 色の変更 アルファ値 の追加 2D→3DGOAL! 二値化
119.
capture 処理手順 アルファ値 の追加 2D→3DGOAL! 二値化 色の変更
120.
黒画素に色を付ける (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); } 後ほど処理を記述
121.
ポインタと各ピクセルの色情報 どちらの画像も左上から横方向スキャンし、それを全段で行った 場合の各画素の色情報を1次元配列に格納している。 binPtr(白黒画像)
: bgraPtr(カラー画像+アルファ): [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] ・・・ ・・・ binPtr bgraPtr 0th pixel 1st 2nd 全要素数 n (=width*height) 全要素数 n*4
122.
この次の作業 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.
黒画素に色を付ける (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 } }
124.
動作確認
125.
色の配列を作成 //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からコピペ ②自分で書く
126.
黒画素の色の切り替え(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); } ここで色を指定 (次のページで解説)
127.
黒画素の色の切り替え(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 } }
128.
黒画素の色の切り替え(3/3) public void ChangeColor() { colorNo++; colorNo
%= 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; /*資料のスペースの都合により以下省略*/
129.
ChangeColor()を呼び出す ①ColorBtnをクリック ②Buttonを探す ③OnClick()の 下方にある+をクリック
130.
ChangeColor()を呼び出す GameObjectに注目 OnClick()内のNoneと 書かれた箇所にドラッグ&ドロップ
131.
ChangeColor()を呼び出す ①No Functionをクリック ②StampScript
132.
ChangeColor()を呼び出す ChangeColor()
133.
動作確認 Capture Color Color
134.
capture 処理手順 アルファ値 の追加 2D→3DGOAL! 二値化 色の変更
135.
capture 処理手順 2D→3DGOAL! 二値化 色の変更 アルファ値 の追加
136.
白画素を透過させる(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); } ここで色を指定 (次のページで解説)
137.
白画素を透過させる(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; } }
138.
動作確認 ①Capture ②透過画像
139.
プレビュー表示の最大化 ①RawImage クリック
140.
プレビュー表示の最大化 全体を選択
141.
プレビュー表示の最大化 Left,Top,Right,Bottom をすべて0に変更
142.
プレビュー表示の最大化 RawImageをオフ
143.
プレビューの表示 IEnumerator ImageProcessing() { canvas.SetActive(false); //Mat用に確保したメモリを解放 if (bgraMat
!= null) { bgraMat.Release(); } if (binMat != null) { binMat.Release(); } yield return new WaitForEndOfFrame(); CreateImages(); SetColor(capTexture); canvas.SetActive(true); //プレビューを表示する preview.enabled = true; }
144.
動作確認 Capture
145.
capture 処理手順 2D→3DGOAL! 二値化 色の変更 アルファ値 の追加
146.
capture 処理手順 二値化 色の変更 アルファ値 の追加 2D→3DGOAL!
147.
テクスチャ付きのQuadをPrefab化 Quadをクリック ②QuadをAssetsに ドラッグ&ドロップ
148.
テクスチャ付きのQuadをPrefab化 Quadを削除
149.
空間にスタンプを固定 //スタンプのテンプレートオブジェクト(テクスチャ付きのQuad) public GameObject original; void
Start() { int w = Screen.width; int h = Screen.height; capRect = new UnityEngine.Rect(0, 0, w, h); capTexture = new Texture2D(w, h, TextureFormat.RGBA32, false); preview.material.mainTexture = capTexture; } //スタンプを空間に置くための関数 public void PutObject() { } 次のページからコードを記載
150.
スタンプの実サイズを計算 //カメラの情報を取得 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
151.
空間にスタンプを固定 /*前のページに記述したコードからの続き*/ 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;
152.
オブジェクトと変数の関連付け GameObject
153.
オブジェクトと変数の関連付け Quadに注目
154.
オブジェクトと変数の関連付け Originalにドラッグ&ドロップ
155.
PutObject()を呼び出す ①StampBtnをクリック ②Buttonを探す ③OnClick()の 下方にある+をクリック
156.
PutObject()を呼び出す GameObjectに注目 OnClick()内のNoneと 書かれた箇所にドラッグ&ドロップ
157.
PutObject()を呼び出す ①No Functionをクリック ②StampScript
158.
PutObject()を呼び出す PutObject()
159.
動作確認
160.
描画できるスタンプ数に制限を設ける //スタンプのテンプレートオブジェクト(テクスチャ付きのQuad) public GameObject original; //生成されたスタンプを覚えておくListを作成 List<GameObject>
stampList = new List<GameObject>(); void Start() { int w = Screen.width; int h = Screen.height; capRect = new UnityEngine.Rect(0, 0, w, h); capTexture = new Texture2D(w, h, TextureFormat.RGBA32, false); preview.material.mainTexture = capTexture; }
161.
描画できるスタンプ数に制限を設ける public void PutObject() { /*資料のスペースの都合により省略*/ stamp.transform.parent
= null; //以下、生成したスタンプの記録と削除 stampList.Add(stamp); if (stampList.Count == 10) { DestroyImmediate(stampList[0]. GetComponent<Renderer>().material.mainTexture); DestroyImmediate(stampList[0]); stampList.RemoveAt(0); } preview.enabled = false; }
162.
完成!