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);