00001 // -*- mode: c++ -*- 00002 /********************************************************************* 00003 * Software License Agreement (BSD License) 00004 * 00005 * Copyright (c) 2015, JSK Lab 00006 * All rights reserved. 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions 00010 * are met: 00011 * 00012 * * Redistributions of source code must retain the above copyright 00013 * notice, this list of conditions and the following disclaimer. 00014 * * Redistributions in binary form must reproduce the above 00015 * copyright notice, this list of conditions and the following 00016 * disclaimer in the documentation and/o2r other materials provided 00017 * with the distribution. 00018 * * Neither the name of the JSK Lab nor the names of its 00019 * contributors may be used to endorse or promote products derived 00020 * from this software without specific prior written permission. 00021 * 00022 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00023 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00024 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00025 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00026 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00027 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00028 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00029 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00030 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00032 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00033 * POSSIBILITY OF SUCH DAMAGE. 00034 *********************************************************************/ 00035 00036 #include "jsk_perception/mask_image_to_rect.h" 00037 #include <boost/assign.hpp> 00038 #include <jsk_topic_tools/log_utils.h> 00039 #include <opencv2/opencv.hpp> 00040 #include <sensor_msgs/image_encodings.h> 00041 #include <cv_bridge/cv_bridge.h> 00042 00043 namespace jsk_perception 00044 { 00045 void MaskImageToRect::onInit() 00046 { 00047 DiagnosticNodelet::onInit(); 00048 pub_ = advertise<jsk_recognition_msgs::RectArray>(*pnh_, "output", 1); 00049 onInitPostProcess(); 00050 } 00051 00052 void MaskImageToRect::subscribe() 00053 { 00054 sub_mask_ = pnh_->subscribe("input", 1, &MaskImageToRect::convert, this); 00055 ros::V_string names = boost::assign::list_of("~input"); 00056 jsk_topic_tools::warnNoRemap(names); 00057 } 00058 00059 void MaskImageToRect::unsubscribe() 00060 { 00061 sub_mask_.shutdown(); 00062 } 00063 00064 void MaskImageToRect::convert( 00065 const sensor_msgs::Image::ConstPtr& mask_msg) 00066 { 00067 vital_checker_->poke(); 00068 std::vector<cv::Point> indices; 00069 cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy( 00070 mask_msg, sensor_msgs::image_encodings::MONO8); 00071 cv::Mat mask = cv_ptr->image; 00072 for (size_t j = 0; j < mask.rows; j++) { 00073 for (size_t i = 0; i < mask.cols; i++) { 00074 if (mask.at<uchar>(j, i) == 255) { 00075 indices.push_back(cv::Point(i, j)); 00076 } 00077 } 00078 } 00079 jsk_recognition_msgs::RectArray rects; 00080 rects.header = mask_msg->header; 00081 if (indices.size() > 0){ 00082 cv::Rect mask_rect = cv::boundingRect(indices); 00083 jsk_recognition_msgs::Rect rect; 00084 rect.x = mask_rect.x; 00085 rect.y = mask_rect.y; 00086 rect.width = mask_rect.width; 00087 rect.height = mask_rect.height; 00088 rects.rects.push_back(rect); 00089 } 00090 pub_.publish(rects); 00091 } 00092 } 00093 00094 #include <pluginlib/class_list_macros.h> 00095 PLUGINLIB_EXPORT_CLASS (jsk_perception::MaskImageToRect, nodelet::Nodelet);