ros代码中添加使用opencv库,cv::Mat和ros image之间的相互转换

https://blog.csdn.net/sunyoop/article/details/78630024

ros中很多时候要用到图形处理,这时就需要使用opencv库,本篇主要将怎么在ros现成node上使用opencv的库函数

1.修改编译脚本

第一步:在node所在的CMakefile文件中opencv库查找,例如:

  1. find_package( OpenCV REQUIRED COMPONENTS

  2. core

  3. highgui

  4. imgproc

  5. )

或者直接

find_package( OpenCV REQUIRED )


为的是在编译前到环境变量配置的路径中找到opencv package,如果找不到,那需要查看下LD_LIBRARY_PATH环境变量,或者有没有安装opencv

第二步:在target_link_libraries中增加以来库,例如:

target_link_libraries(xxxxxx ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})


增加目标链接时的依赖库

第三步:在所需使用的cpp文件中增加头文件,例如:

  1. #include <opencv2/core/core.hpp>

  2. #include <opencv2/imgproc/imgproc.hpp>

  3. #include <opencv2/highgui/highgui.hpp>

2.cvMat和ros image data之间的转换

ros中已提供现成的组建cv_bridge,方便大家来使用

第一步:需要在CMakefile中,增加如下:

find_package(catkin REQUIRED nodelet roscpp sensor_msgs cv_bridge)


如果cakin_package里面有内容,例如

[html] view plain copy

  1. <code class="language-html">catkin_package(  
  2.   INCLUDE_DIRS include  
  3.   LIBRARIES xxxxx  xxxx   xxxxx  
  4.   CATKIN_DEPENDS dynamic_reconfigure image_geometry image_transport nodelet roscpp sensor_msgs  
  5. )</code>  

也需要在最后CATKIN_DEPENDS中添加cv_bridge,改成如下

  1. catkin_package(

  2. INCLUDE_DIRS include

  3. LIBRARIES xxxxx xxxx xxxxx

  4. CATKIN_DEPENDS dynamic_reconfigure image_geometry image_transport nodelet roscpp sensor_msgs cv_bridge

  5. )

第二步:需要在package.xml中添加如下

  1. <build_depend>cv_bridge</build_depend>

  2. <run_depend>cv_bridge</run_depend>

第三步:需要在cpp文件中增加头文件,如下

#include <cv_bridge/cv_bridge.h>


就可以使用cv_bridge,使用方法可见链接http://wiki.ros.org/cv_bridge/Tutorials。

http://wiki.ros.org/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages

ROS使用OpenCV实现人脸识别,可以按照以下步骤进行: 1. 安装OpenCV 在Ubuntu 18.04下,可以使用以下命令安装OpenCV: ``` sudo apt-get install libopencv-dev ``` 2. 创建ROS使用以下命令创建ROS包: ``` catkin_create_pkg face_recognition roscpp rospy std_msgs sensor_msgs cv_bridge image_transport ``` 3. 创建ROS节点 在ROS创建一个名为`face_recognition_node.cpp`的ROS节点,并在其实现人脸识别算法。 首先,需要包含以下头文件: ```cpp #include <ros/ros.h> #include <sensor_msgs/Image.h> #include <cv_bridge/cv_bridge.h> #include <opencv2/opencv.hpp> ``` 然后,定义ROS节点类,并在类添加订阅器和回调函数,用于接收图像消息和进行人脸识别: ```cpp class FaceRecognitionNode { public: FaceRecognitionNode() { image_sub_ = nh_.subscribe("/camera/rgb/image_raw", 1, &FaceRecognitionNode::imageCallback, this); } void imageCallback(const sensor_msgs::Image::ConstPtr& msg) { 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; } // 人脸识别算法 cv::CascadeClassifier face_cascade; face_cascade.load("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"); std::vector<cv::Rect> faces; cv::Mat gray; cv::cvtColor(cv_ptr->image, gray, cv::COLOR_BGR2GRAY); cv::equalizeHist(gray, gray); face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30)); // 在图像绘制人脸框 for (size_t i = 0; i < faces.size(); i++) { cv::rectangle(cv_ptr->image, faces[i], cv::Scalar(0, 255, 0), 2); } // 发布识别结果 image_pub_.publish(cv_ptr->toImageMsg()); } private: ros::NodeHandle nh_; ros::Subscriber image_sub_; ros::Publisher image_pub_; }; ``` 在回调函数,将ROS图像消息转换OpenCV图像格式,并使用OpenCV的人脸识别算法`CascadeClassifier`进行人脸检测。检测到人脸后,在图像绘制人脸框,并将识别结果发布为ROS图像消息。 4. 编译ROS节点 使用以下命令编译ROS节点: ``` cd ~/catkin_ws catkin_make ``` 5. 运行ROS节点 在终端运行以下命令启动ROS节点: ``` rosrun face_recognition face_recognition_node ``` 接着,使用以下命令启动相机节点,向ROS节点发送图像消息: ``` roslaunch usb_cam usb_cam-test.launch ``` 最后,可以使用以下命令查看ROS节点发布的人脸识别结果: ``` rosrun image_view image_view image:=/face_recognition/image_raw ``` 这样就可以在ROS实现基于OpenCV的人脸识别功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值