opencv-rust 系列2: camera_calibration
opencv-rust 系列2: camera_calibration
前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的.
说明:
camera_calibration.rs是opencv-rust自带的示例, 在examples目录中可以找到,我增加了一些中文注释如下.- 如需运行可以在项目根目录执行命令:
cargo run --example camera_calibration - 在vscode软件内点击main函数上方绿色三角"Run"运行程序时, 当前位置是项目的根目录.
- 在命令行使用
cargo run运行程序时, 当前位置是命令行所处目录. - 为了保持统一,我使用项目根目录为当前目录设定, 所以运行本程序一定要在项目根目录.
- 使用
highgui::imshow("Source", &img)?;显示窗口时不要使用中文!!! 建议 opencv 程序都不要使用中文. - 文末贴两张图,你可以下载后以jpg后缀名保存到./examples/data目录,以供程序运行使用.
- 当然,Cargo.toml中需包含:
[dependencies]
opencv = "0.93.1"
- 源代码如下:
//! Port of code from the tutorial at: https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.htmluse std::error::Error;
use std::fs;
use opencv::core::{no_array, Point2f, Point3f, Size, TermCriteria, TermCriteria_EPS, TermCriteria_MAX_ITER, Vector};
use opencv::prelude::*;
use opencv::{calib3d, highgui, imgcodecs, imgproc};
use std::env;fn main() -> Result<(), Box<dyn Error>> {// 获取当前工作目录let current_dir = env::current_dir().expect("无法获取当前目录");// 打印当前工作目录的路径println!("当前路径: {}", current_dir.display());// 设置校准的终止条件,包括最大迭代次数和最小精度let criteria = TermCriteria {typ: TermCriteria_EPS + TermCriteria_MAX_ITER, // 终止条件类型max_count: 30, // 最大迭代次数epsilon: 0.001, // 精度阈值};// 准备三维世界中的物体点,例如棋盘格的角点, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)let objp_len = 6 * 7; // 棋盘格的尺寸为6x7let objp = Vector::from_iter((0..objp_len).map(|i| Point3f::new((i % 7) as f32, // x坐标(i / 7) as f32, // y坐标0.))); // z坐标,假设棋盘格位于z=0的平面上// 读取当前目录下所有.jpg文件let images = fs::read_dir("./examples/data")?.into_iter().flatten().filter(|entry| entry.path().extension().map_or(false, |ext| ext == "jpg"));//对每张图片进行校正for image in images {// 初始化用于存储所有图像的物体点和图像点的数组let mut objpoints = Vector::<Vector<Point3f>>::new(); // 三维世界中的点let mut imgpoints = Vector::<Vector<Point2f>>::new(); // 图像平面中的点// 读取原始图像并显示 println!("准备读取图片: {}", image.path().to_string_lossy());let mut img = imgcodecs::imread_def(image.path().to_string_lossy().as_ref())?; highgui::imshow("Origin", &img)?;highgui::wait_key(5000)?;let mut gray = Mat::default();// 将图像转换为灰度图imgproc::cvt_color_def(&img, &mut gray, imgproc::COLOR_BGR2GRAY)?;let mut corners = Vector::<Point2f>::default();// 在灰度图中查找棋盘格角点let ret = calib3d::find_chessboard_corners_def(&gray, Size::new(7, 6), &mut corners)?;if ret {println!("找到角点, 正在对该图校正");// 如果找到了角点,将其添加到物体点数组objpoints.push(objp.clone()); // 使用亚像素级精度细化角点位置imgproc::corner_sub_pix(&gray, &mut corners, Size::new(11, 11), Size::new(-1, -1), criteria)?;// 在图像上绘制角点并显示calib3d::draw_chessboard_corners(&mut img, Size::new(7, 6), &corners, ret)?;highgui::imshow("Source", &img)?;// 将角点添加到图像点数组imgpoints.push(corners);// 相机校准let mut mtx = Mat::default(); // 相机内参矩阵let mut dist = Mat::default(); // 畸变系数let mut rvecs = Vector::<Mat>::new(); // 旋转向量let mut tvecs = Vector::<Mat>::new(); // 平移向量calib3d::calibrate_camera_def(&objpoints,&imgpoints,gray.size()?,&mut mtx,&mut dist,&mut rvecs,&mut tvecs,)?;//下面使用两种方法去除图像的畸变:// 方法1,使用cv.undistort()去除图像畸变let mut dst_undistort = Mat::default();calib3d::undistort_def(&img, &mut dst_undistort, &mtx, &dist)?;highgui::imshow("Result using undistort", &dst_undistort)?;// 方法2,使用remapping方法去除图像畸变let mut mapx = Mat::default();let mut mapy = Mat::default();calib3d::init_undistort_rectify_map(&mtx,&dist,&no_array(),&no_array(),img.size()?,f32::opencv_type(),&mut mapx,&mut mapy,)?;let mut dst_remap = Mat::default();imgproc::remap_def(&img, &mut dst_remap, &mapx, &mapy, imgproc::INTER_LINEAR)?;// 显示使用remap方法去畸变后的结果highgui::imshow("Result using remap", &dst_undistort)?;// 等待按键,然后继续处理下一张图像highgui::wait_key_def()?;}else {println!("没有找到角点, 该图不能进行校正");}}// 销毁所有OpenCV创建的窗口highgui::destroy_all_windows()?;Ok(())
}


相关文章:
opencv-rust 系列2: camera_calibration
opencv-rust 系列2: camera_calibration 前言: 这里只是opencv-rust自带示例的中文注解. 略微增加了一些代码也是我在调试时用到的. 说明: camera_calibration.rs是opencv-rust自带的示例, 在examples目录中可以找到,我增加了一些中文注释如下.如需运行可以在项目根目录执行命…...
JVM和GC案例详解
接上文JVM环境配置说明:上文博客 一、JVM远程连接设置 1. JMX方式连接(这种方式没有GC监控),设置如下 2. 连接成功后可以查看基础配置参数(和服务器配置一致) 2. jstatd方式连接(这种方式没有CPU监控) 添加jstatd方式连接 双击Tomcat࿰…...
postgreSql下载安装
一、下载 官网:PostgreSQL: The worlds most advanced open source database 二、安装 1.找到.exe文件,双击安装 2.跟着安装向导操作 三、启动...
GPT-SOVIT模型部署指南
一、模型介绍 强大的小样本语音转换和文本转语音 WebUI。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS: 仅使用 1 分钟的训练数据对模型进行微调,以提高语音相似度和真实感。跨语…...
怎么定时发朋友圈?
要实现微信朋友圈的定时发布,可以采用以下几种方法: 1、 绑定QQ号并使用QQ空间定时功能: 于微信和QQ的紧密联系,可以通过绑定QQ号,利用QQ空间的定时发布功能来间接实现微信朋友圈的定时发布。首先,在QQ空…...
如何利用phpstudy创建mysql数据库
phpStudy诞生于2007年,是一款老牌知名的PHP开发集成环境工具,产品历经多次迭代升级,目前有phpStudy经典版、phpStudy V8(2019版)等等,利用phpstudy可以快速搭建一个mysql环境,接下来我们就开始吧…...
五、Linux之Vi和Vim编辑器
基本介绍 Vi Linux 系统会内置 vi 文本编辑 Vim 具有程序编辑的能力,可以看做是 Vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富 常用的三种模式 正常模式 以 vim …...
git删除错误的commit
文章目录 1、git删除错误的commit2、.gitignore配置文件不生效的问题 1、git删除错误的commit git的流程如图: 当某次失误造成commit的版本有问题,需要回退到正常的版本修改后重新add。 首先通过git log查看commit提交记录,可以看到HEAD-…...
代码随想录算法训练营Day08 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字
文章目录 344.反转字符串思路与重点 541. 反转字符串II思路与重点 卡码网:54.替换数字思路与重点 344.反转字符串 题目链接:344. 反转字符串 - 力扣(LeetCode)讲解链接:代码随想录 (programmercarl.com)状态ÿ…...
mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁
mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁 MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资…...
【软件干货】Android应用进程如何保活?
1.Android 应用进程保活方法介绍 在Android应用程序中,为了保证应用的正常运行和稳定性,有时需要对应用进程进行保活。以下是一些实现进程保活的方法: 1、使用前台服务(Foreground Service):将服务调用startForeground()方法&…...
neo4j部署保姆级教程
由于公司是基于大数据架构的,让部署neo4j数据库,之前没有接触过,然后紧急学了一下,并且从网上找了一些教程,决定还是记录下来,后续有时间了会在出一篇使用教程 环境准备(root用户) …...
【STM32CubeMX开发】-2.2-TIM_输出一个PWM信号
目录 1 Tim定时器的时钟源 2 Tim定时器的配置 2.1 PWM配置 2.2 中断配置 3 生成代码 4 测试结果 结尾 1 Tim定时器的时钟源 TIM3的时钟来源自APB1 Timer clocks,时钟树上所有总线频率均设置为了STM32F0能达到的最高频率,此时APB1 Timer clocks …...
Ngx+Lua+Redis 快速存储POST数据
系统几万台设备有windows有安卓还有linux系统,每个设备三分钟就会向服务器post设备的硬件信息,数据格式json,后台管理界面只需要最新的数据,不需要历史数据,业务逻辑非常简单,PHP代码就几行,已经…...
go-delve的使用
go-delve的非交互使用方式: dlv要执行的命令文件:cmd.dlv goroutines exit 执行非交互命令: yes n | dlv --allow-non-terminal-interactivetrue attach $pid --init cmd.dlv --end--...
Python网络爬虫技术详解
Python网络爬虫技术详解 引言 网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定规则自动抓取互联网信息的程序或脚本。它们通过遍历网页链…...
Golang | Leetcode Golang题解之第474题一和零
题目: 题解: func findMaxForm(strs []string, m, n int) int {dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for _, s : range strs {zeros : strings.Count(s, "0")ones : len(s) - zerosfor j : m; j > zeros; j--…...
算法刷题技巧
算法题:https://leetcode.cn/studyplan/top-100-liked/ 哈希表 使用哈希表,增删改查的时间复杂度均为O(1)。何时使用哈希表? 在某个区域内查找一个已知元素,可以使用哈希表作为这个区域根据一个特征对元素进行分类,特征…...
BMS、EMS PCS 简介
1 储能系统的构成 完整的电化学储能系统主要由电池组、电池管理系统(BMS)、能量管理系统(EMS)、储能变流器(PCS)以及其他电气设备构成。 在储能系统中,电池组将状态信息反馈给电池管理系统BMS&…...
spug3发布项目
一、启动spug项目 1.spug代码仓库地址: spug: 开源运维平台:面向中小型企业设计的无 Agent的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布、任务计划、配置中心、监控、报警等一系列功能。 - Gitee.com 注…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
