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 Image
class 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