Skip to content

Commit 1e9b186

Browse files
committed
detecting marker corners
1 parent 36f932c commit 1e9b186

File tree

1 file changed

+64
-30
lines changed

1 file changed

+64
-30
lines changed

app/src/main/java/mg/rivolink/app/aruco/ImageActivity.java

Lines changed: 64 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.io.InputStream;
1616
import java.io.FileNotFoundException;
1717

18+
import java.util.ArrayList;
1819
import java.util.List;
1920
import java.util.LinkedList;
2021

@@ -23,9 +24,16 @@
2324
import org.opencv.android.BaseLoaderCallback;
2425
import org.opencv.android.LoaderCallbackInterface;
2526

27+
import org.opencv.calib3d.Calib3d;
2628
import org.opencv.core.Mat;
29+
import org.opencv.core.MatOfDouble;
2730
import org.opencv.core.MatOfInt;
2831
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;
2937
import org.opencv.imgproc.Imgproc;
3038

3139
import org.opencv.aruco.Aruco;
@@ -35,16 +43,16 @@
3543
import mg.rivolink.app.aruco.utils.CameraParameters;
3644

3745
public class ImageActivity extends Activity {
38-
46+
3947
private static Mat cameraMatrix;
4048
private static Mat distCoeffs;
41-
49+
4250
private ImageView imageView;
4351
private Bitmap originalBMP;
44-
52+
4553
private final BaseLoaderCallback loaderCallback = new BaseLoaderCallback(this){
46-
@Override
47-
public void onManagerConnected(int status){
54+
@Override
55+
public void onManagerConnected(int status){
4856
if(status == LoaderCallbackInterface.SUCCESS){
4957
String message = "";
5058

@@ -57,20 +65,20 @@ public void onManagerConnected(int status){
5765
}
5866

5967
Toast.makeText(ImageActivity.this, message, Toast.LENGTH_SHORT).show();
60-
}
68+
}
6169
else {
6270
super.onManagerConnected(status);
6371
}
64-
}
65-
};
72+
}
73+
};
6674

6775
@Override
6876
protected void onCreate(Bundle savedInstanceState) {
6977
super.onCreate(savedInstanceState);
7078
setContentView(R.layout.image_layout);
71-
79+
7280
imageView = findViewById(R.id.image_view);
73-
81+
7482
if(getIntent().getData() != null) try {
7583
Uri uri=getIntent().getData();
7684
InputStream is = getContentResolver().openInputStream(uri);
@@ -84,53 +92,53 @@ protected void onCreate(Bundle savedInstanceState) {
8492
@Override
8593
protected void onResume(){
8694
super.onResume();
87-
95+
8896
if(OpenCVLoader.initDebug())
8997
loaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
9098
else
9199
Toast.makeText(this, getString(R.string.error_native_lib), Toast.LENGTH_LONG).show();
92100
}
93-
101+
94102
private boolean loadCameraParams(){
95103
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);
97105
return CameraParameters.tryLoad(this, cameraMatrix, distCoeffs);
98106
}
99-
107+
100108
private void detectMarkersAsync(){
101109
new Thread(){
102-
110+
103111
Bitmap bitmap;
104-
112+
105113
@Override
106114
public void run() {
107115
bitmap = detectMarkers(originalBMP);
108-
116+
109117
ImageActivity.this.runOnUiThread(new Runnable(){
110118
@Override
111119
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();
116124
}
117125
});
118126
}
119127
}.start();
120128
}
121-
129+
122130
private static Bitmap detectMarkers(Bitmap original){
123131
Bitmap bitmap = null;
124-
132+
125133
Mat rgba = new Mat();
126134
Utils.bitmapToMat(original, rgba);
127-
135+
128136
Mat rgb = new Mat();
129137
Imgproc.cvtColor(rgba, rgb, Imgproc.COLOR_RGBA2RGB);
130-
138+
131139
Mat gray = new Mat();
132140
Imgproc.cvtColor(rgba, gray, Imgproc.COLOR_RGBA2GRAY);
133-
141+
134142
MatOfInt ids = new MatOfInt();
135143
List<Mat> corners = new LinkedList<>();
136144
Dictionary dictionary = Aruco.getPredefinedDictionary(Aruco.DICT_6X6_50);
@@ -145,25 +153,51 @@ private static Bitmap detectMarkers(Bitmap original){
145153
Mat tvecs = new Mat();
146154

147155
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+
148168
for(int i = 0; i < ids.toArray().length; i++){
149169
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+
}
150182
}
151-
183+
184+
mcorners.release();
185+
152186
rvecs.release();
153187
tvecs.release();
154188

155189
bitmap=Bitmap.createBitmap(rgb.width(), rgb.height(), Bitmap.Config.RGB_565);
156190
Utils.matToBitmap(rgb, bitmap);
157191
}
158-
192+
159193
rgba.release();
160194
rgb.release();
161195
gray.release();
162196
ids.release();
163-
197+
164198
corners.clear();
165199

166200
return bitmap;
167201
}
168-
202+
169203
}

0 commit comments

Comments
 (0)