#include #include #include #include "std_msgs/String.h" #include #include #include #include //make sure to include the relevant headerfiles #include #include #include #include #include #include #include #include /*here is a simple program which demonstrates the use of ros and opencv to do image manipulations on video streams given out as image topics from the monocular vision of robots,here the device used is a ardrone(quad-rotor).*/ using namespace std; using namespace cv; namespace enc = sensor_msgs::image_encodings; static const char WINDOW[] = "Image window"; class simplecanny { ros::NodeHandle nh_; ros::NodeHandle n; ros::Publisher pub ; image_transport::ImageTransport it_; image_transport::Subscriber image_sub_; //image subscriber image_transport::Publisher image_pub_; //image publisher(we subscribe to ardrone image_raw) std_msgs::String msg; public: simplecanny() : it_(nh_) { image_sub_ = it_.subscribe("/ardrone/image_raw", 1, &simplecanny::imageCb, this); image_pub_= it_.advertise("/arcv/Image",1); } ~simplecanny() { cv::destroyWindow(WINDOW); } void imageCb(const sensor_msgs::ImageConstPtr& msg) { sensor_msgs::CvBridge bridge;//we need this object bridge for facilitating conversion from ros-img to opencv IplImage* img = bridge.imgMsgToCv(msg,"bgr8"); //image being converted from ros to opencv using cvbridge IplImage* out1 = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 ); //make sure to feed the image(img) data to the parameters necessary for canny edge output IplImage* gray_out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 ); IplImage* canny_out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 ); IplImage* gray_out1=cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 ); IplImage* img1 = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 ); cvCvtColor(img, gray_out, CV_BGR2GRAY); cvSmooth(gray_out, gray_out, CV_GAUSSIAN, 9, 9); cvCanny( gray_out, canny_out, 50, 125, 3 ); cvCvtColor(canny_out ,gray_out1, CV_GRAY2BGR); cvShowImage( "ARDRONE FEED",img); cvShowImage( " CANNY EDGE DETECTION ",gray_out1); cvWaitKey(2); } }; int main(int argc, char** argv) { ros::init(argc, argv, "simple_canny"); simplecanny ic; ros::spin(); return 0; }