ROS中使用opencv

在ROS中使用opencv的小例程

记录在ROS中学习使用opencv的过程

安装opencv

我们首先需要在ubuntu下安装ubuntu版本的opencv,

  1. 下载opencv的Linux版本,最好将contrib库也下载下来(同样是Linux版本),注意两者的兼容性,并安装好一些依赖库
  2. 参照网上教程安装GUI版本的cmake,以及后续的opencv编译。在第一次点完configure之后在上面的配置窗口找到OPENCV_EXTRA_MODULE_PATH,将opencv_contrib库中mudules的路径加入进去,然后再configure,无问题后generate。
    然后按照博客教程编译,make install后在/usr/local/lib中可以看到装好的opencv库文件(注意改路径),以及contrib库中的各种库文件,具体的安装代码如下:
sudo apt-get install cmake

sudo apt-get install cmake-qt-gui
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
sudo cmake-gui

cd opencv_source/mybuild/

sudo make -j4
sudo make install
配置库路径
sudo gedit /etc/ld.so.conf.d/opencv.conf
添加opencv库的安装路径:
/usr/local/lib

sudo ldconfig

sudo gedit /etc/bash.bashrc

添加PKG_CONFIG_PATH变量:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

建立OpenCV测试程序

准备工作

很喜欢这段话,作者将ROS中的各个概念解释地很清楚,工作空间(work space)是ROS中非常重要的一个概念,可以把工作空间理解为一个大的工厂,里面的分成几个大的生产车间(package),每一个生产车间中会有若干个具有不同技能的工人(node)。当工厂运转时,每个车间中的工人node同时工作,他们通过话题(topic)进行信息沟通。各个大的车间之间也存在这互相依赖的关系,共同组成一个有机的整体。
我们新建一个工作空间(和我们之间建立的工作空间catkin_ws一样)

mkdir -p ros_opencv/src

然后初始化工作空间(和我们之前做的一样,再来一遍)

 cd ros_opencv/src
 catkin_init_workspace

在src文件夹下创建package,功能包的名字叫做opencv_test

 catkin_create_pkg opencv_test sensor_msgs cv_bridge roscpp std_msgs image_transport

注意这一步很多网上的教程加上了opencv库,可能是ROS里面装的OpenCV,我推测如果是用自己安装的opencv库的话。后面是不用加的。我没加反而后面编译成功了。
修改opencv_test目录下的CMakeLists.txt
主要在find_package加上

find_package(OpenCV REQUIRED)

以及最后面加上

include_directories(include ${OpenCV_INCLUDE_DIRS})
include_directories(include ${catkin_INCLUDE_DIRS})
 
add_executable(opencv_test_node src/opencv_test_node.cpp)
target_link_libraries(opencv_test_node ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
add_dependencies(opencv_test_node opencv_test_gencpp)

然后你需要下载一张图片放在一个已知的位置,为读取图片做准备

程序

说了这么多,可以上主程序了

#include <ros/ros.h>
#include <stdio.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
 
static const char WINDOW[] = "Image window";
static void help()
{
    printf("\nThis program demonstrates converting OpenCV Image to ROS Image messages  \n"
        );
 
}
 
int main(int argc, char** argv)
{
  help();
  ros::init(argc, argv, "image_converter");
 
  //Reading an image from the file
  cv::Mat cv_image = cv::imread("/home/vlt/Pictures/1.jpg");
  if(cv_image.empty() )
    {
        ROS_ERROR("Read the picture failed!");
        return -1;
    }
 
  //Convert OpenCV image to ROS message
  ros::NodeHandle node;
  image_transport::ImageTransport transport(node);
  image_transport::Publisher image_pub; 
  image_pub=transport.advertise("OutImage", 1);
  ros::Time time=ros::Time::now(); 
 
  cv_bridge::CvImage cvi;
  cvi.header.stamp = time;
  cvi.header.frame_id = "image";
  cvi.encoding = "bgr8";
  cvi.image = cv_image;
 
  sensor_msgs::Image im;
  cvi.toImageMsg(im);
  image_pub.publish(im);
  ROS_INFO("Converted Successfully!");
 
  //Show the image
  cv::namedWindow(WINDOW);
  cv::imshow(WINDOW,cv_image);
  cv::waitKey(0);
 
  ros::spin();
  return 0;
}

后面还需要编译

cd ros_opencv
catkin_make

编译成功大概是这样的
编译成功!
之后就可以运行了

roscore
source devel/setup.bash
rosrun opencv_test opencv_test_node

运行成功就可以出现漂亮的小仙女啦!
在这里插入图片描述
OK!祝大家也运行成功!

参考链接
1:需要用到OpenCV依赖库的CMakeLists注意事项
2:ROS初级教程cmake cmakelist.txt的编写教程,让你看懂一大堆cmakelist里面写的是什么
3:程序参考

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的人脸识别功能。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值