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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

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

Unity

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

Q&A

1回答

1770閲覧

マーカー上にオブジェクトの描画をしたい。

himel

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

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

Unity

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

0グッド

0クリップ

投稿2021/12/13 13:11

編集2021/12/14 05:48

UnityとOpencvを用いてARUCOマーカー上にcudeを出現させたいのですが、どうやってできるでしょうか?
RawImageをつかってそこにカメラ画像を写してやっています。

using UnityEngine; using OpenCvSharp; using OpenCvSharp.Aruco; using UnityEngine.UI; using System.Collections.Generic; using System.Linq; public class AR1 : MonoBehaviour { [SerializeField] private RawImage _renderer; private int _width = 1920; private int _height = 1080; private int _fps = 30; private WebCamTexture _webcamTexture; private const PredefinedDictionaryName dictName = PredefinedDictionaryName.Dict6X6_250; private Dictionary ar_dict; private DetectorParameters detect_param; private Vector3 center1; private Vector3 t; public GameObject cude; private void Start() { WebCamDevice[] devices = WebCamTexture.devices; _webcamTexture = new WebCamTexture(devices[0].name, this._width, this._height, this._fps); _webcamTexture.Play(); } void OnDestroy() { if (_webcamTexture != null) { if (_webcamTexture.isPlaying) _webcamTexture.Stop(); _webcamTexture = null; } } private void Update() => Armaker(_webcamTexture); private void Armaker(WebCamTexture tex) { ar_dict = CvAruco.GetPredefinedDictionary(dictName); detect_param = DetectorParameters.Create(); Mat cam_frame = OpenCvSharp.Unity.TextureToMat(tex); Point2f[][] corners; //ARマーカのカドの座標 int[] ids; //検出されたARマーカのID Point2f[][] reject_Points; Mat grayMat = new Mat(); Cv2.CvtColor(cam_frame, grayMat, ColorConversionCodes.BGR2GRAY); CvAruco.DetectMarkers(cam_frame, grayMat, ar_dict, out corners, out ids, detect_param, out reject_Points); if (ids.Length != 0) { List<Point2f> midllePoints = new List<Point2f>(); List<Point2f> center = new List<Point2f>(); CvAruco.DrawDetectedMarkers(cam_frame, corners, ids, new Scalar(0, 255, 0)); var markers = Enumerable.Zip(ids, corners, (i, c) => new { i, c }) .ToDictionary(x => x.i, x => x.c) .OrderBy(i => i.Key); int cnt = 0; foreach (var marker in markers) { var average_X = marker.Value.Average(p => p.X); var average_Y = marker.Value.Average(p => p.Y); // マーカーの中心座標を取得 midllePoints.Add(new Point2f(average_X, average_Y)); cnt++; } int cnt1 = 0; foreach (var t in midllePoints) { var average1_X = midllePoints[0].X + (midllePoints[1].X - midllePoints[0].X) / 2; var average1_Y = midllePoints[0].Y + (midllePoints[1].Y - midllePoints[0].Y) / 2; center.Add(new Point2f(average1_X, average1_Y)); cnt1++; } // マーカーの中心座標を描画 midllePoints.ForEach(mp => cam_frame.Circle( (int)mp.X, (int)mp.Y, 1, new Scalar(0, 0, 255), 3, LineTypes.AntiAlias)); // マーカー間の中心点を描画 center.ForEach(tc => cam_frame.Circle( (int)tc.X, (int)tc.Y, 1, new Scalar(0, 255, 255), 5, LineTypes.AntiAlias)); foreach (var c in center) { t = new Vector3(center[0].X, center[0].Y, 0); cude.transform.position = t; } } _renderer.texture = OpenCvSharp.Unity.MatToTexture(cam_frame); } }

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

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

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

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

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

guest

回答1

0

個々の要素の具体的な手段とかは知らないが,以下の要素が必要ではないか?というのを列挙してみる.

  1. 撮影に用いるカメラの内部パラメータの把握作業

(必要精度はともかく射影具合を知る必要はある.かなり雑で良いなら画角くらいか?)
2. 撮影画像データを得る手段
3. 撮影画像に写るマーカを認識する手段.
(単に画像上での位置がわかればよいのではなく,3次元的な位置と姿勢が推定される必要がある.)
4. 3D映像生成手段側でのカメラの射影具合(設定としては画角くらいかな?)は上記1.の撮影に用いるカメラと合わせた状態とする設定作業
5. 上記3.で推定された位置姿勢に基づき cube を描画する3D映像生成処理実装


上記項目群を,個別に検討できそうなグループに分けるとしたら,以下のような感じかな?
(全部揃ったら,それらを組み合わせれば所望のプログラムになると思う)

  • 1

これは自分が使っているカメラの画角等をどうやって知るか?という話.
カタログスペックを使う? ガチでキャリブレーションする? etc?

  • 2 と 3

「カメラ撮影画像からマーカを認識する」というだけのプログラムを一度作ってみると良いかと.

  • 4 と 5

3次元空間の所望の位置に所望の姿勢で cube を描画する というだけのプログラムも作ってみると良いかと.

投稿2021/12/14 02:01

fana

総合スコア11996

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

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

fana

2021/12/14 02:15

OpenCVでのマーカ認識に関しては「OpenCV ARUCO」とかでググればいろいろと見つかる感なので, マーカ自体の位置姿勢を推定しているようなのを探すと良いかと. (仮にそういうのが全く存在しない場合は,マーカ上の特徴点座標から推定すればよいかと.)
himel

2021/12/14 05:56

コメントありがとうございます。 自分は上記のソースコードのようにやりたいと考えています。 マーカー間の中心点にcudeを置きたいです。このソースコードを実行したところカメラ画像(RowImage)には反映されていない状態です。インスペクターを見るとcudeの位置の数字が変わっていることからRawImageの裏側で動いてそうです。cudeをカメラ画像に反映するにはどうしたらよいかご教授していただけると助かります。
fana

2021/12/14 06:05

あなたが使っている物を使った経験があるわけではないので > 個々の要素の具体的な手段とかは知らない のです. 具体実装の話が必要なのであれば,識者の登場を待ってください.Sorry.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問