39 #include <opencv2/opencv.hpp> 
   45     DiagnosticNodelet::onInit();
 
   46     srv_ = boost::make_shared <dynamic_reconfigure::Server<Config> > (*pnh_);
 
   47     dynamic_reconfigure::Server<Config>::CallbackType 
f =
 
   50     srv_->setCallback (f);
 
   52       = advertise<sensor_msgs::Image>(*pnh_, 
"output/foreground", 1);
 
   54       = advertise<sensor_msgs::Image>(*pnh_, 
"output/background", 1);
 
   56       = advertise<sensor_msgs::Image>(*pnh_, 
"output/foreground_mask", 1);
 
   58       = advertise<sensor_msgs::Image>(*pnh_, 
"output/background_mask", 1);
 
   78     sync_ = boost::make_shared<message_filters::Synchronizer<SyncPolicy> >(100);
 
   96     stat.
summary(diagnostic_msgs::DiagnosticStatus::OK,
 
  101     const sensor_msgs::Image::ConstPtr& image_msg,
 
  102     const sensor_msgs::Image::ConstPtr& foreground_msg,
 
  103     const sensor_msgs::Image::ConstPtr& background_msg)
 
  108                                             image_msg->encoding)->image;
 
  109     if (in_image.channels() == 3) {
 
  112     else if (in_image.channels() == 1) {
 
  113       input = cv::Mat::zeros(in_image.rows, in_image.cols, CV_8UC3);
 
  114       for (
size_t j = 0; j < in_image.rows; ++j) {
 
  115         for (
size_t i = 0; 
i < in_image.cols; ++
i) {
 
  116           input.at<cv::Vec3b>(j, 
i) = cv::Vec3b(in_image.at<uchar>(j, i),
 
  117                                                 in_image.at<uchar>(j, 
i),
 
  118                                                 in_image.at<uchar>(j, i));
 
  126     if (!(
input.cols == foreground.cols &&
 
  127           input.rows == foreground.rows &&
 
  128           background.cols == foreground.cols &&
 
  129           background.rows == foreground.rows)) {
 
  133     cv::Mat mask = cv::Mat::zeros(
input.size(), CV_8UC1);
 
  134     mask.setTo(cv::Scalar::all(cv::GC_PR_BGD));
 
  135     for (
size_t j = 0; j < 
input.rows; j++) {
 
  136       for (
size_t i = 0; 
i < 
input.cols; 
i++) {
 
  137         if (foreground.at<uchar>(j, i) == 255) {
 
  139             mask.at<uchar>(j, 
i) = cv::GC_PR_FGD;
 
  142             mask.at<uchar>(j, 
i) = cv::GC_FGD;
 
  145         if (background.at<uchar>(j, i) == 255) {
 
  147             mask.at<uchar>(j, 
i) = cv::GC_PR_BGD;
 
  150             mask.at<uchar>(j, 
i) = cv::GC_BGD;
 
  159     cv::grabCut(input, mask, roi, bgd_model, fgd_model, 5, cv::GC_INIT_WITH_MASK);
 
  160     cv::Mat bgd, fgd, bgd_mask, fgd_mask;
 
  163     bgd_mask = (mask == cv::GC_BGD) | (mask == cv::GC_PR_BGD);
 
  165     fgd_mask = (mask == cv::GC_FGD) | (mask == cv::GC_PR_FGD);
 
  167     input.copyTo(bgd, bgd_mask);
 
  168     input.copyTo(fgd, fgd_mask);