当前位置: 首页 > web >正文

利用aruco标定板标定相机

1、生成aruco标定板

#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
#include <opencv2/objdetect/aruco_detector.hpp>
#include <iostream>
#include <string>using namespace cv;
using namespace std;int main() 
{int markersX = 17;int markersY = 12;int markerLength = 200;int markerSeparation = 44;int margins = markerSeparation;int borderBits = 1;bool showImage = false;String out = "aruco_board4.png";Size imageSize;imageSize.width = markersX * (markerLength + markerSeparation) - markerSeparation + 2 * margins;imageSize.height = markersY * (markerLength + markerSeparation) - markerSeparation + 2 * margins;aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);aruco::GridBoard board(Size(markersX, markersY), float(markerLength), float(markerSeparation), dictionary);Mat boardImage;board.generateImage(imageSize, boardImage, margins, borderBits);imwrite(out, boardImage);return 0;
}

2、利用aruco标定板标定相机

#include <opencv2/opencv.hpp>
#include <opencv2/aruco.hpp>
#include <opencv2/objdetect/aruco_detector.hpp>
#include <iostream>
#include <string>using namespace cv;
using namespace std;int main() 
{int markersX = 17;int markersY = 12;float markerLength = 200;float markerSeparation = 44;string outputFile = "cam3.yml";int calibrationFlags = 0;float aspectRatio = 1;aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);aruco::DetectorParameters detectorParams;bool refindStrategy = false;int camId = 0;aruco::GridBoard gridboard(Size(markersX, markersY), markerLength, markerSeparation, dictionary);aruco::ArucoDetector detector(dictionary, detectorParams);vector<vector<vector<Point2f>>> allMarkerCorners;vector<vector<int>> allMarkerIds;Size imageSize;vector<string> imgPath;glob("E:\\相机标定\\0723\\calib1_1\\*.jpg", imgPath);for (int i = 0; i < 1; i++){Mat image, imageCopy;image = imread(imgPath[i]);vector<int> markerIds;vector<vector<Point2f>> markerCorners, rejectedMarkers;detector.detectMarkers(image, markerCorners, markerIds, rejectedMarkers);if (refindStrategy) {detector.refineDetectedMarkers(image, gridboard, markerCorners, markerIds, rejectedMarkers);}image.copyTo(imageCopy);if (!markerIds.empty()) {aruco::drawDetectedMarkers(imageCopy, markerCorners, markerIds);}std::cout << "markerIds.size() = " << markerIds.size() << std::endl;namedWindow("out", cv::WINDOW_NORMAL);resizeWindow("out", imageCopy.cols * 0.4, imageCopy.rows * 0.4);imshow("out", imageCopy);waitKey(0);cv::imwrite("draw.bmp", imageCopy);if (!markerIds.empty()) {allMarkerCorners.push_back(markerCorners);allMarkerIds.push_back(markerIds);imageSize = image.size();}}if (allMarkerIds.empty()) {throw std::runtime_error("Not enough captures for calibration\n");}Mat cameraMatrix, distCoeffs;if (calibrationFlags & CALIB_FIX_ASPECT_RATIO) {cameraMatrix = Mat::eye(3, 3, CV_64F);cameraMatrix.at<double>(0, 0) = aspectRatio;}vector<Point3f> objectPoints;vector<Point2f> imagePoints;vector<Mat> processedObjectPoints, processedImagePoints;size_t nFrames = allMarkerCorners.size();for (size_t frame = 0; frame < nFrames; frame++) {Mat currentImgPoints, currentObjPoints;gridboard.matchImagePoints(allMarkerCorners[frame], allMarkerIds[frame], currentObjPoints, currentImgPoints);if (currentImgPoints.total() > 0 && currentObjPoints.total() > 0) {processedImagePoints.push_back(currentImgPoints);processedObjectPoints.push_back(currentObjPoints);}}double repError = calibrateCamera(processedObjectPoints, processedImagePoints, imageSize, cameraMatrix, distCoeffs,noArray(), noArray(), noArray(), noArray(), noArray(), calibrationFlags);bool saveOk = saveCameraParams(outputFile, imageSize, aspectRatio, calibrationFlags,cameraMatrix, distCoeffs, repError);std::cout << "Rep Error: " << repError << endl;std::cout << "Calibration saved to " << outputFile << endl;std::cout << "cameraMatrix = " << cameraMatrix << endl;std::cout << "distCoeffs = " << distCoeffs << endl;return 0;
}

http://www.xdnf.cn/news/16163.html

相关文章:

  • 【faiss】用于高效相似性搜索和聚类的C++库 | 源码详解与编译安装
  • 友华PT104E关闭LED
  • 从零开始学习大模型之文本数据处理
  • MSTP实验
  • 字节跳动视觉算法面试30问全景精解
  • 检索增强型生成助力无人机精准数学推理!RAG-UAV:基于RAG的复杂算术推理方法
  • Node.js:RESPful API、多进程
  • linux-日志服务
  • SQLAlchemy 2.0简单使用
  • Linux 使用 screen 窗口会话稳定挂载jar包到后台运行
  • 初识opencv01——基本api操作
  • 解决pip指令超时问题
  • Android AppCompat:实现Material Design向后兼容的终极指南
  • TTL+日志的MDC实现简易链路追踪
  • 【Java SE】Object类
  • 高并发场景下的缓存问题与一致性解决方案(技术方案总结)
  • day059-zabbix自定义监控与自动发现
  • 哔哩哔哩视觉算法面试30问全景精解
  • 【Pytorch】数据集的加载和处理(一)
  • 从效率瓶颈到自动化:火语言 RPA 在日常工作中的技术实践
  • (Arxiv-2025)HiDream-I1:一种高效图像生成基础模型,采用稀疏扩散Transformer
  • Android Surface创建流程
  • CSS自适应布局实战指南
  • Selenium+Java 自动化测试入门到实践:从环境搭建到元素操作
  • TIM定时中断
  • 一些Avalonia与WPF内容的对应关系和不同用法
  • Java从入门到精通!第十一天(Java常见的数据结构)
  • 数据库设计mysql篇
  • 嵌入式学习-土堆目标检测(3)-day27
  • 【iOS】SideTable