5_相机标定_3_calibrateCamera()例子

上次介绍了calibrateCamera()接口参数,这次实际调用。

5942745cf7d6a6cb1de1e1864d86a0ea.png

程序中所用标准标定板。

一、图片预处理

使用的图片原像素是3072*2048,即600万像素,处理起来不快;改成了560*420,即20万像素。调用opencv接口如下:

// 最小分辨率(560x420像素)Size dsize = Size(560, 420);Mat shrink;resize(img, shrink, dsize, 0, 0, INTER_AREA);//保存stringstream str;str << "../opencv_/data/pic/11" <<  ".png";imwrite(str.str(), shrink);

二、相机标定流程

主要是objectPoints:世界坐标系中的点。使用标准棋盘,传入的是交叉点(不包括边角)的实际坐标,以物理实际尺度(如mm)为单位。写坐标时,保证z轴为0,按照先x变化,后y变化,从小到大的顺序来写。如果网格尺寸为12.5毫米,写作:(0,0,0),(12.5,0,0), (25,0,0)...    

0e25309ddf5a18c5d23fbf7009d0dd2d.png

①读取图片,找到角点,对粗角点精确化

cv::imread(pic)

cv::findCirclesGrid()

cv::find4QuadCornerSubpix()

②设置棋盘三维物理坐标

我使用的是标准圆网格,7*7=49个。

③调用calibrateCamera()接口

程序如下:

 程序中cv::Size2f(12.5,12.5)是两圆的中心距。  

std::vector imagePointBuf;  /* 缓存每幅图像上检测到的角点 */
std::vector imagePointSeq;  /* 保存检测到的所有角点 */   int imageCount=0;  /* 图像数量 */cv::Size boardSize = cv::Size(7,7);    /* 标定板上每行、列的角点数 */cv::Size imageSize;  /* 图像的尺寸 */for(int i=1; i<12; i++){std::string pic("../CalibrateCamera/data/pic/" + std::to_string(i) +".png" );cv::Mat imageInput = cv::imread(pic);//cv::findChessboardCorners(imageInput,boardSize,imagePointBuf);bool ret = cv::findCirclesGrid(imageInput,boardSize,imagePointBuf);    if(true == ret){qDebug() << "findChessboardCorners success " << i;imageCount++;if (1 == imageCount) {imageSize.width = imageInput.cols;imageSize.height =imageInput.rows;}          cv::Mat viewGray;
//          cv::cvtColor(imageInput,viewGray,CV_BGR2GRAY);cv::cvtColor(imageInput,viewGray,cv::COLOR_BGR2GRAY);/* 亚像素精确化 */cv::find4QuadCornerSubpix(viewGray,imagePointBuf,cv::Size(7,7)); //对粗提取的角点进行精确化imagePointSeq.push_back(imagePointBuf); //保存亚像素角点//          cv::drawChessboardCorners(imageInput, boardSize, imagePointBuf, true);
//          cv::imshow("Camera Calibration",viewGray);//显示图片}else{qDebug() << "findChessboardCorners failed " << i;}}qDebug() << "角点提取完成!\n";//以下是摄像机标定qDebug() << "开始标定………………";/*棋盘三维信息 mm*/cv::Size2f squareSize = cv::Size2f(12.5,12.5);  /* 实际测量得到的标定板上每个棋盘格的大小 */    std::vector     <std::vector> objectPoints; /* 保存标定板上角点的三维坐标 */     /*内外参数*/cv::Mat cameraMatrix = cv::Mat(3,3,CV_32FC1,cv::Scalar::all(0)); /* 摄像机内参数矩阵 */std::vector pointCounts;  // 每幅图像中角点的数量cv::Mat distCoeffs = cv::Mat(1,5,CV_32FC1,cv::Scalar::all(0)); /* 摄像机的5个畸变系数:k1,k2,p1,p2,k3 */std::vector rotateMat;  /* 每幅图像的旋转向量 */std::vector transMat; /* 每幅图像的平移向量 */          int i,j,t;for (t=0;tstd::vector tempPointSet;for (i=0;i     <boardSize.height;i++){< span>     </boardSize.height;i++){<>for (j=0;j     <boardSize.width;j++){< span>     </boardSize.width;j++){<>cv::Point3f realPoint;/* 假设标定板放在世界坐标系中z=0的平面上 */realPoint.x = i*squareSize.width;realPoint.y = j*squareSize.height;realPoint.z = 0;tempPointSet.push_back(realPoint);}}objectPoints.push_back(tempPointSet);}/* 初始化每幅图像中的角点数量,假定每幅图像中都可以看到完整的标定板 */for (i=0;i     <imageCount;i++){< span>     </imageCount;i++){<>pointCounts.push_back(boardSize.width*boardSize.height);}/* 开始标定 */    cv::calibrateCamera(objectPoints, imagePointSeq, imageSize,cameraMatrix, distCoeffs, rotateMat, transMat, 0);qDebug() <<"标定完成!\n";

    未完待续......

def37d6e2779bce0b1befeca1ff61470.png

5_相机标定_1_标定板选取与角点绘制

5_相机标定2_calibrateCamera()与内外参        

如需修改像素程序可在后台留言“修改图片像素”.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里通义灵码体验

点击访问体验 之前有体验过github的代码助手&#xff0c;奈何收费了&#xff0c;上周发现有一个免费的代码助手。 下载安装 vscode 搜索扩展 TONGYI Lingma 安装完成后登陆即可体验 写注释让他写代码 根据上下文自动补充 这里我只写了一个方法名&#xff0c;getAgencyList…

linux安装erlang

摘要 Erlang是一种通用的面向并发的编程语言&#xff0c;它由瑞典电信设备制造商爱立信所辖的CS-Lab开发&#xff0c;目的是创造一种可以应对大规模并发活动的编程语言和运行环境。 环境准备 系统环境 使用命令&#xff1a;uname -a 或者 uname -r&#xff0c;执行后如下&a…

浅谈SQL注入漏洞原理及利用方式

1.SQL注入 原理&#xff1a; 在数据交互中&#xff0c;前端的数据传入到后台处理时&#xff0c;由于后端没有做严格的判断&#xff0c;导致其传入的恶意“数据”拼接到SQL语句中后&#xff0c;被当作SQL语句的一部分执行。漏洞产生于脚本&#xff0c;注入是针对数据库进行。 …

Javaweb的学习21_CSS_属性

CSS的属性 (常用)属性&#xff1a; 1. 字体、文本 font-size&#xff1a;字体大小 color&#xff1a;文本颜色 text-align&#xff1a;文本的对齐方式 line-height&#xff1a;行高 2. 背景 background&#xff1a;是个复合属性 3. 边框 border&#xff1a;设置边框&#xff0c…

WordPress自动生成原创文章插件

WordPress作为最受欢迎的内容管理系统之一&#xff0c;为博客和网站的搭建提供了便捷的解决方案。而在内容创作方面&#xff0c;自动生成原创文章的插件为WordPress用户提供了更为高效的选项。 什么是WordPress自动生成原创文章插件&#xff1f; WordPress自动生成原创文章插件…

【NLP学习记录】One-Hot编码

1. One-Hot编码概念 one-hot编码的基本思想是将每个类别映射到一个向量&#xff0c;其中只有一个元素的值为1&#xff0c;其余元素的值为0。这样&#xff0c;每个类别之间相互独立&#xff0c;不存在顺序或距离关系。 举例&#xff1a;对于三个类别的情况&#xff0c;可以使用…

基于协同过滤的毕业生就业推荐系统python+django+flask

功能&#xff1a; 管理员&#xff1a;主页、个人中心、求职者管理、企业管理、招聘信息管理、就业信息管理、面试邀请管理、就业签约管理、投递的简历管理、系统管理 企业&#xff1a;主页、个人中心、求职者管理、招聘信息管理&#xff08;可看见所有的招聘信息。发布招聘信息…

三 C#插入排序算法

简介 插入排序算法是一种简单、直观的排序算法&#xff0c;其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 插入排序实现原理 插入排序算法是一种简单、直观的排序算法&#xff0c;其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 具体实现步骤…

【iOS】Blocks

文章目录 前言一、什么是Blocks二、Blocks模式1.Block语法2.Block类型变量3.截获自动变量值4.__block说明符5.截获的自动变量 三、Blocks的实现1.Block的实质__main_block_impl_0Block对象的实现结构体初始化 2.截获自动变量值3.__block说明符4.Block存储域5.__block变量存储域…

数据结构——lesson10排序之插入排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

python之数据类型转换

基本数据类型转换 Python 中基本数据类型转换的方法有下面几个。 方法说明int(x [,base ])将x转换为一个整数float(x )将x转换到一个浮点数complex(real [,imag ])创建一个复数str(x )将对象 x 转换为字符串repr(x )将对象 x 转换为表达式字符串eval(str )用来计算在字符串中…

Linux的背景介绍

1.Linux的发展史 Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff09;&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08…

【源码阅读】evmⅠ

代码位置如下&#xff1a; 参考link 以太坊中有一个很重要的用途是智能合约&#xff0c;而其中evm模块是实现了执行智能合约的虚拟机。evm可以逐条解析执行智能合约的指令。 evm中的核心对象是EVM&#xff0c;代表一个以太坊虚拟机。其内部主要依赖&#xff1a;解释器Interore…

蓝桥杯历年真题Java b组 省赛 2018年第九届 第几天

一、题目一 第几天 2000年的1月1日&#xff0c;是那一年的第1天。 那么&#xff0c;2000年的5月4日&#xff0c;是那一年的第几天&#xff1f; 注意&#xff1a;需要提交的是一个整数&#xff0c;不要填写任何多余内容。 分析&#xff1a; 将每个月的天数加起来&#xff0c…

2024年敏捷产品负责人CSPO认证培训

课程名称&#xff1a;Scrum Product Owner CSPO产品负责人认证 课程类型&#xff1a;经理级 课程简介&#xff1a; Scrum Product Owner产品负责人在Scrum产品开发当中扮演“舵手”的角色&#xff0c;他决定产品的愿景、路线图以及投资回报&#xff0c;他需要回答为什么做&am…

Python——字典

一、字典特性介绍 字典在 Python 中极为重要&#xff0c;是属于映射类型的数据结构。 字典有⼀对⼉⼤括号组成 {} , 字典内的元素都是成对⼉出现的 {"a":1} , 他们⽤英⽂的冒号( : )隔开, 左边叫做键(key),右边的叫值(value), 通常叫做键值对⼉。 每个元素⽤英⽂的逗…

【Python循环4/5】跳出循环的办法

目录 导入 break 具体用法 在for循环中的运用 在while循环中的运用 continue 具体用法 区别 总结 导入 前几天的博文里&#xff0c;我们学习了for循环和while循环。 无论是for循环还是while循环&#xff0c;默认的终止条件都是边界条件。在触发边界条件之前&am…

生成微信小程序二维码

首页 -> 统计 可以通过上面二个地方配置&#xff0c;生成小程序的二维码&#xff0c;并且在推广分析里&#xff0c;有详细的分析数据&#xff0c;

国务院大动作!2024年深入推广「项目管理国标」,行业将迎新风向!

职场竞争激烈&#xff0c;项目管理专业人才在各个行业中的作用越来越凸显出来。在23年之前&#xff0c;我国关于通用项目管理人才的培养更多依赖于国外的PMP认证&#xff0c;缺少自主的认证评价标准和体系。 为了弥补这一空缺&#xff0c;基于国内的项目管理发展需求&#xff…

基于单片机的智能台灯设计1.42

摘 要 社会在发展&#xff0c;时代在进步&#xff0c;人们对生活质量需求更加膨胀&#xff0c;是否拥有高科技技术也最终决定着产品是否可以满足人们的欲望&#xff0c;只有性价比更高&#xff0c;才可以得到更好的青睐。现在的电子产品愈来愈多&#xff0c;龙蛇混杂&#xff…