1. C++ 保存图像
#include <ros/ros.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>
#include<iostream>
using namespace std;
using namespace cv;
long int count_ =0000;//不能命名成count
int n=0;
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
cv_bridge::CvImagePtr cv_ptr;
try //对错误异常进行捕获,检查数据的有效性
{
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
char base_name[256];
if(n%10==0)
{
sprintf(base_name,"/home/zhy/Documents/data/%04ld.jpg",count_++);
imwrite(base_name, cv_ptr->image);
}
n++;
}
catch(cv_bridge::Exception& e) //异常处理
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "msg2img2");
ros::NodeHandle nh_;
ros::Subscriber image_sub_ = nh_.subscribe("/pylon_camera_node/image_raw", 1, imageCallback);///middle/pylon_camera_node/image_raw/compressed
ros::spin();
return 0;
}
2. python 保存图像
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import rospy
from sensor_msgs.msg import Image
import sys
ros_path = '/opt/ros/kinetic/lib/python2.7/dist-packages'
if ros_path in sys.path:
sys.path.remove(ros_path)
import cv2
from cv_bridge import CvBridge, CvBridgeError
bridge = CvBridge()
class listener:
def __init__(self):
rospy.init_node('listener', anonymous=True)
self.num=0000
image_sub = rospy.Subscriber("/obstacel_images",Image, self.callback,queue_size=1)
rospy.spin()
def callback(self,data):
try:
cv_image = bridge.imgmsg_to_cv2(data, "bgr8")
frame=cv_image
cv2.imwrite("/home/zhy/Documents/Perception/camera_data/lane_image_basler/T5G_data/result/" + str(self.num)+ '.jpg',frame)
self.num+=1
cv2.namedWindow("detect")
cv2.imshow("detect", cv_image)
cv2.waitKey(1)
except CvBridgeError as e:
print(e)
if __name__ == '__main__':
listener()
3. 保存成时间戳的图像
#include <ros/ros.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>
#include<iostream>
#include <sensor_msgs/Image.h>
#include <ros/time.h>
using namespace std;
using namespace cv;
long int count_ =0000;//不能命名成count
int n=0;
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
cv_bridge::CvImagePtr cv_ptr;
try //对错误异常进行捕获,检查数据的有效性
{
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
char base_name[256];
// if(n%20==0)
// {
//sprintf(base_name,"/home/zhy/Documents/data/%04ld.jpg",count_++);
std::sprintf(base_name,"/home/zhy/Documents/data/%ld.jpg", msg->header.stamp.toNSec());//获取ROS时间戳
cv::imwrite(base_name, cv_ptr->image);
ROS_INFO_STREAM("Saved image to " << base_name);
// }
// n++;
}
catch(cv_bridge::Exception& e) //异常处理
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
// // 获取ROS时间戳并生成文件名
// std::string filename =std::to_string(msg->header.stamp.toNSec()) + ".jpg";
// // 保存图像到文件
// cv::imwrite(filename, cv_ptr->image);
// ROS_INFO_STREAM("Saved image to " << filename);
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "msg2img2");
ros::NodeHandle nh_;
ros::Subscriber image_sub_ = nh_.subscribe("/cam_front_center/csi_cam/image_raw", 1, imageCallback);///middle/pylon_camera_node/image_raw/compressed
ros::spin();
return 0;
}