int main(int argc, char *argv[]) { /* Load the image and convert to Lab colour space. */ cv::Mat image = cv::imread(argv[1], 1); cv::Mat lab_image; cv::cvtColor(image, lab_image, CV_BGR2Lab); /* Yield the number of superpixels and weight-factors from the user. */ int w = image.cols, h = image.rows; int nr_superpixels = atoi(argv[2]); int nc = atoi(argv[3]); double step = sqrt((w * h) / (double) nr_superpixels); /* Perform the SLIC superpixel algorithm. */ Slic slic; slic.generate_superpixels(lab_image, step, nc); slic.create_connectivity(lab_image); std::vector<std::vector<cv::Point> > pointSets = slic.generatePointSets(image); /* Display the contours and show the result. */ // slic.colour_with_cluster_means(image); slic.display_contours(image, cv::Vec3b(0,0,255)); std::vector<std::vector<int> > edges = slic.generateGraph(image); slic.displayGraph(image, edges, cv::Vec3b(0,255,255)); slic.display_center_grid(image, cv::Vec3b(0, 0, 0)); // std::vector<std::vector<cv::Point> > polys = slic.generateBoundingPolys(image); // slic.displayBoundingPolys(image, polys, cv::Vec3b(255,0,0)); // std::vector<cv::Rect> boxes = slic.generateBoundingBoxes(image); // slic.displayBoundingBoxes(image, boxes, cv::Vec3b(0, 255, 255)); // std::vector<cv::RotatedRect> boxes = slic.generateRotBoundingBoxes(image); // slic.displayRotBoundingBoxes(image, boxes, cv::Vec3b(0, 255, 255)); // std::cout << boxes[0].size() << std::endl; cv::namedWindow("result", CV_WINDOW_AUTOSIZE); cv::imshow("result", image); cv::waitKey(0); cv::imwrite(argv[4], image); }
void SLICSuperPixels::imageCallback(const sensor_msgs::Image::ConstPtr& image) { boost::mutex::scoped_lock lock(mutex_); cv::Mat in_image = cv_bridge::toCvShare(image, image->encoding)->image; cv::Mat bgr_image; if (in_image.channels() == 1) { // gray image cv::cvtColor(in_image, bgr_image, CV_GRAY2BGR); } else if (image->encoding == sensor_msgs::image_encodings::RGB8) { // convert to BGR8 cv::cvtColor(in_image, bgr_image, CV_RGB2BGR); } else { bgr_image = in_image; } //cv::Mat bgr_image = cv_ptr->image; cv::Mat lab_image, out_image, mean_color_image, center_grid_image; // slic if (debug_image_) { bgr_image.copyTo(out_image); bgr_image.copyTo(mean_color_image); bgr_image.copyTo(center_grid_image); } cv::cvtColor(bgr_image, lab_image, CV_BGR2Lab); int w = image->width, h = image->height; double step = sqrt((w * h) / (double) number_of_super_pixels_); Slic slic; slic.generate_superpixels(lab_image, step, weight_); slic.create_connectivity(lab_image); if (debug_image_) { // creating debug image may occur seg fault. // So, publish_debug_images was added, in order to create debug image explicitly // See https://github.com/jsk-ros-pkg/jsk_recognition/pull/2181 slic.colour_with_cluster_means(mean_color_image); slic.display_center_grid(center_grid_image, cv::Scalar(0, 0, 255)); slic.display_contours(out_image, cv::Vec3b(0,0,255)); pub_debug_.publish(cv_bridge::CvImage( image->header, sensor_msgs::image_encodings::BGR8, out_image).toImageMsg()); pub_debug_mean_color_.publish(cv_bridge::CvImage( image->header, sensor_msgs::image_encodings::BGR8, mean_color_image).toImageMsg()); pub_debug_center_grid_.publish(cv_bridge::CvImage( image->header, sensor_msgs::image_encodings::BGR8, center_grid_image).toImageMsg()); } // publish clusters cv::Mat clusters; cv::transpose(slic.clusters, clusters); clusters = clusters + cv::Scalar(1); pub_.publish(cv_bridge::CvImage( image->header, sensor_msgs::image_encodings::TYPE_32SC1, clusters).toImageMsg()); }