当前位置:   article > 正文

自己写简单的aruco二维码检测代码

aruco二维码

自己写简单的aruco二维码检测代码

我让chatgpt写了下,感觉还是挺棒的,这样可以做到自己写aruco二维码检测了

当然根本还是opencv有现成的aruco的函数了

输入图片说明

  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/aruco.hpp>
  3. int main()
  4. {
  5. // 定义ArUco字典和参数
  6. cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
  7. cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
  8. // 读取相机标定参数
  9. cv::FileStorage fs("calibration.xml", cv::FileStorage::READ);
  10. cv::Mat cameraMatrix, distCoeffs;
  11. fs["camera_matrix"] >> cameraMatrix;
  12. fs["distortion_coefficients"] >> distCoeffs;
  13. // 打开相机
  14. cv::VideoCapture cap(0);
  15. if (!cap.isOpened())
  16. {
  17. std::cout << "无法打开相机" << std::endl;
  18. return -1;
  19. }
  20. while (true)
  21. {
  22. // 读取相机帧
  23. cv::Mat frame;
  24. cap >> frame;
  25. // 转换为灰度图像
  26. cv::Mat gray;
  27. cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
  28. // 检测ArUco二维码
  29. std::vector<int> markerIds;
  30. std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
  31. cv::aruco::detectMarkers(gray, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);
  32. // 绘制检测结果
  33. if (markerIds.size() > 0)
  34. {
  35. cv::aruco::drawDetectedMarkers(frame, markerCorners, markerIds);
  36. // 估计相机姿态
  37. std::vector<cv::Vec3d> rvecs, tvecs;
  38. cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs);
  39. // 绘制相对位姿
  40. for (int i = 0; i < markerIds.size(); ++i)
  41. {
  42. cv::aruco::drawAxis(frame, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.1);
  43. }
  44. }
  45. // 显示图像
  46. cv::imshow("ArUco Detection", frame);
  47. // 按下 'q' 键退出循环
  48. if (cv::waitKey(1) == 'q')
  49. {
  50. break;
  51. }
  52. }
  53. // 释放资源
  54. cap.release();
  55. cv::destroyAllWindows();
  56. return 0;
  57. }

输入图片说明

g++ -o aruco_detection aruco_detection.cpp `pkg-config --cflags --libs opencv4`

输入图片说明

改成这样后运行起来了

  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/aruco.hpp>
  3. int main()
  4. {
  5. // 定义ArUco字典和参数
  6. cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
  7. cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
  8. // 读取相机标定参数
  9. //cv::FileStorage fs("calibration.xml", cv::FileStorage::READ);
  10. //cv::Mat cameraMatrix, distCoeffs;
  11. //fs["camera_matrix"] >> cameraMatrix;
  12. //fs["distortion_coefficients"] >> distCoeffs;
  13. double fx = 406.932130;
  14. double fy = 402.678201;
  15. double cx = 316.629381;
  16. double cy = 242.533947;
  17. double k1 = 0.039106;
  18. double k2 = -0.056494;
  19. double p1 = -0.000824;
  20. double p2 = 0.092161;
  21. double k3 = 0.0;
  22. cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) <<
  23. fx, 0, cx,
  24. 0, fy, cy,
  25. 0, 0, 1);
  26. cv::Mat distCoeffs = (cv::Mat_<double>(5, 1) << k1, k2, p1, p2, k3);
  27. // 打开相机
  28. cv::VideoCapture cap(0);
  29. if (!cap.isOpened())
  30. {
  31. std::cout << "无法打开相机" << std::endl;
  32. return -1;
  33. }
  34. while (true)
  35. {
  36. // 读取相机帧
  37. cv::Mat frame;
  38. cap >> frame;
  39. // 转换为灰度图像
  40. cv::Mat gray;
  41. cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
  42. // 检测ArUco二维码
  43. std::vector<int> markerIds;
  44. std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
  45. cv::aruco::detectMarkers(gray, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);
  46. // 绘制检测结果
  47. if (markerIds.size() > 0)
  48. {
  49. cv::aruco::drawDetectedMarkers(frame, markerCorners, markerIds);
  50. // 估计相机姿态
  51. std::vector<cv::Vec3d> rvecs, tvecs;
  52. cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs);
  53. // 绘制相对位姿
  54. for (int i = 0; i < markerIds.size(); ++i)
  55. {
  56. cv::aruco::drawAxis(frame, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.1);
  57. }
  58. }
  59. // 显示图像
  60. cv::imshow("ArUco Detection", frame);
  61. // 按下 'q' 键退出循环
  62. if (cv::waitKey(1) == 'q')
  63. {
  64. break;
  65. }
  66. }
  67. // 释放资源
  68. cap.release();
  69. cv::destroyAllWindows();
  70. return 0;
  71. }

输入图片说明

输入图片说明

加上结果打印

输入图片说明

边长改正确之后检测的距离也基本是准确的

输入图片说明

输入图片说明

代码最后我放这里了 https://gitee.com/maxibooksiyi/aruco_detection_without_ros

自己写T265定点,自己写aruco二维码检测,自己写摄像头读取,都没有那么难其实。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/609574
推荐阅读
  

闽ICP备14008679号