37 #include <opencv2/opencv.hpp> 
   45     DiagnosticNodelet::onInit();
 
   48     pub_ = advertise<sensor_msgs::Image>(*pnh_, 
"output", 1);
 
   49     pub_camera_info_ = advertise<sensor_msgs::CameraInfo>(*pnh_, 
"output/info", 1);
 
   55     sub_ = pnh_->subscribe(
"input/camera_info", 1,
 
   66     vital_checker_->poke();
 
   69       model.fromCameraInfo(info_msg);
 
   71       sensor_msgs::RegionOfInterest roi = 
info_msg->roi;
 
   81       cv::Mat mask_image = cv::Mat::zeros(height, width, CV_8UC1);
 
   83       for (
int u = 0; u < 
width; u++) {
 
   87           cv::Point3d 
p = 
model.projectPixelTo3dRay(uv);
 
   91             mask_image.data[mask_image.step * 
v + mask_image.elemSize() * u] = 255;
 
   95       sensor_msgs::CameraInfo camera_info_msg;
 
   97       camera_info_msg.width = 
width;
 
   98       camera_info_msg.height = 
height;
 
   99       camera_info_msg.distortion_model = 
info_msg->distortion_model;
 
  100       camera_info_msg.roi.x_offset = 0;
 
  101       camera_info_msg.roi.y_offset = 0;
 
  102       camera_info_msg.roi.width = 
width;
 
  103       camera_info_msg.roi.height = 
height;
 
  104       camera_info_msg.roi.do_rectify = 
info_msg->roi.do_rectify;
 
  105       cv::Matx33d K = 
model.intrinsicMatrix();
 
  106       for (
size_t i = 0; 
i < 3; ++
i) 
for (
size_t j = 0; j < 3; ++j) camera_info_msg.K[i * 3 + j] = K(i, j);
 
  107       cv::Matx33d R = 
model.rotationMatrix();
 
  108       for (
size_t i = 0; 
i < 3; ++
i) 
for (
size_t j = 0; j < 3; ++j) camera_info_msg.R[i * 3 + j] = R(i, j);
 
  109       cv::Matx34d P = 
model.projectionMatrix();
 
  110       for (
size_t i = 0; 
i < 3; ++
i) 
for (
size_t j = 0; j < 4; ++j) camera_info_msg.P[i * 4 + j] = P(i, j);
 
  111       cv::Mat_<double> 
D = 
model.distortionCoeffs();
 
  112       camera_info_msg.D.resize(
D.rows * 
D.cols);
 
  113       for (
size_t i = 0; 
i < 
D.rows; ++
i) 
for (
size_t j = 0; j < 
D.cols; ++j) camera_info_msg.D[i * 
D.cols + j] = 
D(i, j);
 
  124     double default_padding, default_scale;
 
  125     pnh.
param(
"self_see_default_padding", default_padding, 0.01);
 
  126     pnh.
param(
"self_see_default_scale", default_scale, 1.0);
 
  127     std::vector<robot_self_filter::LinkInfo> links;
 
  129     if(!pnh.
hasParam(
"self_see_links")) {
 
  130       ROS_WARN(
"No links specified for self filtering.");
 
  133       pnh.
getParam(
"self_see_links", ssl_vals);
 
  135         ROS_WARN(
"Self see links need to be an array");
 
  137         if(ssl_vals.
size() == 0) {
 
  138           ROS_WARN(
"No values in self see links array");
 
  140           for(
int i = 0; 
i < ssl_vals.
size(); 
i++) {
 
  143               ROS_WARN(
"Self see links entry %d is not a structure.  Stopping processing of self see links",i);
 
  146             if(!ssl_vals[i].hasMember(
"name")) {
 
  147               ROS_WARN(
"Self see links entry %d has no name.  Stopping processing of self see links",i);
 
  150             li.
name = std::string(ssl_vals[i][
"name"]);
 
  151             if(!ssl_vals[i].hasMember(
"padding")) {
 
  152               ROS_DEBUG(
"Self see links entry %d has no padding.  Assuming default padding of %g",i,default_padding);
 
  155               li.
padding = ssl_vals[
i][
"padding"];
 
  157             if(!ssl_vals[i].hasMember(
"scale")) {
 
  158               ROS_DEBUG(
"Self see links entry %d has no scale.  Assuming default scale of %g",i,default_scale);
 
  159               li.
scale = default_scale;
 
  161               li.
scale = ssl_vals[
i][
"scale"];