- Marker检测采用小觅相机,可以实时检测Marker的位置和姿态,效果如下:
参考代码如下:
1 #include "pch.h" 2 3 #include <Eigen/Dense> 4 #include <opencv2/core.hpp> 5 #include <opencv2\highgui.hpp> 6 #include <opencv2\aruco.hpp> 7 #include <opencv2\aruco\dictionary.hpp> 8 #include <opencv2/calib3d.hpp> 9 #include <opencv2/core/eigen.hpp> 10 #include <opencv2/opencv.hpp> 11 12 #include <mynteyed/camera.h> 13 #include <mynteyed/utils.h> 14 15 #include <vector> 16 #include <iostream> 17 #include <Windows.h> 18 #include <fstream> 19 20 using namespace std; 21 using namespace cv; 22 using namespace Eigen; 23 using namespace aruco; 24 25 26 int main(int argc, char *argv[]) { 27 mynteyed::Camera cam; 28 mynteyed::DeviceInfo dev_info; 29 if (!mynteyed::util::select(cam, &dev_info)) { 30 return 1; 31 } 32 mynteyed::util::print_stream_infos(cam, dev_info.index); 33 34 std::cout << "Open device: " << dev_info.index << ", " 35 << dev_info.name << std::endl << std::endl; 36 //设置相机的参数 37 mynteyed::OpenParams params(dev_info.index); 38 //params.depth_mode = mynteyed::DepthMode::DEPTH_GRAY; 39 //params.stream_mode = mynteyed::StreamMode:: 40 params.stream_mode = mynteyed::StreamMode::STREAM_2560x720; 41 params.color_mode = mynteyed::ColorMode::COLOR_RECTIFIED; 42 //params.ir_intensity = 4; 43 params.framerate = 30; 44 45 cam.Open(params); 46 47 48 49 Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(aruco::DICT_6X6_250); 50 Mat out; 51 dictionary->drawMarker(100, 600, out, 5); 52 53 Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create(); 54 55 56 for (;;) { 57 auto Left_color = cam.GetStreamData(mynteyed::ImageType::IMAGE_LEFT_COLOR); 58 if (Left_color.img) 59 { 60 Mat image = Left_color.img->To(mynteyed::ImageFormat::COLOR_BGR)->ToMat(); 61 Mat imageCopy; 62 //相机内参矩阵 63 const Mat intrinsic_matrix = (Mat_<float>(3, 3) 64 << 713.12554931640625000, 0.0, 634.99163818359375000, 0.0, 65 714.41278076171875000, 363.88098144531250000, 0.0, 0.0, 1.0); 66 67 //畸变校正 68 const Mat arucodistCoeffs = (Mat_<float>(1, 5) << -0.29668807983398438, 0.07767868041992188, 69 0.00000000000000000, -0.00012969970703125, 70 0.00000000000000000); 71 vector< int > ids; 72 vector< vector< Point2f > > corners, rejected; 73 vector< Vec3d > rvecs, tvecs; 74 Mat R; 75 MatrixXd M(4, 4); 76 // detect markers and estimate pose 77 detectMarkers(image, dictionary, corners, ids, detectorParams, rejected);//rejected拒绝的矩形区域 78 image.copyTo(imageCopy); 79 if (ids.size() > 0) 80 { 81 drawDetectedMarkers(imageCopy, corners, ids); 82 std::vector <cv::Vec3d> rvecs,tvecs; 83 estimatePoseSingleMarkers(corners,0.05, intrinsic_matrix, arucodistCoeffs, rvecs, tvecs); 84 //0.05为Marker的大小 85 Rodrigues(rvecs[0], R, noArray());//罗德里格斯变换将旋转矩阵变为旋转向量 86 MatrixXd r(3, 3); 87 VectorXd t(3); 88 VectorXd T_mm(3); 89 cv2eigen(R, r); 90 cv2eigen(tvecs[0], t); 91 cv2eigen(tvecs[0], T_mm); 92 T_mm = T_mm * 1000; 93 M(0, 0) = r(0, 0); M(0, 1) = r(0, 1); M(0, 2) = r(0, 2); M(0, 3) = t(0, 0); 94 M(1, 0) = r(1, 0); M(1, 1) = r(1, 1); M(1, 2) = r(1, 2); M(1, 3) = t(1, 0); 95 M(2, 0) = r(2, 0); M(0, 1) = r(2, 1); M(2, 2) = r(2, 2); M(2, 3) = t(2, 0); 96 M(3, 0) = 0; M(3, 1) = 0; M(3, 2) = 0; M(3, 3) = 1; 97 98 cout << "R :" << r << endl; 99 cout << "T :" << T_mm << endl; 100 101 for (int i = 0; i < ids.size(); i++) 102 { 103 cv::aruco::drawAxis(imageCopy, intrinsic_matrix, arucodistCoeffs, rvecs[i], tvecs[i], 0.05); 104 } 105 106 } 107 108 imshow("out", imageCopy); 109 char key = (char)waitKey(1); 110 if (key == 27) break; 111 } 112 113 } 114 return 0; 115 } 116 117