Opencv+ROS自编相机驱动

目录

一、工具

二、原理

代码

标定

三、总结

参考:


一、工具

opencv2+ros

ubuntu18.04

usb摄像头

二、原理

这里模仿usb_cam功能包对Opencv_ros进行修饰,加上相机参数和相机状态,难点在于相机参数的读取。

对于相机参数话题 camera_info内有

查看话题数据类型为sensor_msgs/CameraInfo

 
网址

其中有header,height,wirdth,和D,K,R,P四个矩阵参数,其中K是内参矩阵,D是畸变参数,P是投影矩阵,R是旋转矩阵

distortion_model是畸变模型,plumb_bob 畸变模型是最常见的畸变模型之一,也是默认的畸变模型。钉形畸变模型

查看具体信息 https://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/CameraInfo.html

可以查到每个参数的类型其中header需要我们手动定义,后面参数矩阵通过读取配置文件即可。

 进入/.ros/camear_info文件夹查看.yaml文件

这里面有所有内参数据

distortion_coefficients是D

camera_matrix是K

projection_matrix是P

rectification_matrix是R

那么我们要怎样读取呢,官方给出了读参函数

 应用camera_info软件包

$ sudo apt-get install ros-$ROS_DISTRO-camera-info-manager

代码

引用头文件

#include <camera_info_manager/camera_info_manager.h>

定义发布话题

ros::Publisher camera_info_pub = nh.advertise<sensor_msgs::CameraInfo>("camera_info",10);

定义发布参数

Mat frame;  //定义opencv形式图像参数
cv_bridge::CvImage cv_img;
sensor_msgs::Image ros_msg;  //定义ros形式图像参数
sensor_msgs::CameraInfo ci;  //定义相机内参
std_msgs::String ros_str;  //定义相机状态参数

编写读取文件代码

//const string camurl = "file:///home/hsj/.ros/camera_info/head_camera.yaml";
const string camurl = ""; //空的会默认找从 camera_calibration 标定的yaml 文件

image_transport::ImageTransport it(nh);  
camera_info_manager::CameraInfoManager camera_info(nh, "head_camera", camurl);

这里可以写绝对路径,也可以空着

然后ci作为参数要给其赋值

ros_msg.header.stamp= ros::Time::now();
ros_msg.header.frame_id = camera_frame_id;
ci = camera_info.getCameraInfo();
ci.header = ros_msg.header;

这里引用了getCameraInfo()函数

然后话题就有数据了

标定

先说明上述参数是怎么来的

下载相机标定工具

sudo apt-get install ros-$ROS_DISTRO-camera-calibration

提前打开相机驱动

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0254 image:=/opencv_camera/image camera:=/opencv_camera

(1)--size 8x6: 为当前标定板的大小(如果你的棋盘格的小方格的个数是9x7,那么我们这里就写–size 8x6)

(2)--square 0.108:为每个小棋盘格的边长,单位是米,上面打印的标定版尺寸 (3)image:=/usb_cam/image_raw:标定当前订阅图像来源自名为/usb_cam/image_raw的topic

(4)camera:=/usb_cam:为摄像机名

所以需要一个打印出来的标定板,会更加准确。可以在我的资源里下载标定板

会打开标定界面

 在标定程序的界面能看到右侧有X Y Size Skew 还有CALIBRATE, SAVE 和COMMIT的标识

X:表示标定板在视野中的左右位置

Y:表示标定板在视野中的上下位置

Size:表示标定板在视野中的尺寸大小,其实就是离相机的远近

Skew:表示标定板在视野中的倾斜角度

 

没标定一张图片终端会有一行输出

等标定到三个参数变绿或者大于40张就可以进行 计算

然后save保存临时文件

会在终端输出相机参数

然后点击commit即可

如果出现按下commit卡住不动的情况,可以手动修改参数

对于保存的数据会在/tmp

cd /tmp
tar -xvzf calibrationdata.tar.gz

解压出的ost.txt内有参数

mv ost.txt ost.ini  #修改名字
rosrun camera_calibration_parsers convert ost.ini head_camera.yaml #转换成相机引用信息 
sudo mv head_camera.yaml ~/.ros/camera_info/    #移动到该文件下

这样驱动就会自动读取该文件

三、总结

到这里就完成了一个相机驱动的基本配置,可以作为yolo识别的相机话题数据进行应用。


这里提供我写的源码,可以参考

https://github.com/jiezz12/Opencv_ros.git

git clone https://github.com/jiezz12/Opencv_ros.git

参考:

usb_cam功能包源码

rocon_rtsp_camera_relay源码

https://blog.csdn.net/m0_56661101/article/details/132732905

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 | 7.网络安全

1.网络安全问题概述 &#xff08;1&#xff09;计算机网络面临的安全性威胁 <1>计算机网络面临的完全性威胁 计算机网络面临的两大类安全威胁&#xff1a;被动攻击和主动攻击 被动攻击 截获&#xff1a;从网络上窃听他人的通信内容。主动攻击 篡改&#xff1a;故意篡改…

机器翻译基础与模型 之四:模型训练

1、开放词表 1.1 大词表和未登陆词问题 理想情况下&#xff0c;机器翻译应该是一个开放词表&#xff08;Open Vocabulary&#xff09;的翻译任务。也就是&#xff0c;无论测试数据中包含什么样的词&#xff0c;机器翻译系统都应该能够正常翻译。 现实的情况是即使不断扩充词…

ThingsBoard规则链节点:Azure IoT Hub 节点详解

目录 引言 1. Azure IoT Hub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 设备管理 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备…

MongoDB相关问题

视频教程 【GeekHour】20分钟掌握MongoDB Complete MongoDB Tutorial by Net Ninja MongoDB开机后调用缓慢的原因及解决方法 问题分析&#xff1a; MongoDB开机后调用缓慢&#xff0c;通常是由于以下原因导致&#xff1a; 索引重建&#xff1a; MongoDB在启动时会重建索引…

三种蓝牙架构实现方案

一、蓝牙架构方案 1、hostcontroller双芯片标准架构 手机里面包含很多SoC或者模块&#xff0c;每颗SoC或者模块都有自己独有的功能&#xff0c;比如手机应用跑在AP芯片上&#xff0c;显示屏&#xff0c;3G/4G通信&#xff0c;WiFi/蓝牙等都有自己专门的SoC或者模块&#xff0…

sql工具!好用!爱用!

SQLynx的界面设计简洁明了&#xff0c;操作逻辑清晰易懂&#xff0c;没有复杂的图标和按钮&#xff0c;想对哪部分操作就在哪里点击右键&#xff0c;即使你是数据库小白也能轻松上手。 尽管SQLynx是一款免费的工具&#xff0c;但是它的功能却丝毫不逊色于其他付费产品&#xff…

UE5肉鸽游戏教程学习

学习地址推荐&#xff1a;UE5肉鸽项目实战教程_哔哩哔哩_bilibili

反向代理服务器的用途

代理服务器在网络中扮演着重要的角色&#xff0c;它们可以优化流量、保护服务器以及提高安全性。在代理服务器中&#xff0c;反向代理服务器是一种特殊类型&#xff0c;常用于Web服务器前&#xff0c;它具备多种功能&#xff0c;能够确保网络流量的顺畅传输。那么&#xff0c;让…

面试经典 150 题:205,55

205. 同构字符串 【解题思路】 来自大佬Krahets 【参考代码】 class Solution { public:bool isIsomorphic(string s, string t) {map<char, char> Smap, Tmap;for(int i0; i<s.size(); i){char a s[i], b t[i];//map容器存在该字符&#xff0c;且不等于之前映射…

信创改造 - TongRDS 替换 Redis

记得开放 6379 端口哦 1&#xff09;首先在服务器上安装好 TongRDS 2&#xff09;替换 redis 的 host&#xff0c;post&#xff0c;passwd 3&#xff09;TongRDS 兼容 jedis # 例如&#xff1a;更改原先 redis 中对应的 host&#xff0c;post&#xff0c;passwd 改成 TongRDS…

嵌入式工程师面试笔试总结——day1

第一章、进程与线程 1、什么是进程、线程&#xff0c;有什么区别&#xff1f; 进程是资源&#xff08; CPU 、内存等&#xff09;分配的基本单位&#xff0c;线程是 CPU 调度和分配的基本单位&#xff08;程序执行的最小单 位&#xff09;。同一时间&#xff0c;如果CPU 是单…

算法之区间和题目讲解

题干 难度&#xff1a;简单 题目分析 题目要求算出每个指定区间内元素的总和。 然而&#xff0c;区间在输入的最下面&#xff0c;所以按照暴力破解的思路&#xff0c;我们首先要遍历数组&#xff0c;把它的值都存进去。 然后&#xff0c;遍历下面的区间&#xff0c;从索引a…

泷羽sec-linux

基础之linux 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

用 Python 从零开始创建神经网络(十):优化器(Optimizers)(持续更新中...)

优化器&#xff08;Optimizers&#xff09; 引言1. 随机梯度下降/Stochastic Gradient Descent (SGD)2. 学习率&#xff08;Learning Rate&#xff09;3. 学习率衰减&#xff08;Learning Rate Decay&#xff09;4. 带动量的随机梯度下降法&#xff08;Stochastic Gradient Des…

UE5安装教程及设置

学习链接&#xff1a;01-安装UE5及设置_哔哩哔哩_bilibili

如何利用Python爬虫精准获得1688店铺的所有商品信息

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;尤其是在电商领域。1688作为中国领先的B2B电商平台&#xff0c;拥有丰富的商品数据。对于电商企业来说&#xff0c;获取这些数据对于市场分析、竞品研究等具有重要意义。本文将详细介绍如何使用Python编写爬虫程序&…

电子学习中的关键游戏化元素

游戏化彻底改变了电子学习领域&#xff0c;提供了一种使学习具有吸引力、互动性和有效性的方法。通过将类似游戏的功能集成到教育平台中&#xff0c;教育工作者可以增强动力&#xff0c;提高知识记忆&#xff0c;并创造动态的学习体验。游戏化的关键要素为设计与学习者产生共鸣…

docker镜像、容器、仓库介绍

docker docker介绍docker镜像命令docker容器命令docker仓库 docker介绍 官网 Docker 是一种开源的容器化平台&#xff0c;用于开发、部署和运行应用。它通过将应用程序及其依赖项打包到称为“容器”的单一包中&#xff0c;使得应用能够在任何环境下运行&#xff0c;不受底层系…

一些好的AI技术学习平台和资料(动态更新)

1. 大模型 1.1 提示词&#xff08;Prompt&#xff09; 目前&#xff0c;大模型技术已经深入到工作生活的方方面面&#xff0c;各技术大厂的大模型也层出不穷&#xff0c;从开始的OpenAI一家独大&#xff0c;到当今世界的“百模大战”。从一些日常使用的角度来说&#xff0c;模…

IDEA优雅debug

目录 引言一、断点分类&#x1f384;1.1 行断点1.2 方法断点1.3 属性断点1.4 异常断点1.5 条件断点1.6 源断点1.7 多线程断点1.8 Stream断点 二、调试动作✨三、Debug高级技巧&#x1f389;3.1 watch3.2 设置变量3.3 异常抛出3.4 监控JVM堆大小3.5 数组过滤和筛选 引言 使用ID…