System designTroubleshooting

Depth camera RGB shows black and white: you are on the IR stream

A depth camera RGB stream that shows black and white is the infrared endpoint, not a fault. Find the colour device, open both streams and budget USB bandwidth.

LumaSpec Vision9 min read Share on LinkedIn

On this page 10 sections
  1. 01The symptom, and what it is not
  2. 02Two devices in one housing
  3. 03Confirm it in one minute
  4. 04The fix: open the colour endpoint as a second capture
  5. 05The registration offset you will see
  6. 06The bandwidth arithmetic
  7. 07When the grayscale stream is the one you want
  8. 08The two-camera alternative
  9. 09Checklist before you change hardware
  10. 10Questions

You connected an RGB-D camera, opened what you thought was the colour stream, and the image updates — in black and white. The camera works, reinstalling the driver changes nothing, and white-balance controls do nothing, because nothing is broken. On this class of camera the depth sensor and the colour sensor are two separate devices in one housing, and the depth device's own image is an infrared picture: one intensity channel with no colour in it. This guide shows you how to confirm which device you opened, open the colour endpoint as a second capture, synchronise the two streams and budget the USB bandwidth that makes them drop frames, with the checks that stop the same surprise on the next machine.

The symptom, and what it is not

The frames arrive at full rate and exposure responds to light, but every pixel is gray. Look closely at a textured surface and a faint dot pattern moves across it: that is the projector's speckle, the fastest visual confirmation that you are watching the infrared sensor.

Two other faults also produce gray pictures, and they look different:

The infrared image is clean grayscale with no mosaic and no tint. That difference tells you the problem sits upstream of any decode: the data itself is single-channel.

Two devices in one housing

An RGB-D camera is two or three imagers behind one cable. The depth engine — an infrared camera paired with a pattern projector, or two infrared cameras in stereo — reports depth plus an infrared intensity image. The colour sensor is a separate imaging device, and on many models it is exposed only as a standard USB Video Class (UVC) device rather than through the vendor SDK's stream list. Your capture asked the depth device for its image, and the depth device's image is infrared.

That picture cannot be colour. The sensor has one channel, it sits behind an infrared-pass filter, and the scene is lit by a monochromatic near-infrared pattern. Red, green and blue never reach it, so no setting recovers them.

Confirm it in one minute

Test What you see Conclusion
Look for a dot pattern on texture Faint moving dots Infrared sensor
Cover each window with a card in turn The gray image changes at one window That window is the infrared camera
List the formats the device advertises One channel, 8 or 16 bits per pixel Depth or infrared device
Same listing on the other device Packed formats such as YUYV, MJPEG or NV12 Colour sensor

One physical camera appears as two or more device nodes, and picking the right node is its own task. The guide to Linux camera device selection: find the RGB stream walks through telling the nodes apart; the same two-device logic applies on every operating system.

The fix: open the colour endpoint as a second capture

  1. Enumerate every video device the host sees before opening any. Expect at least two nodes for one RGB-D camera.
  2. Read the formats each node advertises. Packed colour formats mark the colour sensor; single-channel 8- or 16-bit formats mark depth or infrared.
  3. Open the colour node as a second capture and keep both handles for the session — one for depth, one for colour.
  4. Set exposure on each stream separately. The two auto-exposure loops are independent.
  5. Match frames by timestamp, not arrival order. Two devices run on separate clocks, and queueing can swap adjacent frames. At 30 fps, hold the measured skew under one frame period, 33 ms.
  6. Register colour onto depth with the extrinsics, then check the result on a flat target marked at your working distance.

The registration offset you will see

Colour and infrared sit a short baseline apart, so their views differ by parallax. Assume a 25 mm baseline and a 1920-pixel-wide colour sensor with a 70° horizontal field of view: the sensor resolves about 1920 / 70 ≈ 27 pixels per degree, and the baseline subtends atan(25 / 500) ≈ 2.9° at 500 mm, roughly 78 pixels of offset. Double the distance and the offset halves. Plan for tens of pixels of correction at close range, applied once through the extrinsics.

Two guides cover this stage directly: Align depth to a third RGB camera: fix missing extrinsics for getting the extrinsics when the pair was never calibrated together, and Depth to RGB registration offset in pixels: fix the rectified stream for the residual offset left after alignment.

The bandwidth arithmetic

Colour is the expensive stream. Its raw payload follows one line:

bytes_per_second = width × height × bytes_per_pixel × frames_per_second

Worked example for a typical 1080p colour sensor and a VGA depth sensor, both at 30 fps:

  • Colour, 1920 × 1080 pixels, YUYV at 2 bytes per pixel: 1920 × 1080 = 2,073,600 pixels, × 2 B = 4,147,200 B per frame, × 30 fps = 124,416,000 B/s ≈ 124 MB/s ≈ 995 Mbit/s.
  • Depth, 640 × 480 at 16 bits: 640 × 480 = 307,200 pixels, × 2 B = 614,400 B per frame, × 30 fps = 18,432,000 B/s ≈ 18 MB/s ≈ 147 Mbit/s.
  • Sum ≈ 143 MB/s ≈ 1.1 Gbit/s before protocol overhead.

USB 2.0 moves 480 Mbit/s on the wire and sustains about 40 MB/s of payload, so raw 1080p colour cannot cross it — that is why colour on a USB 2.0 link arrives compressed as MJPEG. USB 3.2 Gen 1 moves 5 Gbit/s and carries the sum with margin. Adding the infrared stream on top of depth plus colour is the heaviest combination and a common cause of dropped colour frames; Depth and color stream timeouts: the USB bandwidth check measures it, and Depth camera black image: fix USB bandwidth and power issues covers the collapse when power sags alongside it.

The decision: run depth plus colour on a USB 3 link, request the separate infrared stream only when you use it, and accept MJPEG colour when a USB 2.0 controller is unavoidable.

When the grayscale stream is the one you want

The infrared picture is not a consolation prize. It ignores printed colour and labels, it works with the room lights off, and it shares the depth sensor's viewpoint and clock, so it needs no registration. Fusing it with colour and depth in one point cloud is covered in Point cloud with RGB and IR intensity: fuse depth, color and infrared.

The two-camera alternative

When the colour endpoint stays unreliable on your host, or you need colour quality the embedded sensor cannot reach, split the job and register the pair once: geometry from a 3D sensor, appearance from a colour area scan camera. The link trade-offs for that kind of set-up are compared in RGB depth stream interface selection for vision cameras.

On the appearance side, the MV-CS200-10GC is a 20 MP colour area scan camera on GigE with a C-mount and a rolling shutter; for moving parts, filter the same finder for a global shutter instead. On the geometry side, choose by task: a laser profiler such as the MIS-DP3850-01P for height profiles across a moving line, or a time-of-flight camera such as the MV-DT01WMU for full-frame depth in one shot.

Area scan camerasHikrobot MV-CS200-10GC 20 MP Area Scan Camera, GigE, IMX183, Color, BasicMV-CS200-10GC
Sensor format
1"
Lens mount
C-mount
Interface
GigE
Resolution
16-25 MP
$739.00View partBuild a system with it
3D sensorsHikrobot MIS-DP3850-01P 3D laser profile sensorMIS-DP3850-01P
Type
Laser profiler
$12,379.00 · quotedView and quote
3D sensorsHikrobot MV-DT01WMU ToF sensing cameraMV-DT01WMU
Type
Depth / ToF camera
Price on requestView and quote

Filter the camera finder by interface and mount, or start the system configurator at the camera step.

Checklist before you change hardware

  • Enumerated two or more device nodes for one physical camera before writing capture code.
  • Read the advertised formats per node and matched colour to packed formats.
  • Saw the projector's dot pattern, confirming the gray image is infrared.
  • Computed the bandwidth sum at your resolution and frame rate; chose MJPEG colour on a USB 2.0 link.
  • Matched frames by timestamp and measured the skew under one frame period.
  • Registered the pair and confirmed near-zero offset on a marked target at working distance.
  • Still gray after all of the above: the unit may be a mono variant, or your decode drops channels — work through the two format guides linked earlier.

If the part choice is the blocker, the contact page reaches our applications team, and more integration wiring guides sit on the systems topic page.

Questions

Why does my depth camera show grayscale instead of colour?

Your capture opened the infrared sensor on the depth device. The infrared image carries one intensity value per pixel: a single-channel sensor behind an infrared-pass filter, lit by a monochromatic near-infrared pattern. A coloured flyer is the ten-second proof — saturated red and green areas render as nearly the same gray. The fix is to open the second device, not to adjust this one.

How do I find the colour device of an RGB-D camera?

Enumerate every video device the host sees and expect at least two nodes for one physical camera. The labels are often unhelpful — two entries can both read as a generic camera — so pick by the advertised format list, not by name: a node offering only single-channel 8- or 16-bit formats is depth or infrared, a node offering packed formats such as YUYV, MJPEG or NV12 is colour.

Can I convert the infrared image to colour?

Not by decoding, because the colour information was never captured. Research on colourization networks can synthesise plausible colours from gray images, but the output is inferred appearance, not measurement, and it will not hold up in inspection tasks that compare colour against a reference. If you need measured colour, open the colour device and register it to depth.

Why do colour frames drop when depth and infrared also stream?

Bandwidth. At 1920 × 1080, 2 bytes per pixel and 30 fps, raw colour alone is about 124 MB/s, and 640 × 480 16-bit depth at 30 fps adds about 18 MB/s. Three streams together overload a shared controller, with USB 2.0 failing first. Drop the separate infrared request unless you use it, or let colour arrive compressed as MJPEG.

Is a grayscale camera image always the infrared sensor?

No. Check whether the unit is a mono variant: many sensors ship in colour and mono versions of the same body, and a mono variant lists no packed formats on any node, so it will never produce colour. Also confirm the decode — a misread colour format shows tints or a mosaic, while the infrared image is clean gray and often carries the projector dot pattern.

Do I lose frame sync when colour is a separate device?

Yes, the two devices run on independent clocks, so arrival order is not frame correspondence. Queue both streams and pair frames by nearest timestamp, then discard colour frames with no match rather than pairing a stale frame. At 30 fps hold the measured skew under one frame period, 33 ms, and register colour onto depth afterwards to remove the parallax offset.