先来看下效果
静态图片中的ArUcon码识别
在之前程序的基础上再添加一个Button和TextView,点击“识别”按钮检测照片中的ArUco码后,在屏幕最下方显示识别到的ArUco的id和四个角点坐标,四个角点从左上角点开始顺时针计数。
还有些地方没有完善,不知道为什么识别过后颜色会变。因为还没有做校准、相机标定,所以红色的Z轴指向不正确。
private void detectArUco() {
Mat src = Imgcodecs.imread(imagePath);
Mat gray = new Mat();
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGRA2GRAY);
Dictionary dictionary = Aruco.getPredefinedDictionary(Aruco.DICT_4X4_50);
List<Mat> corners = new LinkedList<>();
corners.clear();
MatOfInt ids = new MatOfInt();
DetectorParameters parameters;
parameters = DetectorParameters.create();
Aruco.detectMarkers(gray, dictionary, corners, ids, parameters);
if (corners.size() > 0) {
double[] id = ids.get(0, 0);
double id0 = id[0];
String sid0 = Double.toString(id0);
Mat corner1 = corners.get(0);
double a[] = corner1.get(0,0);
double a0 = a[0];
double a1 = a[1];
String sa0 = Double.toString(a0);
String sa1 = Double.toString(a1);
double b[] = corner1.get(0, 1);
double b0 = b[0];
double b1 = b[1];
String sb0 = Double.toString(b0);
String sb1 = Double.toString(b1);
double c[] = corner1.get(0, 2);
double c0 = c[0];
double c1 = c[1];
String sc0 = Double.toString(c0);
String sc1 = Double.toString(c1);
double d[] = corner1.get(0, 3);
double d0 = d[0];
double d1 = d[1];
String sd0 = Double.toString(d0);
String sd1 = Double.toString(d1);
tv.setText(sid0 + "\n" + sa0 + ", " + sa1 + "\n" + sb0 + ", " + sb1 + "\n" + sc0 + ", " + sc1 + "\n" + sd0 + ", " + sd1 );
Aruco.drawDetectedMarkers(src, corners, ids);
Mat rvecs=new Mat();
Mat tvecs=new Mat();
Mat cameraMatrix = new Mat();
Mat distCoeffs = new Mat();
cameraMatrix = Mat.eye(3,3, CvType.CV_64FC1);
distCoeffs = Mat.zeros(5,1,CvType.CV_64FC1);
Aruco.estimatePoseSingleMarkers(corners, 0.04f, cameraMatrix, distCoeffs, rvecs, tvecs);
for(int i=0;i<ids.toArray().length;i++){
Aruco.drawAxis(src, cameraMatrix, distCoeffs, rvecs.row(i), tvecs.row(i), 0.02f);
}
}
Bitmap bp1 = BitmapFactory.decodeFile(imagePath);
Utils.matToBitmap(src, bp1);
ImageView iv = this.findViewById(R.id.sample_img);
iv.setImageBitmap(bp1);
gray.release();
src.release();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)