运用ROS和OpenCV进行简单的图像处理之检测

本文主要讲述在ROS下使用opencv进行图像处理,并给出了一个详细示例。


首先建立一个ros包,在CMakeLists.txt中加入以下代码段,用于找到并链接OpenCV。安装完整版的ROS会顺带把OpenCV 2.4.x也装了,不过可能不太完整,缺一些头文件或者库之类的。最好自己再装一遍,直接去OpenCV官网或者github下载源码编译安装,也可对Ubuntu系统下安装依赖性有进一步了解。如系统中存在多个opencv版本的情况,可参考《ubuntu 安装使用多版本opencv》这篇博客。

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

在ROS中通过cv_bridge包实现ros图像和opencv图像的转换,通过image_transport包订阅和发布图像数据。

此外,ros indigo版本的cv_bridge依赖于opencv2.4.x。如果自己装的版本过高,可能会存在兼容性问题,导致图像或视频无法加载。其解决办法可参考博文《OpenCV 3与ROS兼容、OpenCV多版本共存》,主要是下载cv_bridge后重新编译。

ROS和OpenCV的关系图如下,图片来源于ros官网。


下面介绍一个简单的图像处理示例,实现对黑色条纹的检测(有点类似于智能车比赛的摄像头组微笑)。由于黑色像素较为明显,因此先对图像进行灰度处理变成单通道的,再进行Ostu阈值分割(大津法),得到二值化的图像就只有0和1了,其中为0的部分为黑色。

关键代码段如下:

    cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);
    cv::Mat gray;
    cv::Mat edges;
    cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    cv::threshold(gray, edges, 76, 255, CV_THRESH_OTSU);   //参数76可设置成自动调节

我写了两个节点,一个用于加载图像并进行图像,一个用于显示图像,两个要同时运行才可看到效果。运行时别忘了source工作空间,并打开roscore。

rosrun img_process read_img_node argv[1]
rosrun img_process show_img_node

运行中的效果截图如下:


以上是针对静态图像的处理,如果视频流和从摄像头获取的,图像处理的过程还是一样,只是获取的地方改成如下:

cv::VideoCapture cap(argv[1]);   //传入摄像头参数或视频文件目录
if(!cap.isOpened())
    return;
cv::Mat frame;
cap >> frame;                    //这样便可实时获取图像数据

此外,笔者还提供了matlab程序进行同样的处理,效果如下(貌似在ros下效果好点微笑):



不过总的来说,这只是一个简单的示例,实际运用中还有很多没有考虑的地方,如光照、噪点等。


整个工程的源代码在下面的网址可以下到:

https://github.com/WelinLee/ROS_OPENCV_PRO


  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中结合OpenCV进行图像检测,可以使用以下步骤: 1. 订阅图像话题 首先,需要订阅相机或其他设备发布的图像话题,并将其转换为OpenCV可处理的格式。可以使用ROS自带的`cv_bridge`包将ROS图像消息转换为OpenCV图像格式。以下是一个示例代码,订阅名为`/camera/image_raw`的图像话题,并将其转换为OpenCV图像: ```python import rospy import cv2 from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError bridge = CvBridge() def image_callback(msg): try: cv_image = bridge.imgmsg_to_cv2(msg, "bgr8") except CvBridgeError as e: print(e) else: # 在这里进行图像检测 # ... rospy.init_node('image_subscriber') image_topic = "/camera/image_raw" rospy.Subscriber(image_topic, Image, image_callback) rospy.spin() ``` 在上述代码中,`image_callback`函数将接收到的ROS图像消息转换为OpenCV图像,并在其中进行图像检测。 2. 进行图像检测 一旦将图像转换为OpenCV格式,就可以使用OpenCV库中的函数进行图像处理检测。例如,可以使用OpenCV中的`cv2.CascadeClassifier`类来进行人脸检测。以下是一个示例代码: ```python import rospy import cv2 from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError bridge = CvBridge() face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') def image_callback(msg): try: cv_image = bridge.imgmsg_to_cv2(msg, "bgr8") except CvBridgeError as e: print(e) else: gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x,y,w,h) in faces: cv2.rectangle(cv_image,(x,y),(x+w,y+h),(255,0,0),2) cv2.imshow("Image window", cv_image) cv2.waitKey(3) rospy.init_node('image_subscriber') image_topic = "/camera/image_raw" rospy.Subscriber(image_topic, Image, image_callback) rospy.spin() ``` 在上述代码中,`haarcascade_frontalface_default.xml`是一个预训练的分类器文件,用于人脸检测。代码中使用`cv2.CascadeClassifier`类加载该文件,并使用`detectMultiScale`函数进行人脸检测检测到人脸后,代码在图像中绘制矩形框以标记人脸。 3. 显示图像结果 最后,将检测结果显示在图像窗口中。可以使用OpenCV的`cv2.imshow`函数显示图像,用`cv2.waitKey`函数等待键盘输入,以保持图像窗口的显示。以下是示例代码: ```python cv2.imshow("Image window", cv_image) cv2.waitKey(3) ``` 希望这些步骤可以帮助您在ROS中结合OpenCV进行图像检测

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值