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

Opencv+ROS实现摄像头读取处理画面信息

一、工具

ubuntu18.04

ROS+opencv2

编译器:Visual Studio Code

二、原理

图像信息

ROS数据形式:sensor_msgs::Image

OpenCV数据形式:cv:Mat

通过cv_bridge()函数进行ROS向opencv转换

cv_bridge是在ROS图像消息和OpenCV图像之间进行转换的一个功能包。

ros->opencv

cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);

可以在回调函数里进行转换

    cv_bridge::CvImagePtr cv_ptr;try{cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);}catch (cv_bridge::Exception& e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}

 将ROS图像消息转换在OpenCV中使用,可以进行图像处理和opencv操作。

opencv->ros

使用toImageMsg()成员函数

try
{msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();  
}catch (cv_bridge::Exception& e)
{ROS_ERROR("cv_bridge exception:%s",e.what());
}

 驱动相机

通过opencv直接打开相机0,vieo_device为video0

 VideoCapture cap(video_device);  //dev/video0if(!cap.isOpened())   {  ROS_ERROR("Can not opencv video device\n");  return 1;  }  

话题发布

ROS中标准的消息订阅和发布方式为

ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("topic", 1, Callback);
ros::Publisher pub = nh.advertise<sensor_msgs::Image>("topic", 1);

只会发布单一话题

使用image_transport进行发布话题

ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("topic", 1, Callback);
image_transport::Publisher pub = it.advertise("topic", 1);

 这种方式会发布一系列话题

 然后将转换后的图像发布即可

三、使用

在摄像头画面加一个圆并发布出去

通过rqt_image_view查看话题

这里只进行简单的使用,后续可以通过opencv进行颜色识别,轮廓识别等等,以及人脸数字识别,将所有的opencv项目通过ROS包装起来。

这里附上源码链接

https://github.com/jiezz12/Opencv_ros.giticon-default.png?t=O83Ahttps://github.com/jiezz12/Opencv_ros.git

参考:

http://wiki.ros.org/image_transport

https://my.oschina.net/u/4273421/blog/3587403

http://www.lryc.cn/news/490831.html

相关文章:

  • 网络安全,文明上网(2)加强网络安全意识
  • 深度学习实战图像缺陷修复
  • jenkins 2.346.1最后一个支持java8的版本搭建
  • 【数据库原理】创建与维护表,DDL数据定义语言
  • 驾驭Go语言中的不确定性:深入错误处理机制
  • 3D Gaussian Splatting在鱼眼相机中的应用与投影变换
  • 【Unity踩坑】在Mac上安装Cocoapods失败
  • uni-app 认识条件编译,了解多端部署
  • SPA 首屏加载慢的原因及解决方案:结合实际项目的详细讲解
  • vue3+ts el-tabel 搜索组件
  • leetcode 排序算法汇总
  • 【C】错误的变量定义导致sprintf()‌输出错误
  • python基础导包
  • 【含开题报告+文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现
  • strlwr(arr);的模拟实现(c基础)
  • LCR 002. 二进制求和
  • MySQL-C3P0连数据库报错问题
  • 云计算期中作业:Spark机器学习问题解决
  • 计算机网络socket编程(6)_TCP实网络编程现 Command_server
  • RabbitMQ 集群
  • 从零开始:使用 Spring Boot 开发图书管理系统
  • 速盾:海外服务器使用CDN加速有什么优势?
  • (二)手势识别——动作模型训练【代码+数据集+python环境(免安装)+GUI系统】
  • window系统下使用open-webui+ollama部署大模型
  • 一加ACE 3 Pro手机无法连接电脑传输文件问题
  • 因果机器学习EconML | 客户细分案例——基于机器学习的异质性处理效果估计
  • 找到最大“葫芦”组合
  • shell(9)完结
  • 【计算机网络】多路转接之select
  • 数据库-基础理论