OpenCV库及在ROS中使用
依赖
cv_bridge image_transport roscpp rospy sensor_msgs std_msgs
CMakeLists.txt添加
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(pub_img_topic ${catkin_LIBRARIES} ${Opencv_LIBS})
C++
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>int main(int argc, char** argv)
{ros::init(argc, argv, "publisher_img");ros::NodeHandle nh;image_transport::ImageTransport it(nh);image_transport::Publisher pub = it.advertise("image", 1);cv::Mat image = cv::imread("/home/ghigher/workplace/pointcloud_ws/src/pub_sub_image/images/ros_logo.png");if (image.empty()){ROS_INFO("Image is Empty!");}sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();ros::Rate loop_rate(5);while(nh.ok()){pub.publish(msg);ros::spinOnce();loop_rate.sleep();}
}
python
#! /usr/bin/env python
# -*-coding:utf8 -*-import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Imageclass image_converter:def __init__(self):self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)self.bridge = CvBridge()self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)def callback(self, imgmsg):cv_image = self.bridge.imgmsg_to_cv2(imgmsg, "bgr8")cv_image_gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)cv2.imshow("image", cv_image_gray)cv2.waitKey(1)self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image_gray))if __name__ == "__main__":try:rospy.init_node("cv_to_bridge")rospy.loginfo("Starting cv_bridge node ...")image_converter()rospy.spin()except KeyboardInterrupt:rospy.loginfo("Shutdown cv_bridge node !!!")cv2.destroyAllWindows()
查看rqt_image_view