ros 16.04环境下 用opencv 做图像识别代码
时间: 2024-02-21 22:56:43 浏览: 71
好的,以下是使用OpenCV在ROS 16.04环境下进行图像识别的示例代码:
```cpp
#include <ros/ros.h>
#include <opencv2/opencv.hpp>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/image_encodings.h>
#include <image_transport/image_transport.h>
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
try
{
// 将ROS图像消息转换为OpenCV图像格式
cv::Mat image = cv_bridge::toCvShare(msg, "bgr8")->image;
// 在图像上执行一些操作,例如进行人脸检测
std::vector<cv::Rect> faces;
cv::CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_alt.xml");
face_cascade.detectMultiScale(image, faces, 1.1, 2, 0|cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
// 在每个检测到的人脸周围画一个矩形框
for (size_t i = 0; i < faces.size(); i++)
{
cv::rectangle(image, faces[i], cv::Scalar(0, 255, 0), 2);
}
// 显示结果
cv::imshow("Image", image);
cv::waitKey(1);
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
}
}
int main(int argc, char** argv)
{
// 初始化ROS节点
ros::init(argc, argv, "image_subscriber");
ros::NodeHandle nh;
// 创建一个图像传输对象
image_transport::ImageTransport it(nh);
// 订阅图像话题
image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
// 进行循环等待回调函数
ros::spin();
return 0;
}
```
在这个示例代码中,我们订阅了一个名为`camera/image`的图像话题。当收到图像消息时,我们将它转换为OpenCV图像格式,并在图像上执行人脸检测。最后,我们在每个检测到的人脸周围画一个矩形框,并将结果显示出来。
阅读全文