在ROS中用openCV显示摄像头并发布图像数据

前言

自己也是刚开始学习ros和openCV,经常会踩很多坑,比如这次在ros中使用openCV,按照很多博客写的,最后要么死机,要么黑框。对此,经过请教学长,终于调通,分享给大家以供参考。

使用C++实现

#include <iostream>
#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h>  // 将ROS下的sensor_msgs/Image消息类型转化为cv::Mat数据类型
#include <sensor_msgs/image_encodings.h> // ROS下对图像进行处理
#include <image_transport/image_transport.h> // 用来发布和订阅图像信息

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/videoio.hpp>

int main(int argc, char** argv)
{
    ros::init(argc, argv, "imageGet_node");  // ros初始化,定义节点名为imageGet_node
    ros::NodeHandle nh;                      // 定义ros句柄
    image_transport::ImageTransport it(nh);  //  类似ROS句柄
    image_transport::Publisher image_pub = it.advertise("/cameraImage", 1);   // 发布话题名/cameraImage

    ros::Rate loop_rate(200);   // 设置刷新频率,Hz

    cv::Mat imageRaw;  // 原始图像保存
    cv::VideoCapture capture(0);   // 创建摄像头捕获,并打开摄像头0(一般是0,2....)

    if(capture.isOpened() == 0)      // 如果摄像头没有打开
    {
        std::cout << "Read camera failed!" << std::endl;
        return -1;
    }

    while(nh.ok())
    {
        capture.read(imageRaw);          // 读取当前图像到imageRaw
        cv::imshow("veiwer", imageRaw);  // 将图像输出到窗口
        sensor_msgs::ImagePtr  msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imageRaw).toImageMsg();  // 图像格式转换
        image_pub.publish(msg);         // 发布图像信息
        ros::spinOnce();                // 没什么卵用,格式像样
        loop_rate.sleep();              // 照应上面设置的频率
        if(cv::waitKey(2) >= 0)         // 延时ms,按下任何键退出(必须要有waitKey,不然是看不到图像的)
            break;        
    }
}

一定要注意,waitKey()必须要有,且不为0,其他大多博客这点都没有,导致出错
*ls -l /dev/ttyUSB 命令查看串口 **

CMakeLists.txt配置

添加(最后两个的image_Get是生成可执行文件的名字,根据自己来设定):

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(image_Get src/image_Get.cpp)
target_link_libraries(image_Get ${catkin_LIBRARIES} ${OpenCV_LIBS})

使用python实现

未完待续

查看usb串口使用情况

ls -l /dev/ttyUSB*

永久打开串口权限

若出现[Errno 13] Permission denied: '/dev/ttyUSB0’问题,可以用下面命令打开串口权限:

sudo chmod 777 /dev/ttyUSB0
sudo usermod -aG dialout nankel

其中nankel为用户名

ROS使用openCV进行图片接收,并显示

参考本人博客:订阅部分

客官!如果觉得有用,给俺点赞支持下呗!

欢迎留言讨论,指出不足和建议!

  • 13
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
ROS中,可以通过使用`image_transport`和`cv_bridge`库将摄像头节点发布图像数据转化为图像输出。具体步骤如下: 1. 首先,在ROS中启动摄像头节点,让其发布图像数据。 2. 在需要接收图像数据节点中,通过`image_transport`库创建一个图像订阅者对象,用于接收图像消息。例如,可以使用以下代码创建一个图像订阅者对象: ```python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge def callback(image_msg): # 将图像消息转化为OpenCV图像格式 cv_image = CvBridge().imgmsg_to_cv2(image_msg, "bgr8") # 在这里对图像进行处理或显示 # ... rospy.init_node('image_subscriber') image_sub = rospy.Subscriber('camera/image', Image, callback) ``` 在这个例子中,我们创建了一个名为`image_sub`的图像订阅者对象,订阅了名为`camera/image`的话题,并指定回调函数`callback`用于处理接收到的图像消息。 3. 在回调函数`callback`中,利用`cv_bridge`库将ROS图像消息转化为OpenCV图像格式,然后进行图像处理或显示。例如,可以使用以下代码将图像消息转化为OpenCV图像格式: ```python # 将图像消息转化为OpenCV图像格式 cv_image = CvBridge().imgmsg_to_cv2(image_msg, "bgr8") ``` 在这个例子中,我们使用`CvBridge()`类的`imgmsg_to_cv2()`方法将ROS图像消息`image_msg`转化为OpenCV图像格式,并将其存储在`cv_image`变量中。 4. 最后,可以使用OpenCV库将图像显示出来,或者将其保存到文件中。例如,可以使用以下代码将图像显示出来: ```python # 显示图像 cv2.imshow("Image", cv_image) cv2.waitKey(1) ``` 在这个例子中,我们使用OpenCV库的`imshow()`函数将图像显示在名为`Image`的窗口中,并使用`waitKey()`函数等待用户按下键盘上的任意键。注意,需要在代码中添加`cv2.waitKey(1)`语句以保证图像窗口能够正常显示

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nankel Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值