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

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/video0
    if(!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.kler.cn/a/414091.html

相关文章:

  • Facebook广告无法投放是什么原因?
  • H5流媒体播放器EasyPlayer.js网页直播/点播播放器如果H.265视频在播放器上播放不流畅,可以考虑的解决方案
  • 简释下oracle的set define的使用场景
  • 极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】
  • mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复
  • [UUCTF 2022 新生赛]ez_rce
  • Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?
  • OGRE 3D----5. OGRE和QML事件交互
  • HarmonyOS-初级(二)
  • Spring Boot整合EasyExcel
  • WPS文字学习计划与策略
  • 在受限网络环境下的 Docker 部署实践 —— Strapi 和 Appsmith 的解决之道20241128
  • python-解决一元一次方程
  • Unix和Linux之异同
  • 【后端开发】Go语言编程实践,Goroutines和Channels,基于共享变量的并发,反射与底层编程
  • 【人工智能】从零构建一个文本分类器:用Python和TF-IDF实现
  • 软件工程——期末复习(适用于sdut)
  • vue-baidu-map基本使用
  • webpack 项目访问静态资源
  • 新型实时的端到端对象检测器
  • 大电流PCB设计
  • 什么是BIOS
  • 天锐绿盾加密软件与Ping32联合打造企业级安全保护系统,确保敏感数据防泄密与加密管理
  • Python毕业设计选题:基于django+vue的智能停车系统的设计与实现
  • nodejs相关知识介绍
  • 【机器学习】机器学习的基本分类-监督学习-线性回归(Linear Regression)