15
15
import java .io .InputStream ;
16
16
import java .io .FileNotFoundException ;
17
17
18
+ import java .util .ArrayList ;
18
19
import java .util .List ;
19
20
import java .util .LinkedList ;
20
21
23
24
import org .opencv .android .BaseLoaderCallback ;
24
25
import org .opencv .android .LoaderCallbackInterface ;
25
26
27
+ import org .opencv .calib3d .Calib3d ;
26
28
import org .opencv .core .Mat ;
29
+ import org .opencv .core .MatOfDouble ;
27
30
import org .opencv .core .MatOfInt ;
28
31
import org .opencv .core .CvType ;
32
+ import org .opencv .core .MatOfPoint2f ;
33
+ import org .opencv .core .MatOfPoint3f ;
34
+ import org .opencv .core .Point ;
35
+ import org .opencv .core .Point3 ;
36
+ import org .opencv .core .Scalar ;
29
37
import org .opencv .imgproc .Imgproc ;
30
38
31
39
import org .opencv .aruco .Aruco ;
35
43
import mg .rivolink .app .aruco .utils .CameraParameters ;
36
44
37
45
public class ImageActivity extends Activity {
38
-
46
+
39
47
private static Mat cameraMatrix ;
40
48
private static Mat distCoeffs ;
41
-
49
+
42
50
private ImageView imageView ;
43
51
private Bitmap originalBMP ;
44
-
52
+
45
53
private final BaseLoaderCallback loaderCallback = new BaseLoaderCallback (this ){
46
- @ Override
47
- public void onManagerConnected (int status ){
54
+ @ Override
55
+ public void onManagerConnected (int status ){
48
56
if (status == LoaderCallbackInterface .SUCCESS ){
49
57
String message = "" ;
50
58
@@ -57,20 +65,20 @@ public void onManagerConnected(int status){
57
65
}
58
66
59
67
Toast .makeText (ImageActivity .this , message , Toast .LENGTH_SHORT ).show ();
60
- }
68
+ }
61
69
else {
62
70
super .onManagerConnected (status );
63
71
}
64
- }
65
- };
72
+ }
73
+ };
66
74
67
75
@ Override
68
76
protected void onCreate (Bundle savedInstanceState ) {
69
77
super .onCreate (savedInstanceState );
70
78
setContentView (R .layout .image_layout );
71
-
79
+
72
80
imageView = findViewById (R .id .image_view );
73
-
81
+
74
82
if (getIntent ().getData () != null ) try {
75
83
Uri uri =getIntent ().getData ();
76
84
InputStream is = getContentResolver ().openInputStream (uri );
@@ -84,53 +92,53 @@ protected void onCreate(Bundle savedInstanceState) {
84
92
@ Override
85
93
protected void onResume (){
86
94
super .onResume ();
87
-
95
+
88
96
if (OpenCVLoader .initDebug ())
89
97
loaderCallback .onManagerConnected (LoaderCallbackInterface .SUCCESS );
90
98
else
91
99
Toast .makeText (this , getString (R .string .error_native_lib ), Toast .LENGTH_LONG ).show ();
92
100
}
93
-
101
+
94
102
private boolean loadCameraParams (){
95
103
cameraMatrix = Mat .eye (3 , 3 , CvType .CV_64FC1 );
96
- distCoeffs = Mat .zeros (5 , 1 , CvType .CV_64FC1 );
104
+ distCoeffs = Mat .zeros (5 , 1 , CvType .CV_64FC1 );
97
105
return CameraParameters .tryLoad (this , cameraMatrix , distCoeffs );
98
106
}
99
-
107
+
100
108
private void detectMarkersAsync (){
101
109
new Thread (){
102
-
110
+
103
111
Bitmap bitmap ;
104
-
112
+
105
113
@ Override
106
114
public void run () {
107
115
bitmap = detectMarkers (originalBMP );
108
-
116
+
109
117
ImageActivity .this .runOnUiThread (new Runnable (){
110
118
@ Override
111
119
public void run () {
112
- if (bitmap != null )
113
- imageView .setImageBitmap (bitmap );
114
- else
115
- Toast .makeText (ImageActivity .this , getString (R .string .info_no_marker ), Toast .LENGTH_SHORT ).show ();
120
+ if (bitmap != null )
121
+ imageView .setImageBitmap (bitmap );
122
+ else
123
+ Toast .makeText (ImageActivity .this , getString (R .string .info_no_marker ), Toast .LENGTH_SHORT ).show ();
116
124
}
117
125
});
118
126
}
119
127
}.start ();
120
128
}
121
-
129
+
122
130
private static Bitmap detectMarkers (Bitmap original ){
123
131
Bitmap bitmap = null ;
124
-
132
+
125
133
Mat rgba = new Mat ();
126
134
Utils .bitmapToMat (original , rgba );
127
-
135
+
128
136
Mat rgb = new Mat ();
129
137
Imgproc .cvtColor (rgba , rgb , Imgproc .COLOR_RGBA2RGB );
130
-
138
+
131
139
Mat gray = new Mat ();
132
140
Imgproc .cvtColor (rgba , gray , Imgproc .COLOR_RGBA2GRAY );
133
-
141
+
134
142
MatOfInt ids = new MatOfInt ();
135
143
List <Mat > corners = new LinkedList <>();
136
144
Dictionary dictionary = Aruco .getPredefinedDictionary (Aruco .DICT_6X6_50 );
@@ -145,25 +153,51 @@ private static Bitmap detectMarkers(Bitmap original){
145
153
Mat tvecs = new Mat ();
146
154
147
155
Aruco .estimatePoseSingleMarkers (corners , 0.04f , cameraMatrix , distCoeffs , rvecs , tvecs );
156
+
157
+ List <Point3 > corners4 = new ArrayList <>(4 );
158
+ corners4 .add (new Point3 (-0.02f ,0.02f ,0 )); // Top-Left
159
+ corners4 .add (new Point3 (0.02f ,0.02f ,0 )); // Top-Right
160
+ corners4 .add (new Point3 (-0.02f ,-0.02f ,0 )); // Bottom-Left
161
+ corners4 .add (new Point3 (0.02f ,-0.02f ,0 )); // Bottom-Right
162
+
163
+ MatOfPoint3f mcorners = new MatOfPoint3f ();
164
+ mcorners .fromList (corners4 );
165
+
166
+ distCoeffs = new MatOfDouble (distCoeffs );
167
+
148
168
for (int i = 0 ; i < ids .toArray ().length ; i ++){
149
169
Aruco .drawAxis (rgb , cameraMatrix , distCoeffs , rvecs .row (i ), tvecs .row (i ), 0.02f );
170
+
171
+ MatOfPoint2f projected = new MatOfPoint2f ();
172
+ Calib3d .projectPoints (mcorners , rvecs .row (i ), tvecs .row (i ), cameraMatrix , (MatOfDouble )distCoeffs , projected );
173
+
174
+ Point [] points = projected .toArray ();
175
+ projected .release ();
176
+
177
+ if (points != null ){
178
+ for (Point point :points ){
179
+ Imgproc .circle (rgb , point , 10 , new Scalar (0 , 255 , 0 , 150 ), 4 );
180
+ }
181
+ }
150
182
}
151
-
183
+
184
+ mcorners .release ();
185
+
152
186
rvecs .release ();
153
187
tvecs .release ();
154
188
155
189
bitmap =Bitmap .createBitmap (rgb .width (), rgb .height (), Bitmap .Config .RGB_565 );
156
190
Utils .matToBitmap (rgb , bitmap );
157
191
}
158
-
192
+
159
193
rgba .release ();
160
194
rgb .release ();
161
195
gray .release ();
162
196
ids .release ();
163
-
197
+
164
198
corners .clear ();
165
199
166
200
return bitmap ;
167
201
}
168
-
202
+
169
203
}
0 commit comments