Arducam IMX108 108MP USB camera only works in RAW, no RGB, resolution, exposure/gain

Hi everyone, hoping someone can point me in the right direction. We’re prototyping with the Arducam 108MP camera module (IMX108 sensor) and I’m having trouble getting it working. I can’t get frames in RGB mode at all — the only thing that works is RAW mode. Changing resolution doesn’t seem to be supported either. And the 108MP USB camera module won’t give me the exposure and gain I need. Is there proper documentation for the IMX108? I’m a bit stuck on what’s actually exposed.

Welcome! To help figure out what’s going on, can you share your full setup? Specifically which USB shield/board you’re using, the host OS, and which software/SDK you’re using to capture frames. Also let us know the full list of features you need (exposure, gain, color gains, ROI, resolution, etc.) so we can check what’s actually supported. If you have any code or logs from the failed RGB capture, paste them too.

Sure. We’re using the Arducam 108MP camera module (IMX108) with the USB3.0 Camera Shield Plus (SKU: B0317). We were previously using the IMX519 on a Raspberry Pi, and we’re moving to a Windows PC via the IMX519+USB solution. Before that we tried an IMX219 from the UVC catalogue but got stuck on colour gains. The features we need are: autofocus, high exposure for low light, high gain for low light, colour gain adjustment (red and blue gain), framerate 1 to 30, brightness, contrast, saturation, sharpness, ROI adjustment, and resolution adjustment (width and height).

Thanks, that’s helpful. Since we don’t have code or logs yet, let’s start with what you’ve already tried. You mentioned a config file — which one are you editing and what have you changed so far? Just so you know, the exposure and framerate ranges can be expanded using updated config files, so that might be part of what you’re seeing.

Right, I tried a new config file that expands the exposure and framerate adjustment range, and I was able to capture 108MP images with it. I also captured IMX519 reference images of white paper for comparison. The results: IMX519_image1 (dark blue coverage) is average, IMX519_image2 (light blue coverage) is perfect, IMX108_image1 (black + dark blue coverage) is insufficient, and IMX108_image2 (black + dark blue + light blue coverage) is a little below average. In IMX108_image2 I raised the analog gain MAX limit to 4800. Honestly, modifying the 108MP config file is tricky without knowing the register addresses and value limits.

Thanks for the detailed comparison — that tells us a lot. The IMX519 reference looks good but the IMX108 is clearly behind in low light. Part of what you’re seeing is lens shading. The Raspberry Pi does ISP lens shading, which is why images render better there. Our upper software doesn’t perform lens shading for this camera — that function is beyond what we can support directly and would require customization.

That makes sense. So is there any way to get lens shading working on our Windows/USB path? And in the meantime, what should we do about exposure and framerate?

For lens shading, it’s handled by the Raspberry Pi ISP, which gives the better results you saw. Getting the same on your path needs a customization project — I’ve escalated the request to the team that handles those, and they’ll follow up with you. For exposure and framerate in the meantime: use the updated config files (I’ve sent them to you in a private message — please check your inbox). One key point: when exposure goes up beyond a certain point, reduce the frame rate, otherwise the exposure won’t actually take effect.

Thanks, I’ll check the message. One more thing while we’re at it — can you confirm whether it’s possible to change resolution and RGB color mode on this module? Earlier I couldn’t get frames in RGB mode at all (only RAW works) and changing resolution didn’t seem to be supported. That’s a big blocker for us.

I checked with our hardware engineer on this. For this module, only two resolution types are opened in GitHub. And regarding RGB color mode — the module uses a raw sensor, so there’s no RGB color mode available from the sensor itself.

Got it, so just those two resolutions and no RGB. In that case, is the raw mode data in Bayer format? And is there any inbuilt function for ROI setting? I tried some code to convert the Bayer data to RGB but I keep getting a dimension error.

Yes — since the sensor is raw, the raw frames are Bayer-pattern data; there’s no RGB conversion happening on the camera, so you’ll need to handle Bayer→RGB on the host side. For the dimension error, double-check that the width/height you’re passing into the conversion matches the actual frame dimensions you’re receiving — remember only the two resolutions from GitHub are currently opened, so the frame size should be one of those. On ROI, there’s no inbuilt ROI function exposed beyond what those two resolutions provide; like the extra resolutions, a custom ROI would need to go through the customization path. To recap where we are: use the updated config files for the wider exposure/framerate range (and drop the framerate when exposure is high), stick to the two resolutions opened in GitHub for now, expect no RGB mode because it’s a raw sensor, and treat lens shading and any extra resolutions/ROI as customization items.