Rosanswers logo

Hey everyone

I have been playing a bit with the kinect camera using the openni driver. When running openni_node.launch and viewing the rgb image using rviz, then everything looks perfect, but when I create a node that has to the purpose to read the rgb image, convert it to a cv image and displaying it using imshow, then the colours are all wrong. Red is blue, blue is red, green is something yellow and yellow is light blue. I have been trying to use RGB8 and BGR8 encodings, but nether of them shows any difference. A sample of my code is shown below, inspired from the example in the cv_bridge tutorial:

void processRGB::processImage( const sensor_msgs::Image::ConstPtr& img ) {
    CvImagePtr cv_ptr;

    try {

        cv_ptr = toCvCopy(img, enc::BGR8); //enc::RGB8 also used

    } catch (cv_bridge::Exception& e) {

        ROS_ERROR("cv_bridge exception: %s", e.what());

    imshow("Kinect RGB image", cv_ptr->image);

Does anyone know what might cause this problem? I am using the newest version of Diamondback.


Sebastian Aslund

Originally posted by Aslund on ROS Answers with karma: 289 on 2011-03-05

Post score: 1

Original comments

Comment by fergs on 2011-03-05:
What image topic are you subscribed to?


1 Answer 1


Rosanswers logo

Hi Sebastian,

Here's a similar piece bit of Python code that works for me with my Kinect. Like you, I am using the latest version of Diamondback and the latest Ni stack. The steps I am using are:

$ roslaunch openni_camera openni_node.launch

$ rosrun pi_head_tracking_tutorial ros_to_cv.py

where of course the second line will be different for you. Here is the ros_to_cv.py code. If you run it as a node, you'll also have to change the manifiest name in the roslib.load_manifiest('pi_head_tracking_tutorial') line.

#!/usr/bin/env python

import roslib
import sys
import rospy
import cv
from std_msgs.msg import String
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError

class vision_node:
    def __init__(self):

        self.cv_window_name = "OpenCV Image"

        cv.NamedWindow(self.cv_window_name, 1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/camera/rgb/image_color", Image,\

    def callback(self, data):
          cv_image = self.bridge.imgmsg_to_cv(data, "bgr8")
        except CvBridgeError, e:
          print e

        cv.ShowImage(self.cv_window_name, cv_image)

def main(args):
      vn = vision_node()
      except KeyboardInterrupt:
        print "Shutting down vison node."

if __name__ == '__main__':

Originally posted by Pi Robot with karma: 4046 on 2011-03-05

This answer was ACCEPTED on the original site

Post score: 2


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.