ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Just for reference, following is the callback code I used for deinterleaving the 24bit image published by camera1394.

void imageCallback(const sensor_msgs::ImagePtr& img) {

sensor_msgs::Image left,right,center;

for(unsigned int i=0; i<img->data.size(); i+=3) {

right.data.push_back(img->data[i]);
center.data.push_back(img->data[i+1]);
left.data.push_back(img->data[i+2]);

}

left.header.stamp = ros::Time::now();

left.header.frame_id = "/camera_frame";

left.height = 960; left.width = 1280; left.step= left.width; left.encoding = "mono8";

pLeftImage.publish(left);

center.header.stamp = ros::Time::now();

center.header.frame_id = "/camera_frame";

center.height = 960; center.width = 1280; center.step= left.width; center.encoding = "mono8";

pCenterImage.publish(center);

right.header.stamp = ros::Time::now();

right.header.frame_id = "/camera_frame";

right.height = 960; right.width = 1280; right.step= left.width; right.encoding = "mono8";

pRightImage.publish(right); }

click to hide/show revision 2
No.2 Revision

updated 2013-07-16 03:32:18 -0500

joq gravatar image

Just for reference, following is the callback code I used for deinterleaving the 24bit image published by camera1394.

void imageCallback(const sensor_msgs::ImagePtr& img)
{

{ sensor_msgs::Image left,right,center;

left,right,center; for(unsigned int i=0; i<img->data.size(); i+=3) {

{ right.data.push_back(img->data[i]); center.data.push_back(img->data[i+1]); left.data.push_back(img->data[i+2]); }
right.data.push_back(img->data[i]);
center.data.push_back(img->data[i+1]);
left.data.push_back(img->data[i+2]);

}

left.header.stamp = ros::Time::now();

ros::Time::now(); left.header.frame_id = "/camera_frame";

"/camera_frame"; left.height = 960; left.width = 1280; left.step= left.width; left.encoding = "mono8";

"mono8"; pLeftImage.publish(left);

pLeftImage.publish(left);

center.header.stamp = ros::Time::now();

ros::Time::now(); center.header.frame_id = "/camera_frame";

"/camera_frame"; center.height = 960; center.width = 1280; center.step= left.width; center.encoding = "mono8";

"mono8"; pCenterImage.publish(center);

pCenterImage.publish(center);

right.header.stamp = ros::Time::now();

ros::Time::now(); right.header.frame_id = "/camera_frame";

"/camera_frame"; right.height = 960; right.width = 1280; right.step= left.width; right.encoding = "mono8";

"mono8"; pRightImage.publish(right); }

pRightImage.publish(right); }

Just for reference, following is the callback code I used for deinterleaving the 24bit image published by camera1394.

class xb3ImageDeinterlacer {
  private:
    ros::NodeHandle leftNh,centerNh,rightNh;
    sensor_msgs::CameraInfo leftInfo,centerInfo,rightInfo;
    image_transport::CameraPublisher pLeftImage,pRightImage,pCenterImage;

  public:
    xb3ImageDeinterlacer(ros::NodeHandle n1, ros::NodeHandle n2, ros::NodeHandle n3) {
    leftNh=n1; centerNh=n2; rightNh=n3;
    image_transport::ImageTransport itLeft(leftNh);
    pLeftImage = itLeft.advertiseCamera("image", 1000);
    camera_info_manager::CameraInfoManager leftInfoMgr(leftNh);
    leftInfoMgr.loadCameraInfo("package://xb3_driver/cal_left.yaml");
    leftInfo = leftInfoMgr.getCameraInfo();
    leftInfo.header.frame_id = "/camera_frame";

    image_transport::ImageTransport itCenter(centerNh);
    pCenterImage = itCenter.advertiseCamera("image", 1000);
    camera_info_manager::CameraInfoManager centerInfoMgr(centerNh);
    centerInfoMgr.loadCameraInfo("package://xb3_driver/cal_center.yaml");
    centerInfo = centerInfoMgr.getCameraInfo();
    centerInfo.header.frame_id = "/camera_frame";

    image_transport::ImageTransport itRight(rightNh);
    pRightImage = itRight.advertiseCamera("image", 1000);
    camera_info_manager::CameraInfoManager rightInfoMgr(rightNh);
    rightInfoMgr.loadCameraInfo("package://xb3_driver/cal_right.yaml");
    rightInfo = rightInfoMgr.getCameraInfo();
    rightInfo.header.frame_id = "/camera_frame";
  }

  void imageCallback(const sensor_msgs::ImagePtr& img)
{
img){
    sensor_msgs::Image left,right,center;
   for(unsigned int i=0; i<img->data.size(); i+=3)  {
     right.data.push_back(img->data[i]);
     center.data.push_back(img->data[i+1]);
     left.data.push_back(img->data[i+2]);
   }

  left.header.stamp = ros::Time::now();
  leftInfo.header.stamp=left.header.stamp=img->header.stamp;
    left.header.frame_id = "/camera_frame";
  left.height = 960; left.width = 1280; left.step= left.width; left.encoding = "mono8";
  pLeftImage.publish(left);

  center.header.stamp = ros::Time::now();
  left.height=leftInfo.height; left.width=leftInfo.width; left.step=left.width left.encoding="mono8";
    pLeftImage.publish(left,leftInfo);

    centerInfo.header.stamp=center.header.stamp=img->header.stamp;
    center.header.frame_id = "/camera_frame";
  center.height = 960; center.width = 1280; center.step= left.width; center.encoding = "mono8";
  pCenterImage.publish(center);

  right.header.stamp = ros::Time::now();
  center.height=centerInfo.height; center.width=centerInfo.width; center.step=left.width; center.encoding="mono8";
    pCenterImage.publish(center,centerInfo);

    rightInfo.header.stamp=right.header.stamp=img->header.stamp;
    right.header.frame_id = "/camera_frame";
  right.height = 960; right.width = 1280; right.step= left.width; right.encoding = "mono8";
  pRightImage.publish(right);
  right.height=rightInfo.height; right.width=rightInfo.width; right.step=left.width; right.encoding="mono8";
    pRightImage.publish(right,rightInfo);
  }
};


int main(int argc, char **argv) {
  ros::init(argc, argv, "xb3_deinterlacer");
  ros::NodeHandle n;
  ros::NodeHandle npLeft("xb3_left"),npRight("xb3_right"),npCenter("xb3_center");
  xb3ImageDeinterlacer imgDI(npLeft,npCenter,npRight);
  ros::Subscriber sub1 = n.subscribe("/camera/image_raw", 1000, &xb3ImageDeinterlacer::imageCallback, &imgDI);
  ros::spin();
  return 0;
}

Just for reference, following is the callback code I used for deinterleaving the 24bit image published by camera1394.

class xb3ImageDeinterlacer {
  private:
    ros::NodeHandle leftNh,centerNh,rightNh;
    sensor_msgs::CameraInfo leftInfo,centerInfo,rightInfo;
    image_transport::CameraPublisher pLeftImage,pRightImage,pCenterImage;

  public:
    xb3ImageDeinterlacer(ros::NodeHandle n1, ros::NodeHandle n2, ros::NodeHandle n3) {
    leftNh=n1; centerNh=n2; rightNh=n3;
    image_transport::ImageTransport itLeft(leftNh);
    pLeftImage = itLeft.advertiseCamera("image", 1000);
    camera_info_manager::CameraInfoManager leftInfoMgr(leftNh);
    leftInfoMgr.loadCameraInfo("package://xb3_driver/cal_left.yaml");
    leftInfo = leftInfoMgr.getCameraInfo();
    leftInfo.header.frame_id = "/camera_frame";

    image_transport::ImageTransport itCenter(centerNh);
    pCenterImage = itCenter.advertiseCamera("image", 1000);
    camera_info_manager::CameraInfoManager centerInfoMgr(centerNh);
    centerInfoMgr.loadCameraInfo("package://xb3_driver/cal_center.yaml");
    centerInfo = centerInfoMgr.getCameraInfo();
    centerInfo.header.frame_id = "/camera_frame";

    image_transport::ImageTransport itRight(rightNh);
    pRightImage = itRight.advertiseCamera("image", 1000);
    camera_info_manager::CameraInfoManager rightInfoMgr(rightNh);
    rightInfoMgr.loadCameraInfo("package://xb3_driver/cal_right.yaml");
    rightInfo = rightInfoMgr.getCameraInfo();
    rightInfo.header.frame_id = "/camera_frame";
  }

  void imageCallback(const sensor_msgs::ImagePtr& img){
    sensor_msgs::Image left,right,center;
    for(unsigned int i=0; i<img->data.size(); i+=3) {
      right.data.push_back(img->data[i]);
      center.data.push_back(img->data[i+1]);
      left.data.push_back(img->data[i+2]);
    }

    leftInfo.header.stamp=left.header.stamp=img->header.stamp;
    left.header.frame_id = "/camera_frame";
    left.height=leftInfo.height; left.width=leftInfo.width; left.step=left.width left.encoding="mono8";
    pLeftImage.publish(left,leftInfo);

    centerInfo.header.stamp=center.header.stamp=img->header.stamp;
    center.header.frame_id = "/camera_frame";
    center.height=centerInfo.height; center.width=centerInfo.width; center.step=left.width; center.encoding="mono8";
    pCenterImage.publish(center,centerInfo);

    rightInfo.header.stamp=right.header.stamp=img->header.stamp;
    right.header.frame_id = "/camera_frame";
    right.height=rightInfo.height; right.width=rightInfo.width; right.step=left.width; right.encoding="mono8";
    pRightImage.publish(right,rightInfo);
  }
};


int main(int argc, char **argv) {
  ros::init(argc, argv, "xb3_deinterlacer");
  ros::NodeHandle n;
  ros::NodeHandle npLeft("xb3_left"),npRight("xb3_right"),npCenter("xb3_center");
  xb3ImageDeinterlacer imgDI(npLeft,npCenter,npRight);
  ros::Subscriber sub1 = n.subscribe("/camera/image_raw", 1000, &xb3ImageDeinterlacer::imageCallback, &imgDI);
  ros::spin();
  return 0;
}

camera1394 launch file:

<launch>
<node pkg="nodelet" type="nodelet" name="camera_nodelet_manager" args="manager" output="screen"/>
<node pkg="nodelet" type="nodelet" name="camera1394_nodelet" args="load camera1394/driver camera_nodelet_manager" output="screen">
    <param name="video_mode" value="format7_mode3" />
    <param name="frame_id" value="camera_frame" />
    <param name="frame_rate" value="15.0" />
    <param name="iso_speed" value="800" />  
    <param name="format7_color_coding" value="rgb8" />
</node>  
</launch>