Beispiel #1
0
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());
  }