2017-12-11 32 views
0

私はKinect v1を使用していますが、ROSのチャンネル"/ camera/depth_registered/image"からグレースケールモードで奥行き画像を取得します。 hereが見つかりましたので、私はimgmsg_to_cv2という関数を使ってそれを行うことができます。深度メッセージのデフォルトのdesired_encodingは "32FC1"です。問題は、私がcv2.imshow()関数を使ってそれを表示すると、私はバイナリイメージを取得するということです... RGBイメージで同じことをすると、すべてが表示されています...imgmsg_to_cv2でROSのグレースケール画像を取得する[python]

Any助けに感謝!

+0

少なくともC++バージョンでは、OpenCVは '32FC1'画像を表示するとあまりよくありません。適切な範囲(0〜255)にスケーリングして表示目的で '8UC1'に変換してみてください。 – mikkola

+0

私は(ここに)指示(https://answers.ros.org/question/58902/how-to-store-the-depth-data-from-kinectcameradepth_registreredimage_raw-as-gray-scale)に従いました。 -画像/)。問題は、結果がROSの** image_view **パッケージからノード** image_view **で取得した画像と比べてかなり騒がしいことです。 – lefos99

答えて

0

だから結局、私はあなたがここに見ることができる解決策を見つけた:

def Depthcallback(self,msg_depth): # TODO still too noisy! 
try: 
    # The depth image is a single-channel float32 image 
    # the values is the distance in mm in z axis 
    cv_image = self.bridge.imgmsg_to_cv2(msg_depth, "32FC1") 
    # Convert the depth image to a Numpy array since most cv2 functions 
    # require Numpy arrays. 
    cv_image_array = np.array(cv_image, dtype = np.dtype('f8')) 
    # Normalize the depth image to fall between 0 (black) and 1 (white) 
    # http://docs.ros.org/electric/api/rosbag_video/html/bag__to__video_8cpp_source.html lines 95-125 
    cv_image_norm = cv2.normalize(cv_image_array, cv_image_array, 0, 1, cv2.NORM_MINMAX) 
    # Resize to the desired size 
    cv_image_resized = cv2.resize(cv_image_norm, self.desired_shape, interpolation = cv2.INTER_CUBIC) 
    self.depthimg = cv_image_resized 
    cv2.imshow("Image from my node", self.depthimg) 
    cv2.waitKey(1) 
except CvBridgeError as e: 
    print(e) 

はしかし、結果は私がROSのimage_viewノードから取得するものとしてその完璧ではないですが、それまだかなり受け入れられています!

関連する問題