赞
踩
自己写简单的aruco二维码检测代码
我让chatgpt写了下,感觉还是挺棒的,这样可以做到自己写aruco二维码检测了
当然根本还是opencv有现成的aruco的函数了
- #include <opencv2/opencv.hpp>
- #include <opencv2/aruco.hpp>
-
- int main()
- {
- // 定义ArUco字典和参数
- cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
- cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
-
- // 读取相机标定参数
- cv::FileStorage fs("calibration.xml", cv::FileStorage::READ);
- cv::Mat cameraMatrix, distCoeffs;
- fs["camera_matrix"] >> cameraMatrix;
- fs["distortion_coefficients"] >> distCoeffs;
-
- // 打开相机
- cv::VideoCapture cap(0);
- if (!cap.isOpened())
- {
- std::cout << "无法打开相机" << std::endl;
- return -1;
- }
-
- while (true)
- {
- // 读取相机帧
- cv::Mat frame;
- cap >> frame;
-
- // 转换为灰度图像
- cv::Mat gray;
- cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
-
- // 检测ArUco二维码
- std::vector<int> markerIds;
- std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
- cv::aruco::detectMarkers(gray, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);
-
- // 绘制检测结果
- if (markerIds.size() > 0)
- {
- cv::aruco::drawDetectedMarkers(frame, markerCorners, markerIds);
-
- // 估计相机姿态
- std::vector<cv::Vec3d> rvecs, tvecs;
- cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs);
-
- // 绘制相对位姿
- for (int i = 0; i < markerIds.size(); ++i)
- {
- cv::aruco::drawAxis(frame, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.1);
- }
- }
-
- // 显示图像
- cv::imshow("ArUco Detection", frame);
-
- // 按下 'q' 键退出循环
- if (cv::waitKey(1) == 'q')
- {
- break;
- }
- }
-
- // 释放资源
- cap.release();
- cv::destroyAllWindows();
-
- return 0;
- }
g++ -o aruco_detection aruco_detection.cpp `pkg-config --cflags --libs opencv4`
改成这样后运行起来了
- #include <opencv2/opencv.hpp>
- #include <opencv2/aruco.hpp>
-
- int main()
- {
- // 定义ArUco字典和参数
- cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
- cv::Ptr<cv::aruco::DetectorParameters> parameters = cv::aruco::DetectorParameters::create();
-
- // 读取相机标定参数
- //cv::FileStorage fs("calibration.xml", cv::FileStorage::READ);
- //cv::Mat cameraMatrix, distCoeffs;
- //fs["camera_matrix"] >> cameraMatrix;
- //fs["distortion_coefficients"] >> distCoeffs;
- double fx = 406.932130;
- double fy = 402.678201;
- double cx = 316.629381;
- double cy = 242.533947;
-
- double k1 = 0.039106;
- double k2 = -0.056494;
- double p1 = -0.000824;
- double p2 = 0.092161;
- double k3 = 0.0;
-
- cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) <<
- fx, 0, cx,
- 0, fy, cy,
- 0, 0, 1);
-
- cv::Mat distCoeffs = (cv::Mat_<double>(5, 1) << k1, k2, p1, p2, k3);
-
-
- // 打开相机
- cv::VideoCapture cap(0);
- if (!cap.isOpened())
- {
- std::cout << "无法打开相机" << std::endl;
- return -1;
- }
-
- while (true)
- {
- // 读取相机帧
- cv::Mat frame;
- cap >> frame;
-
- // 转换为灰度图像
- cv::Mat gray;
- cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
-
- // 检测ArUco二维码
- std::vector<int> markerIds;
- std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
- cv::aruco::detectMarkers(gray, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);
-
- // 绘制检测结果
- if (markerIds.size() > 0)
- {
- cv::aruco::drawDetectedMarkers(frame, markerCorners, markerIds);
-
- // 估计相机姿态
- std::vector<cv::Vec3d> rvecs, tvecs;
- cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs);
-
- // 绘制相对位姿
- for (int i = 0; i < markerIds.size(); ++i)
- {
- cv::aruco::drawAxis(frame, cameraMatrix, distCoeffs, rvecs[i], tvecs[i], 0.1);
- }
- }
-
- // 显示图像
- cv::imshow("ArUco Detection", frame);
-
- // 按下 'q' 键退出循环
- if (cv::waitKey(1) == 'q')
- {
- break;
- }
- }
-
- // 释放资源
- cap.release();
- cv::destroyAllWindows();
-
- return 0;
- }
-
-
加上结果打印
边长改正确之后检测的距离也基本是准确的
代码最后我放这里了 https://gitee.com/maxibooksiyi/aruco_detection_without_ros
自己写T265定点,自己写aruco二维码检测,自己写摄像头读取,都没有那么难其实。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。