37 #include <jsk_topic_tools/log_utils.h>
67 DiagnosticNodelet::onInit();
69 pnh_->param(
"use_mask",
use_mask_,
false);
72 b_hist_pub_ = advertise<jsk_recognition_msgs::ColorHistogram>(
73 *pnh_,
"blue_histogram", 1);
74 g_hist_pub_ = advertise<jsk_recognition_msgs::ColorHistogram>(
75 *pnh_,
"green_histogram", 1);
76 r_hist_pub_ = advertise<jsk_recognition_msgs::ColorHistogram>(
77 *pnh_,
"red_histogram", 1);
78 h_hist_pub_ = advertise<jsk_recognition_msgs::ColorHistogram>(
79 *pnh_,
"hue_histogram", 1);
80 s_hist_pub_ = advertise<jsk_recognition_msgs::ColorHistogram>(
81 *pnh_,
"saturation_histogram", 1);
82 i_hist_pub_ = advertise<jsk_recognition_msgs::ColorHistogram>(
83 *pnh_,
"intensity_histogram", 1);
85 *pnh_,
"input_image", 1);
87 srv_ = boost::make_shared <dynamic_reconfigure::Server<Config> > (*pnh_);
88 dynamic_reconfigure::Server<Config>::CallbackType
f =
90 srv_->setCallback (f);
100 names.push_back(
"screenrectangle");
102 = boost::make_shared<message_filters::Synchronizer<SyncPolicy> >(10);
104 sync_->registerCallback(boost::bind(
111 names.push_back(
"mask");
120 jsk_topic_tools::warnNoRemap(names);
137 jsk_recognition_msgs::ColorHistogram& msg)
139 msg.histogram.clear();
140 for (
int i = 0;
i < size;
i++) {
141 float val =
hist.at<
float>(0,
i);
142 msg.histogram.push_back(val);
148 const std_msgs::Header& header)
150 float range[] = { 0, 256 } ;
151 const float* histRange = { range };
152 cv::MatND b_hist, g_hist, r_hist;
153 bool uniform =
true;
bool accumulate =
false;
154 std::vector<cv::Mat> bgr_planes;
155 split(bgr_image, bgr_planes);
157 cv::calcHist(&bgr_planes[0], 1, 0, mask, b_hist, 1, &
b_hist_size_,
158 &histRange, uniform, accumulate);
159 cv::calcHist(&bgr_planes[1], 1, 0, mask, g_hist, 1, &
g_hist_size_,
160 &histRange, uniform, accumulate);
161 cv::calcHist(&bgr_planes[2], 1, 0, mask, r_hist, 1, &
r_hist_size_,
162 &histRange, uniform, accumulate);
164 jsk_recognition_msgs::ColorHistogram b_histogram;
165 b_histogram.header =
header;
169 jsk_recognition_msgs::ColorHistogram g_histogram;
170 g_histogram.header =
header;
174 jsk_recognition_msgs::ColorHistogram r_histogram;
175 r_histogram.header =
header;
181 const std_msgs::Header& header)
187 const std_msgs::Header& header)
194 const std_msgs::Header& header)
197 cv::cvtColor(bgr_image, hsi_image, CV_BGR2HSV);
199 float range[] = { 0, 256 } ;
200 const float* histRange = { range };
201 float h_range[] = { 0, 180 } ;
202 const float* h_histRange = { h_range };
203 cv::MatND h_hist, s_hist, i_hist;
204 bool uniform =
true;
bool accumulate =
false;
205 std::vector<cv::Mat> hsi_planes;
206 split(hsi_image, hsi_planes);
208 cv::calcHist(&hsi_planes[0], 1, 0, mask, h_hist, 1, &
h_hist_size_,
209 &h_histRange, uniform, accumulate);
210 cv::calcHist(&hsi_planes[1], 1, 0, mask, s_hist, 1, &
s_hist_size_,
211 &histRange, uniform, accumulate);
213 &histRange, uniform, accumulate);
215 jsk_recognition_msgs::ColorHistogram h_histogram;
216 h_histogram.header =
header;
220 jsk_recognition_msgs::ColorHistogram s_histogram;
221 s_histogram.header =
header;
225 jsk_recognition_msgs::ColorHistogram i_histogram;
226 i_histogram.header =
header;
233 const sensor_msgs::Image::ConstPtr& image,
234 const geometry_msgs::PolygonStamped::ConstPtr& rectangle)
236 vital_checker_->poke();
242 geometry_msgs::Point32 point0 = rectangle->polygon.points[0];
243 geometry_msgs::Point32 point1 = rectangle->polygon.points[1];
244 int min_x = std::max(0.0f, std::min(point0.x, point1.x));
245 int min_y = std::max(0.0f, std::min(point0.y, point1.y));
246 int max_x = std::min(std::max(point0.x, point1.x), (
float)image->width);
247 int max_y = std::min(std::max(point0.y, point1.y), (
float)image->height);
248 cv::Rect roi(min_x, min_y, max_x - min_x, max_y - min_y);
249 cv::Mat bgr_image, roi_image;
250 roi_image = cv_ptr->image(roi);
252 cv::cvtColor(roi_image, bgr_image, CV_RGB2BGR);
255 roi_image.copyTo(bgr_image);
272 const sensor_msgs::Image::ConstPtr& image,
273 const sensor_msgs::Image::ConstPtr& mask_image)
280 cv::Mat bgr_image = cv_ptr->image;
281 cv::Mat mask_image = mask_ptr->image;
282 cv::Mat masked_image;
283 bgr_image.copyTo(masked_image, mask_image);
284 sensor_msgs::Image::Ptr ros_masked_image
290 processBGR(bgr_image, mask_image, image->header);
291 processHSI(bgr_image, mask_image, image->header);