teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

誤字を治した

2021/12/14 05:48

投稿

himel
himel

スコア0

title CHANGED
File without changes
body CHANGED
@@ -93,8 +93,6 @@
93
93
  // マーカーの中心座標を取得
94
94
  midllePoints.Add(new Point2f(average_X, average_Y));
95
95
 
96
-
97
-
98
96
  cnt++;
99
97
 
100
98
  }
@@ -106,8 +104,7 @@
106
104
 
107
105
  var average1_X = midllePoints[0].X + (midllePoints[1].X - midllePoints[0].X) / 2;
108
106
  var average1_Y = midllePoints[0].Y + (midllePoints[1].Y - midllePoints[0].Y) / 2;
109
- // var average1_Z = 0;
107
+
110
-
111
108
  center.Add(new Point2f(average1_X, average1_Y));
112
109
 
113
110
  cnt1++;

1

ソースコードを追加した

2021/12/14 05:48

投稿

himel
himel

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,2 +1,140 @@
1
1
  UnityとOpencvを用いてARUCOマーカー上にcudeを出現させたいのですが、どうやってできるでしょうか?
2
- RawImageをつかってそこにカメラ画像を写してやっています。
2
+ RawImageをつかってそこにカメラ画像を写してやっています。
3
+
4
+
5
+
6
+ ```ここに言語を入力
7
+ using UnityEngine;
8
+ using OpenCvSharp;
9
+ using OpenCvSharp.Aruco;
10
+ using UnityEngine.UI;
11
+ using System.Collections.Generic;
12
+ using System.Linq;
13
+
14
+ public class AR1 : MonoBehaviour
15
+ {
16
+
17
+ [SerializeField] private RawImage _renderer;
18
+
19
+ private int _width = 1920;
20
+ private int _height = 1080;
21
+ private int _fps = 30;
22
+ private WebCamTexture _webcamTexture;
23
+
24
+ private const PredefinedDictionaryName dictName = PredefinedDictionaryName.Dict6X6_250;
25
+ private Dictionary ar_dict;
26
+ private DetectorParameters detect_param;
27
+ private Vector3 center1;
28
+ private Vector3 t;
29
+ public GameObject cude;
30
+
31
+
32
+ private void Start()
33
+ {
34
+ WebCamDevice[] devices = WebCamTexture.devices;
35
+ _webcamTexture = new WebCamTexture(devices[0].name, this._width, this._height, this._fps);
36
+ _webcamTexture.Play();
37
+
38
+
39
+ }
40
+
41
+
42
+ void OnDestroy()
43
+ {
44
+ if (_webcamTexture != null)
45
+ {
46
+ if (_webcamTexture.isPlaying) _webcamTexture.Stop();
47
+ _webcamTexture = null;
48
+ }
49
+ }
50
+
51
+ private void Update()
52
+ => Armaker(_webcamTexture);
53
+
54
+ private void Armaker(WebCamTexture tex)
55
+ {
56
+
57
+ ar_dict = CvAruco.GetPredefinedDictionary(dictName);
58
+ detect_param = DetectorParameters.Create();
59
+ Mat cam_frame = OpenCvSharp.Unity.TextureToMat(tex);
60
+
61
+
62
+ Point2f[][] corners; //ARマーカのカドの座標
63
+ int[] ids; //検出されたARマーカのID
64
+ Point2f[][] reject_Points;
65
+
66
+ Mat grayMat = new Mat();
67
+
68
+ Cv2.CvtColor(cam_frame, grayMat, ColorConversionCodes.BGR2GRAY);
69
+
70
+ CvAruco.DetectMarkers(cam_frame, grayMat, ar_dict, out corners, out ids, detect_param, out reject_Points);
71
+
72
+ if (ids.Length != 0)
73
+ {
74
+
75
+ List<Point2f> midllePoints = new List<Point2f>();
76
+ List<Point2f> center = new List<Point2f>();
77
+
78
+
79
+ CvAruco.DrawDetectedMarkers(cam_frame, corners, ids, new Scalar(0, 255, 0));
80
+
81
+ var markers = Enumerable.Zip(ids, corners, (i, c) => new { i, c })
82
+ .ToDictionary(x => x.i, x => x.c)
83
+ .OrderBy(i => i.Key);
84
+
85
+
86
+ int cnt = 0;
87
+ foreach (var marker in markers)
88
+ {
89
+ var average_X = marker.Value.Average(p => p.X);
90
+ var average_Y = marker.Value.Average(p => p.Y);
91
+
92
+
93
+ // マーカーの中心座標を取得
94
+ midllePoints.Add(new Point2f(average_X, average_Y));
95
+
96
+
97
+
98
+ cnt++;
99
+
100
+ }
101
+
102
+
103
+ int cnt1 = 0;
104
+ foreach (var t in midllePoints)
105
+ {
106
+
107
+ var average1_X = midllePoints[0].X + (midllePoints[1].X - midllePoints[0].X) / 2;
108
+ var average1_Y = midllePoints[0].Y + (midllePoints[1].Y - midllePoints[0].Y) / 2;
109
+ // var average1_Z = 0;
110
+
111
+ center.Add(new Point2f(average1_X, average1_Y));
112
+
113
+ cnt1++;
114
+
115
+ }
116
+
117
+
118
+
119
+ // マーカーの中心座標を描画
120
+ midllePoints.ForEach(mp => cam_frame.Circle(
121
+ (int)mp.X, (int)mp.Y, 1, new Scalar(0, 0, 255), 3, LineTypes.AntiAlias));
122
+
123
+ // マーカー間の中心点を描画
124
+ center.ForEach(tc => cam_frame.Circle(
125
+ (int)tc.X, (int)tc.Y, 1, new Scalar(0, 255, 255), 5, LineTypes.AntiAlias));
126
+
127
+
128
+ foreach (var c in center)
129
+ {
130
+ t = new Vector3(center[0].X, center[0].Y, 0);
131
+
132
+ cude.transform.position = t;
133
+ }
134
+
135
+ }
136
+ _renderer.texture = OpenCvSharp.Unity.MatToTexture(cam_frame);
137
+
138
+ }
139
+ }
140
+ ```