3D visionTroubleshooting

Depth camera not detected: the integrated webcam conflict

lsusb lists the depth camera and uvcvideo binds it, yet the SDK says no device. The usual conflict is the integrated webcam. Count the nodes and fix it.

LumaSpec Vision11 min read Share on LinkedIn

On this page 12 sections
  1. 01What the log already proves
  2. 02Why one camera owns several /dev/video nodes
  3. 03The 60-second node count
  4. 04Worked example: one laptop, one depth camera, eight nodes
  5. 05Fix A: take the integrated webcam out of the enumeration
  6. 06Fix B: keep both cameras and pin the depth camera
  7. 07The other causes, in order of probability
  8. 08Cables and ports that fail the same way
  9. 09When the webcam is not the answer
  10. 10Checklist before you reinstall anything
  11. 11Next step
  12. 12Questions

Your depth camera is right there in lsusb, dmesg shows the uvcvideo driver binding it, and the camera's own SDK still answers "no device connected". The USB link is proven and the class driver is loaded, so reinstalling changes nothing. On a laptop, the usual cause is not software: the integrated webcam is a second UVC camera, it takes the first /dev/video nodes, and the depth camera's node block lands where the SDK does not look. This guide runs the diagnosis in the order that pays off — prove the link, count the nodes, then disable the webcam or pin the camera by serial number — and closes with the rarer causes: USB 2.0 fallback, node permissions, containers and SDK-firmware mismatch. You need a shell and about ten minutes.

What the log already proves

Start with what the log settles. When lsusb lists the camera and the entry disappears the moment you unplug it, power, cable and the SuperSpeed link all work. dmesg then reports a new SuperSpeed USB device and uvcvideo finding a UVC 1.10 device — twice, because the camera exposes more than one streaming interface. The driver is bound; stop reinstalling it.

The same log carries "Unknown video format" warnings for the camera's private depth formats, and possibly a warning about an unknown pixelformat such as 0x2036315a. A stock kernel does not know a depth camera's depth-specific formats; the SDK ships its own support for them. Those lines were present in the failure traced here and the camera still enumerated, so treat them as noise.

That pins the fault between the driver and the SDK: enumeration, the layer where a second UVC camera does its damage. The host-setup half of this symptom is covered in USB camera in lsusb but not detected by the vision SDK on Linux; the webcam half is below.

Why one camera owns several /dev/video nodes

One physical camera does not mean one node. A laptop with a single front camera has been documented listing /dev/video0, /dev/video1, /dev/video2 and /dev/video3 — four nodes for one camera. Kernels carrying the metadata patch add a second node that carries metadata about the first device's video, and a front module with color and infrared sensors exposes an interface per sensor.

A depth camera multiplies this: depth, infrared and color are separate streaming interfaces, so uvcvideo reports "Found UVC 1.10 device" once per interface and creates a node for each. Two bound interfaces plus their metadata nodes is a four-node footprint, and that is normal topology, not an error.

Node numbering is the weak point. Applications use the /dev/video numbering to decide which camera they open, and that ordering is not persistent across boots. Add the integrated webcam and the depth camera's block starts at a different index on every boot. On top of that, libuvc — the cross-platform UVC access layer several SDKs build on — carries a known limitation where two USB cameras may fail to stream simultaneously. If your SDK runs in a container, also pass it every node the camera owns, not just the first: Camera in Docker: pass V4L2 media nodes, not just /dev/video0.

The 60-second node count

Run this before you change any driver:

  1. Close every camera application — viewers, SDK tools, video calls. A second application holding a camera can make its device nodes disappear, as camera device nodes disappear when a second application starts shows.
  2. Unplug the depth camera and run ls /dev/video*. Note the count and the numbers: that block belongs to the webcam. Call it N_unplugged.
  3. Plug the camera into a rear root port and wait for dmesg to settle.
  4. Run ls /dev/video* again and call the count N_plugged.
  5. The camera owns the difference — always the higher-numbered entries the kernel just added.
  6. Check lsusb -t: the camera's entry must read 5000M. A reading of 480M means the link fell back to USB 2.0, which is its own failure — see USB3 camera negotiated USB2 speed: why lsusb -t shows 480M.
camera_nodes = N_plugged - N_unplugged

A difference of four is the typical footprint for a multi-interface depth camera on a current kernel.

Worked example: one laptop, one depth camera, eight nodes

Inputs, each from the failure traced here:

  • Host: a laptop with an integrated UVC webcam.
  • Camera: a USB 3.0 depth camera that enumerates as a SuperSpeed device at 8086:0aa5, with uvcvideo finding its UVC 1.10 interfaces twice in dmesg — two streaming interfaces.
  • Webcam block: /dev/video0 through /dev/video3, the four-node listing a single-camera laptop shows.
  • SDK symptom: "no device connected" while lsusb holds the camera and loses it on unplug.

Rule: the plug/unplug difference is the camera's own node block.

Arithmetic:

  • Interfaces bound by uvcvideo: 2.
  • Nodes per interface on a kernel with the metadata patch: 2 (capture plus metadata).
  • Camera nodes: 2 × 2 = 4.
  • Webcam nodes: 4 (/dev/video0 to /dev/video3).
  • Total plugged: 4 + 4 = 8, so the camera owns /dev/video4 through /dev/video7.
  • Node count check: N_plugged - N_unplugged = 8 - 4 = 4. The two methods agree.

Decision: the hardware is fully present — SuperSpeed link, driver bound twice, four camera nodes — so the failure is selection. An SDK that starts at the bottom of the node list meets the webcam's block first. Disable the webcam (next section) or pin the camera by serial number. On this machine, disabling the integrated webcam was the whole fix: the SDK listed the camera immediately afterwards.

Fix A: take the integrated webcam out of the enumeration

The cleanest laptop fix is firmware: most laptops expose an integrated-camera on/off setting in setup. Switch the webcam off and it never enumerates; the depth camera takes the low nodes and the SDK finds it. That is what resolved the case traced here.

If the firmware offers no switch, unbind uvcvideo from the webcam's USB device only. The kernel supports per-device driver binding, so the module stays loaded, the depth camera keeps its nodes, and the webcam loses its own.

Confirm the fix by counting again: the node list should now hold only the camera's four entries, and the SDK should list its depth, infrared and color streams.

Fix B: keep both cameras and pin the depth camera

Keeping both cameras is the right answer when the webcam must stay — conference software on the same host, for example. Select the depth camera by serial number inside the SDK, the standard method whenever more than one depth camera shares a host: multiple depth cameras on one host: select each by serial number.

One limit: if dmesg shows SerialNumber=0 for the camera, there is no USB serial string to match, so serial-keyed device rules cannot separate the two cameras. The fallbacks are a fixed physical root port — same port every boot — and a fresh node count after each replug to identify the camera's block. Never hardcode /dev/video4; the ordering is not persistent across boots.

Selection only helps if the nodes open. A correctly selected node still fails without device permissions, so run the SDK from the account that owns the session and work through Linux camera device permissions: video and media node checks.

The other causes, in order of probability

With the webcam ruled in or out, the remaining causes of "no device connected" rank like this:

What you see Cause Ten-second test Fix
Camera in lsusb, SDK empty, laptop webcam present Webcam owns the low node block Plug and unplug node count Disable webcam or select by serial
lsusb -t reads 480M at the camera USB 2.0 fallback Read the speed column Rear root port, USB 3.0 cable
Nodes exist, SDK cannot open them Device node permissions Run the SDK from the owning account Fix permission on video and media nodes
Camera present, then gone Another process holds it Close apps, watch dmesg One owner at a time
SDK in a container finds nothing Container got one node, not the block Compare node lists inside and outside Pass every node the camera owns
Enumeration fine, device creation fails SDK and camera firmware mismatch Compare the two version strings Align SDK and firmware

One more trap: userspace camera servers that install their own UVC driver replace the kernel driver's nodes. dmesg shows which driver bound each camera; two drivers claiming one camera delete each other's nodes.

Cables and ports that fail the same way

Depth streams need SuperSpeed bandwidth, so a USB 2.0 fallback often surfaces as the same "no device" error rather than as a slow image. After lsusb -t confirms 5000M, remove the remaining electrical variables at bring-up: rear root port, no hub, and a known USB 3.0 cable in place of whatever shipped in the box. The camera data cables category covers every length class from 1-2 m to over 20 m.

Cables3 m USB3.0 camera cable, high-flex (drag chain) (LS-CBL-0219)LS-CBL-0219$62.00View partBuild a system with it

The LS-CBL-0219 is a 3 m USB3.0 camera cable in high-flex drag-chain form; on a bench it simply removes the cable as a variable.

AccessoriesCables

Camera data, power and I/O cables

401 models · from $22.00

When the webcam is not the answer

On a desktop with no integrated camera the same symptom re-ranks: USB 2.0 fallback first, permissions second, then the driver itself — on some hosts the UVC driver is built in rather than loaded as a module, which changes how you check it: uvcvideo module not loaded: check for a built-in driver. When enumeration succeeds but device creation fails, compare the SDK version against the camera firmware; a header and firmware mismatch breaks device creation before a frame is ever requested: 3D camera header version mismatch: fix firmware and SDK alignment. A camera that enumerates but will not open for a second user points at a stale device lock, not the webcam: stale /dev/shm device lock when a second user opens the camera.

For a fixed inspection station, remove the whole failure class: choose a host with no integrated camera. Industrial mini PCs carry none, so the low node block always belongs to your depth camera. A depth / ToF camera such as the MV-DT01WMU then enumerates into an empty node map.

3D sensorsHikrobot MV-DT01WMU ToF sensing cameraMV-DT01WMU
Type
Depth / ToF camera
Price on requestView and quote

Checklist before you reinstall anything

Work down this list before touching a driver package again:

  • lsusb entry appears when plugged and disappears when unplugged — link proven; drivers are not the problem.
  • dmesg shows uvcvideo finding the UVC 1.10 device once per interface — driver bound.
  • Node count difference equals the camera's block; four nodes is typical for this class.
  • lsusb -t reads 5000M at the camera — not 480M.
  • Integrated webcam disabled in firmware, or camera pinned by serial or a fixed root port.
  • Every camera application closed; SDK run from the account owning the session.
  • SDK version aligned with camera firmware.

Next step

Keep the working combination once the SDK lists the camera: fixed root port, known cable, webcam off or camera selected by serial. For a new station, start from the 3D sensors category or the camera finder and build around a host with no camera of its own. If the node count shows your camera's block and the SDK still refuses it, send the two node listings and the dmesg output to our support team — free expert support comes with every order.

Questions

Why does one camera create four /dev/video nodes?

A UVC camera gets a node per streaming interface, and kernels carrying the metadata patch add a second node that carries metadata about the first device's video. A laptop front module with color and infrared sensors therefore lists /dev/video0 through /dev/video3 from a single physical camera. Four nodes for one camera is normal topology, not four devices and not an error. Which block belongs to the depth camera is settled by the plug and unplug count, not by the node numbers.

Should I blacklist the uvcvideo module to stop the webcam?

No. The depth camera is itself a UVC device — in the failure traced here, uvcvideo is the driver binding it. Blacklisting or unloading the module removes both cameras and turns a selection problem into a no-driver problem. Unbind the driver from the webcam's USB device only, or switch the webcam off in firmware setup; the module then stays loaded and the depth camera keeps its nodes.

My depth camera shows SerialNumber=0 in dmesg. Can I still pin it by serial?

Not at the USB level: with SerialNumber=0 there is no USB serial string to match, so serial-keyed device rules cannot tell the two cameras apart. Pin the camera to one physical root port instead and re-run the node count after each replug to identify its block. Selecting the camera inside its own SDK, which names its cameras by its own identifiers, also works and survives reboots.

Does the integrated webcam conflict happen on Windows too?

Rarely. Windows names each camera device individually, so a second camera does not renumber the first out from under an SDK the way Linux /dev/video numbering can. On Windows, a camera present in Device Manager but missing in the SDK points instead at driver binding or a USB 2.0 fallback. The node-count diagnosis in this guide is the Linux path.

Do the 'Unknown video format' lines in dmesg matter?

No. A stock kernel does not know a depth camera's private pixel formats, so uvcvideo logs unknown-format warnings while still binding every interface. The failure traced here showed exactly those lines, and the camera enumerated and worked once the webcam conflict was cleared. The lines that matter are the ones reporting a UVC 1.10 device found and the driver bound to each interface.