ROS学习—opencv使用之图片传输
前提操作:ros已安装,opencv已安装。
首先在工作空间中新建一个功能包rosopencv
catkin_create_pkg rosopencv sensor_msgs cv_bridge roscpp std_msgs image_transport
编译一下catkin_make
,新建cpp文件如下
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include <stdio.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "image_publisher");
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);//用之前声明的节点句柄初始化it
image_transport::Publisher pub = it.advertise("camera/image", 1);
cv::Mat image = cv::imread("/home/ubuntu/Pictures/dog.jpg", CV_LOAD_IMAGE_COLOR);
cv::Mat image1 = cv::imread("/home/ubuntu/Pictures/cat.jpg", CV_LOAD_IMAGE_COLOR);
if(image.empty()||image1.empty())
{
printf("open error\n");
}
cv::imshow("",image);
cv::waitKey(3000);
//cv::imshow("",image1);
//cv::waitKey(3000);
cv::destroyWindow("");
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();//图像格式转换
//sensor_msgs::ImagePtr msg1 = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image1).toImageMsg();
ros::Rate loop_rate(1);//每秒1帧
while (nh.ok())
{
pub.publish(msg);
//sleep(0.5);
//pub.publish(msg1);
ros::spinOnce();
loop_rate.sleep();
}
}
代码很简单,注释的几句是实现两张图片切换发送的功能,可以去除注释。
在CMake文件添加
find_package(OpenCV REQUIRED)#注意此处的REQUIRED,没有编译会报错
include_directories(${
catkin_INCLUDE_DIRS} ${
OpenCV_INCLUDE_DIRS})
add_executable(rosopencv ./src/rosopencv.cpp)
target_link_libraries(rosopencv ${
OpenCV_LIBS})
target_link_libraries(rosopencv ${
catkin_LIBRARIES})
下面是接收的程序,新建接收功能包,并且接收的cmake文件修改与上述类似改之。
catkin_create_pkg recieve sensor_msgs cv_bridge roscpp std_msgs image_transport
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);
cv::waitKey(400);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "image_listener");
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
ros::spin();
}
效果,两张图片切换发送与显示