OpenCV标定演示,及如何生成标定板图片
标定的程序在官方的源码里有,
opencv-4.5.5\samples\cpp\tutorial_code\calib3d\camera_calibration
很多小白不知道怎么跑起来,这个也怪OpenCV官方,工作没做完善,其实的default.xml是要自己手动改的,输入的图片也要自己去拍摄,还有那个VID5.xml也要改成可以直接找到图片的路径;
我这里拍了5张图,故意做了鱼眼效果后,用于标定校正。程序已经改好了,直接visual studio就可以跑了,到这里去下载吧,
https://github.com/SpaceView/OpenCV455_cameraCalibrationDemo
关于标定板:
OpenCV官方曾经提供的标定板是CHESSBOARD 9x6和7x7的,实际应用根据场景的需要,可能需要不同的标定板。
标定程序实际支持三种标定板,包括chessboard,grid circle, asymmetric grid circle格子,这里我们手动生成标定板(包括这里提到的三种标定板)的图片, 程序如下,
class CalibTools {public:cv::Mat GenerateChessboard(int xBlockNum, int yBlockNum, int BLOCKWIDTH, std::string saveFileName) {//const int BLOCKWIDTH = 150;//const int xBlockNum = 7;//const int YBlockNum = 7;cv::Size sz = { xBlockNum * BLOCKWIDTH, yBlockNum * BLOCKWIDTH };cv::Mat mat(sz, CV_8UC3);for (int r = 0; r < yBlockNum; r++) {for (int c = 0; c < xBlockNum; c++) {int IX = c * BLOCKWIDTH, IY = r * BLOCKWIDTH;int EX = IX + BLOCKWIDTH, EY = IY + BLOCKWIDTH;cv::Vec3b value;if (0 == (c + r) % 2) {value = { 0xFF,0xFF, 0xFF };}else {value = 0x000000;}for (int y = IY; y < EY; y++) {cv::Vec3b* p = mat.ptr<cv::Vec3b>(y);for (int x = IX; x < EX; x++) {p[x] = value;}}}}if (!saveFileName.empty()) {saveFileName += ".png";cv::imwrite(saveFileName, mat);}return mat;}/** * * * * * * * --> xDotNum1 = 7 _|_ 1* * * * * * * * _|_ 2* * * * * * * * _|_ 3* * * * * * * * _|_ 4* * * * * * * * _|_ 5* * * * * * * * _|_ 6* * * * * * * * _|_ 7 --> In total yDotNum = 7*/cv::Mat GenerateGridCircle(int xDotNum, int yDotNum, int dotRadius, int BLOCKWIDTH, std::string saveFileName) {cv::Size sz = { (xDotNum +1) * BLOCKWIDTH, (yDotNum+1) * BLOCKWIDTH };cv::Mat mat(sz, CV_8UC3);mat.setTo(cv::Scalar(255,255,255));for (int r = 1; r <= yDotNum; r++) {int y = r * BLOCKWIDTH;for (int c = 1; c <= xDotNum; c++) {int x = c * BLOCKWIDTH;cv::circle(mat, cv::Point(x, y), dotRadius, cv::Scalar(0, 0, 0), cv::FILLED);}}if (!saveFileName.empty()) {saveFileName += ".png";cv::imwrite(saveFileName, mat);}return mat;}/** * * * * * * * --> xDotNum1 = 7 |* * * * * * * --> xDotNum2 = 6 _|_ 1, --> 2 rows make 1 unit in yDotNum* * * * * * * * |* * * * * * * _|_ 2* * * * * * * * |* * * * * * * _|_ 3* * * * * * * * |* * * * * * * _|_ 4, --> In total yDotNum = 4* * *<--->* ---> DOTDIST* ** * **/cv::Mat GenerateAsymmetricGridCircle(int xDotNum1, int xDotNum2, int yDotNum, int dotRadius, int DOTDIST, std::string saveFileName) {int totXDotNum = xDotNum1 + xDotNum2 + 2;int totYDotNum = 2 * yDotNum + 2;int DIST = DOTDIST / 2;int HDIST = DIST / 2;cv::Size sz = { totXDotNum * DIST, totYDotNum * DIST };cv::Mat mat(sz, CV_8UC3);mat.setTo(cv::Scalar(255, 255, 255));for (int r = 1; r < totYDotNum-1; r++) {for (int c = 1; c < totXDotNum-1; c++) {int IX = c * DIST, IY = r * DIST;int CX = IX + HDIST, CY = IY + HDIST;if (0 == (c + r) % 2) {cv::circle(mat, cv::Point(CX, CY), dotRadius, cv::Scalar(0, 0, 0), cv::FILLED);}}}if (!saveFileName.empty()) {saveFileName += ".png";cv::imwrite(saveFileName, mat);}return mat;}
};
调用方式举例如下,
CalibTools ct;
ct.GenerateChessboard(7, 7, 100, "GenerateChessboard");
ct.GenerateGridCircle(8, 8, 20, 80, "GeneratedGridCircles");
ct.GenerateAsymmetricGridCircle(8, 7, 6, 20, 100, "GenerateAsymmetricGridCircle");
这样,就可以生成下列形状的标定板,
然后打印出来就可以做标定板了。
关于非对称的圆形标定板,可以参考下面的贴子,
OpenCv相机标定——圆形标定板标定_opencv圆形标定板-CSDN博客
本文结束。
相关文章:

OpenCV标定演示,及如何生成标定板图片
标定的程序在官方的源码里有, opencv-4.5.5\samples\cpp\tutorial_code\calib3d\camera_calibration 很多小白不知道怎么跑起来,这个也怪OpenCV官方,工作没做完善,其实的default.xml是要自己手动改的,输入的图片也要…...
python venv 虚拟环境使用
查看py版本python --version 创建虚拟环境 venvdemopython -m venv venvdemo 启动虚拟环境创建好虚拟环境后,当前目录会出现 venvdemo文件夹 cd envdemo\Scripts 执行 ./activate 文件 进入虚拟环境 关闭虚拟环境deactivate 如何查看Python虚拟环境位置python -c …...
useCallback和useMemo的区别?
文章目录 前言useCallbackuseMemouseCallback除了缓存回调函数还可以做什么操作?后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:react.js 🐱👓博主在前端领域还有很多知识和技术需要掌握࿰…...

Angular组件生命周期详解
当 Angular 实例化组件类 并渲染组件视图及其子视图时,组件实例的生命周期就开始了。生命周期一直伴随着变更检测,Angular 会检查数据绑定属性何时发生变化,并按需更新视图和组件实例。当 Angular 销毁组件实例并从 DOM 中移除它渲染的模板时…...
Redsync 多 Redis 实例使用 demo
完整代码传送门 package mainimport ("context""fmt""net/http""redis-distributed-lock/redis_client""strconv""github.com/go-redsync/redsync/v4""github.com/go-redsync/redsync/v4/redis/goredis/v9&…...

Docker(1)——安装Docker以及配置阿里云镜像加速
目录 一、简介 二、安装Docker 1. 访问Docker官网 2. 卸载旧版本Dokcer 3. 下载yum-utils(yum工具包集合) 4. 设置国内镜像仓库 5. 更新yum软件包索引 6. 安装Docker 7. 启动Docker 8. 卸载Docker 三、阿里云镜像加速 1. 访问阿里云官网 2. …...

MCU HardFault_Handler调试方法
一.获取内核寄存器的值 1.在MDK的DEBUG模式下,当程序出现跑飞后,确定卡死在HardFault_Handler中断处 2. 通过Register窗口读取LR寄存器的值来确定当前系统使用堆栈是MSP还是PSP LR寄存器值堆栈寄存器0xFFFFFFF9MSP寄存器0xFFFFFFFDPSP寄存器 如下图所…...
【深度学习】AUTOMATIC1111 / stable-diffusion-webui docker
代码:https://github.com/AUTOMATIC1111/stable-diffusion-webui/ CUDA 11.8 制作了一个镜像,可以直接开启stable diffusion的web ui 服务。 确定自己的显卡支持CUDA11.8,启动此镜像方式: docker run -it --networkhost --gpu…...
[Hive] 查询结果保存
文章目录 1.插入新表追加 2.插入hdfs文件系统 1.插入新表 使用INSERT OVERWRITE语句的情况: 整个表:可以使用INSERT OVERWRITE TABLE table_name语句将查询结果直接覆盖整个表中的数据。 INSERT OVERWRITE TABLE table_name SELECT * FROM ...特定分区…...

Es中出现unassigned shards问题解决
1、一般后台会报primary shard is not active Timeout: … 出现这种问题表示该索引是只读了,没办法进行shard及存储操作,优先排除是系统存储盘满了 2、通过监控工具查看(cerebro) 发现该索引shard 1 损坏 也可以通过命令进行查看 GET _cluster/allo…...

RT-DERT:在实时目标检测上,DETRs打败了yolo
文章目录 摘要1、简介2. 相关研究2.1、实时目标检测器2.2、端到端目标检测器2.3、用于目标检测的多尺度特征 3、检测器的端到端速度3.1、 NMS分析3.2、端到端速度基准测试 4、实时DETR4.1、模型概述4.2、高效的混合编码器4.3、IoU-aware查询选择4.4、RT-DETR的缩放 5、实验5.1、…...
uniapp/H5富文本复制文本功能
代码实现: copy() {let replacedContent this.form.resTaskBaseInfoDetail.content;let text readHtml(replacedContent)// #ifdef H5let textarea document.createElement("textarea")textarea.value texttextarea.readOnly "readOnly"d…...

通付盾Web3专题 | 智能账户:数字时代基础单元
2008年10月31日,中本聪(Satoshi Nakamoto)在P2P foundation 网站发布比特币白皮书《比特币:一种点对点的电子现金系统》。转眼距比特币白皮书发布已过去15年。2009年1月比特币网络正式推出,当时每个比特币的价格仅为0.…...

java网上阅读网站系统eclipse定制开发mysql数据库BS模式java编程jdbc
一、源码特点 JSP 网上阅读网站系统是一套完善的web设计系统,对理解JSP java SSM框架 mvc编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发,数据库为Mysql5.0&a…...

人工智能基础_机器学习007_高斯分布_概率计算_最小二乘法推导_得出损失函数---人工智能工作笔记0047
这个不分也是挺难的,但是之前有详细的,解释了,之前的文章中有, 那么这里会简单提一下,然后,继续向下学习 首先我们要知道高斯分布,也就是,正太分布, 这个可以预测x在多少的时候,概率最大 要知道在概率分布这个,高斯分布公式中,u代表平均值,然后西格玛代表标准差,知道了 这两个…...

开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化
开源播放器GSYVideoPlayer的简单介绍及播放rtsp流的优化 前言一、GSYVideoPlayer🔥🔥🔥是什么?二、简单使用1.First、在project下的build.gradle添加2.按需导入3. 常用代码 rtsp流的优化大功告成 总结 前言 本文介绍,…...

安卓手机数据恢复工具 DiskDigger Pro 中文版-适用于已获得 root 权限的设备!可以从您的存储卡或内存恢复数据
可以从您的存储卡或内存中取消删除和恢复丢失的照片、文档、视频、音乐等。 无论您是不小心删除了文件,还是重新格式化了存储卡,DiskDigger 强大的数据恢复功能都可以找到您丢失的文件并让您恢复它们。 注意:如果您的设备未获得 root 权限&a…...

Python 生成Android不同尺寸的图标
源代码 # -*- coding: utf-8 -*- import sys import os import shutil from PIL import Imagedef generateAndroidIcons():imageSource icon.pngicon Image.open(imageSource)sizes [(android/drawable,512),(android/drawable-hdpi,72),(android/drawable-ldpi,36),(andro…...
PHP使用GuzzleHttp进行HTTP请求
1,composer安装 composer require guzzlehttp/guzzle:~7.0 2,设置过期时间和跳过ssl验证 use GuzzleHttp\Client;$clientnew Client([timeout > 5, verify > false]);2,get请求 use GuzzleHttp\Client;$clientnew Client([timeout > 5, verif…...
pytorch笔记:allclose,isclose,eq,equal
1 allclose 1.1介绍 torch.allclose是一个PyTorch函数,用于检查两个张量是否在某个容忍度范围内近似相等 torch.allclose(input, other, rtol1e-05, atol1e-08, equal_nanFalse)input (Tensor) – 第一个输入张量other (Tensor) – 第二个输入张量rtol (float) –…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...