質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

5021閲覧

OpenCV for UnityでwebCamTextureToMatできない

toofu__

総合スコア13

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/05/01 13:24

OpenCV for Unityを使ってウェブカメラの画像をいじろうとしているのですが、WebCamTextureをMatに変換しようとするときに出るエラーが解決できずにいます。

利用環境

Unity 5.3
OpenCV for Unity 2.0.1 (OpenCV 3.1.0)


unity

1void Start() { 2 webCamTexture = new WebCamTexutre(WebCamTexture.devices[0].name, width, height); 3 webCamTexture.Play(); 4 5 rgbaMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC4); 6 colors = new Color32[webCamTexture.width * webCamTexture.height]; 7 texture = new Texture2D(webCamTexture.width, webCamTexture.height); 8 9 GetComponent<Renderer> ().material.mainTexture = texture; 10} 11 12void Update() { 13 Utils.webCamTextureToMat(webCamTexture, rgbaMat, colors); //ここでエラーが出る 14 15 // 以下Mat処理 16}

ここで下記のエラーが出て先に進めず困っています。

ArgumentException: The output Mat object has to be of the same size

どなたか原因や対処法ご存知でしたらご教示いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

Unityのバグなのか何なのか定かではありませんが、WebCamTexture.didUpdateThisFrame == false の状態で WebCamTexture.widthWebCamTexture.heightの値を取得しようとするとなぜか(16, 16)で出力されてしまうことが原因でした。その結果rgbaMatのsizeが(16, 16)になっていました。

実際のWebCamTexture.widthWebCamTexture.heightの値は宣言時の値のままなので、rgbaMatとの間にサイズの違いが生じてしまっていたようです。

そのため、WebCamTexture.didUpdateThisFrame == trueになるまでrgbaMatの宣言を待ちつつ、Utils.webCamTextureToMat(webCamTexture, rgbaMat, colors);はrgbaMatが宣言されるまで実行しないよう、下記のような記述にしました。

参考:https://issuetracker.unity3d.com/issues/ios-webcamtexture-dot-width-slash-height-always-returns-16

Unity

1void Start() { 2 webCamTexture = new WebCamTexutre(WebCamTexture.devices[0].name, width, height); 3 webCamTexture.Play(); 4 StartCoroutine (init ()); 5} 6 7private IEnumerator init (){ 8 if(webCamTexture.width <= 16){ 9 while(!webCamTexture.didUpdateThisFrame){ 10 yield return new WaitForEndOfFrame(); 11 } 12 webCamTexture.Pause (); 13 colors = webCamTexture.GetPixels32 (); 14 webCamTexture.Stop (); 15 16 yield return new WaitForEndOfFrame (); 17 webCamTexture.Play(); 18 19 // 宣言 20 texture = new Texture2D(webCamTexture.width, webCamTexture.height); 21 rgbaMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC4); 22 23 GetComponent<Renderer> ().material.mainTexture = texture; 24 } 25} 26 27void Update() { 28 if (webCamTexture.didUpdateThisFrame && rgbaMat != null) { 29 Utils.webCamTextureToMat (webCamTexture, rgbaMat, colors); 30 31 // 以下Mat処理 32 } 33}

上手い書き方じゃない感がすごいので、スマートな書き方募集中。。

投稿2016/05/05 06:20

toofu__

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toofu__

2016/05/05 06:26

ちなみに参考URLではiOSへのビルドに限って起こるバグと書かれていますが、自分の場合はそれ以外のプラットフォームにswitchしても生じたので、そこのところは謎です。
guest

0

こんにちは。

ソースを拝見するかぎり正しいように思えます。
1点webCamTextureToMatの説明で気になる記述があります。

The output Mat object has to be of the same size as the input WebCamTexture'(width * height).

です。サイズをwidth * heightで指定するような記述になっています。
そこで、Matの数あるコンストラクタの内、Mat(Size _size, int _type);を用いて

rgbaMat = new Mat(webCamTexture.height * webCamTexture.width, CvType.CV_8UC4);

にてコンストラクトしてみると、もしかして通らないでしょうか?

投稿2016/05/05 01:20

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toofu__

2016/05/05 06:20

コメントありがとうございます。 アドバイスいただいた方法ではないのですが、試していて一応解決したので、自己解決欄に方法記載しました。 お知恵頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問