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

DepthImage to Mat (OpenCV) [closed]

asked 2014-09-25 09:29:58 -0600

updated 2014-09-26 12:03:42 -0600

I am working with a 3d camera that provides a depthimage which is encoded in 32FC1 I need the image in OpenCV format (Mat) in order to access each component as a matrix

The problem is that when I have done the transformation, I try to access the Matrix data with Mat::at but I can not see real values. I don't know where the problem is.

EDIT

I have discovered that the problem is the ros encoding of the image. I have simulated a depth camera and I don't know the equivalence between each pixel value and the distance it represents. My camera code is the following:

  <gazebo reference="kinect_depth_frame">
    <sensor type="depth" name="fotonic">
      <update_rate>30.0</update_rate>
      <camera name="fotonic">
        <horizontal_fov>1.221730476</horizontal_fov>  <!-- 70 deg -->
        <image>
          <width>800</width>  <!-- 160 -->
          <height>600</height> <!-- 120 -->
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.05</near>
          <far>7.0</far>         
        </clip>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.007</stddev>
        </noise>
      </camera>

      <plugin name="kinect_depth_optical_frame_controller" filename="libgazebo_ros_openni_kinect.so">
        <baseline>0.2</baseline>
        <alwaysOn>true</alwaysOn>
        <updateRate>30.0</updateRate>
        <cameraName>fotonic_3dcamera</cameraName>
        <imageTopicName>/fotonic_3dcamera/image_raw</imageTopicName>
        <cameraInfoTopicName>/fotonic/depth/camera_info</cameraInfoTopicName>
        <depthImageTopicName>/fotonic/depth/image_raw</depthImageTopicName>
        <depthImageInfoTopicName>/fotonic_3dcamera/depth/camera_info</depthImageInfoTopicName>
        <depthImageCameraInfoTopicName>/fotonic_3dcamera/camera_info</depthImageCameraInfoTopicName>
        <pointCloudTopicName>/fotonic_3dcamera/depth/points</pointCloudTopicName>
        <frameName>kinect_depth_optical_frame</frameName>
        <pointCloudCutoff>0.5</pointCloudCutoff>
        <distortionK1>0</distortionK1>
        <distortionK2>0</distortionK2>
        <distortionK3>0</distortionK3>
        <distortionT1>0</distortionT1>
        <distortionT2>0</distortionT2>
        <CxPrime>0</CxPrime>
        <Cx>0</Cx>
        <Cy>0</Cy>
        <focalLength>0</focalLength>
        <hackBaseline>0</hackBaseline>
      </plugin>      
    </sensor>
  </gazebo>
edit retag flag offensive reopen merge delete

Closed for the following reason too subjective or argumentative by arenillas
close date 2014-09-30 04:50:43.611820

Comments

Can you please add your code for retreiving your cv::Mat from the image message and the cv::Mat::at statement?

Wolf gravatar image Wolf  ( 2014-09-30 04:23:26 -0600 )edit

2 Answers

Sort by ยป oldest newest most voted
-1

answered 2014-09-30 04:18:04 -0600

The depth image does not follow OpenCV standards. The value of each pixel represents the distance in meters,

edit flag offensive delete link more

Comments

There is no standard that specifies a cv::Mat may not contain depth values as distances in meters. OpenCV allows floating point matrices.

Wolf gravatar image Wolf  ( 2014-09-30 04:26:16 -0600 )edit

Of course, image processing function that assume color images will not work with such image; but cv::Mat::at (which the user mentioned) should work if templates are selected correctly!

Wolf gravatar image Wolf  ( 2014-09-30 04:26:41 -0600 )edit

Yeah, but I tried to represent the image with OpenCV and, because of I had it in 32float, it expects the image to have values between 0 to 1. So, when I tried to represent the image It was not the original I had in ROS and I was becoming crazy.

arenillas gravatar image arenillas  ( 2014-09-30 04:48:35 -0600 )edit

Still, this should work; if you have a cv::Mat your_mat of type CV_32FC1 using your_mat.at<float>( i,j ) you are able to set it to any float value and retrieve any float value out of it; not just those between 0 and 1

Wolf gravatar image Wolf  ( 2014-09-30 05:39:23 -0600 )edit
0

answered 2014-09-26 05:04:19 -0600

Mago Nick gravatar image

updated 2014-09-26 05:06:02 -0600

Hi, I am not really sure but apparently you are doing the conversion in the wrong way. Try to use the encription parameter of toCvCopy. Try to use 16UC1 as encription.

EDIT: I hav read that you already know the encription, try to use that one

Some sources:

  1. Tutorial: tutorial
  2. Discussion: first

  3. Discussion: second

edit flag offensive delete link more

Comments

I have updated the question with my new discoveries. Thank you for your help.

arenillas gravatar image arenillas  ( 2014-09-26 11:58:41 -0600 )edit

Question Tools

1 follower

Stats

Asked: 2014-09-25 09:29:58 -0600

Seen: 993 times

Last updated: Sep 30 '14