ros中使用opencv处理图像

cv_bridge::toCvCopy():ROS下的sensor_msgs/ImageConstPtr,和图像压缩类型(例如:sensor_msgs::image_encodings::RGB8),Subscriber 来的图像不能直接使用,需要copy出来。其功能是实现复制图像信息这样,得到副本,这样我们可以从副本的CvImage中提取cv::Mat类型的图像进行处理。

例如

void convert_callback(const sensor_msgs::ImageConstPtr& msg) 
    {
        cv_bridge::CvImagePtr cv_ptr; // 声明一个CvImage指针的实例
 
        try
        {
            cv_ptr =  cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::RGB8); //将ROS消息中的图象信息提取,生成新cv类型的图象,复制给CvImage指针
        }
        catch(cv_bridge::Exception& e)  //异常处理
        {
            ROS_ERROR("cv_bridge exception: %s", e.what());
            return;
        }
 
        image_process(cv_ptr->image); //得到了cv::Mat类型的图象,在CvImage指针的image中,将结果传送给处理函数   
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值