自己写简单的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二维码检测,自己写摄像头读取,都没有那么难其实。