If you just want to save an image, just have a look at the cv_bridge tutorial
http://wiki.ros.org/cv_bridge/Tutoria...
And add a cv::imwrite after the image was converted to cv::Mat:
#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 <sstream> // Added this
static const std::string OPENCV_WINDOW = "Image window";
class ImageConverter
{
ros::NodeHandle nh_;
image_transport::ImageTransport it_;
image_transport::Subscriber image_sub_;
image_transport::Publisher image_pub_;
public:
ImageConverter()
: it_(nh_)
{
// Subscrive to input video feed and publish output video feed
image_sub_ = it_.subscribe("/camera/image_raw", 1,
&ImageConverter::imageCb, this);
image_pub_ = it_.advertise("/image_converter/output_video", 1);
cv::namedWindow(OPENCV_WINDOW);
}
~ImageConverter()
{
cv::destroyWindow(OPENCV_WINDOW);
}
void imageCb(const sensor_msgs::ImageConstPtr& 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;
}
// Draw an example circle on the video stream
if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));
// Update GUI Window
cv::imshow(OPENCV_WINDOW, cv_ptr->image);
cv::waitKey(3);
static int image_count = 0; // added this
std::stringstream sstream; // added this
sstream << "my_image" << image_count << ".png" ; // added this
ROS_ASSERT( cv::imwrite( sstream.str(), cv_ptr->image ) ); // added this
image_count++; // added this
// Output modified video stream
image_pub_.publish(cv_ptr->toImageMsg());
}
};
int main(int argc, char** argv)
{
ros::init(argc, argv, "image_converter");
ImageConverter ic;
ros::spin();
return 0;
}
This should save you the images with ascending counter locally in the folder where you start the node via rosrun .....
Add what happend? Error or something?
there is no error but also It is not saving any images. I seached in net somewhere i found that I should use latest opencv for that..but i dont want to install that one.
Does the folder "//home//keshav//" exist? Usually it should be "/home/keshav/image.jpg" but that should not matter... Does imwrite return true? It should return true on success...
hoe to check that one..
if ( cv::imwrite("//home//keshav//image.jpg",cv_bridge::toCvShare(msg, "bgr8")->image) ) { ROS_INFO( "Returned true" ); } else { ROS_INFO( "Returned false" ); }
try { cv::imshow("view", cv_bridge::toCvShare(msg,"bgr8")->image); cv_ptr = cv_bridge::toCvCopy(msg, enc::BGR8);
if ( cv::imwrite("//home//keshav//image.jpg",cv_bridge::toCvShare(msg, "bgr8")->image) ) { ROS_INFO( "Returned true2" ); } else { ROS_INFO( "Returned false2" ); } }
It is neither returning true nor false.. :-(
I have to create ROS nodes, one node can capture images using webcam & 2nd node can publish and third node can subscribe. first am unable to capture also, I can publish and subscribe but imwrite is not working. Mr. Wolf plz share some solid links or code that I can easily execute for this purpose