Hey everyone, I’ve been running EMVA 1288 standard compliance tests on an Arducam B0176 (it’s the 5MP OV5647 1080p autofocus module with motorized focus) and I’m hitting a wall.
Setup is a Raspberry Pi 5 — I’ve also tested on a Pi 4 and a 3B+ just to rule out platform weirdness. What I’m trying to determine is whether the exposure response of this camera is linear, which is kind of fundamental for the EMVA 1288 measurements.
The problem: I cannot confirm linearity. My plots don’t look right at all. The response curve deviates from what I’d expect from a linear sensor across the exposure range I’m testing. I’ve gone through the test procedure multiple times and the results consistently show non-linear behavior.
Has anyone else tried EMVA 1288 characterization on this module? Is the OV5647 just not linear, or am I doing something wrong?
What you’re seeing is expected behavior for the B0176 in its default output mode. The exposure response is indeed non-linear, and it’s not a measurement error on your end.
Root cause is the OV5647 sensor itself — it’s a consumer-grade sensor with an integrated ISP (Image Signal Processor) that runs a whole pipeline on-sensor before you even get the frame. Specifically:
Demosaicing (Bayer → RGB conversion)
Noise reduction
White balance
Color correction
Gamma correction / tone mapping (sRGB curve, roughly gamma ~2.2)
That gamma correction is the biggest offender for EMVA 1288 work. A gamma 2.2 curve is intentionally non-linear — it’s designed for display-referred imagery, not radiometric measurements. The sensor was never meant to output photometrically linear data by default.
So the short version: the default output is unsuitable for EMVA 1288 linearity compliance. You’re not doing anything wrong in your test procedure — the data pipeline itself is the issue.
Thanks for the detailed explanation — that makes a lot of sense. The gamma curve would absolutely explain what I’m seeing in my plots.
So follow-up question: is there any way to disable the ISP on the OV5647 / Arducam B0176? I’m thinking if I can bypass the gamma correction, noise reduction, white balance, color correction, and demosaicing — basically get the raw Bayer data straight off the sensor — then I should be able to get a linear response for the EMVA 1288 measurements. Is there a command or some register tweak to turn all of that off?
Good question. The recommended approach for bypassing the ISP and grabbing unprocessed raw data from the sensor is the libcamera-raw command. This lets you pull the raw Bayer frames before the ISP pipeline touches them — so you avoid the gamma correction, demosaicing, white balance, color correction, and noise reduction that are baked into the default output path.
That said, there’s an important caveat: even with libcamera-raw, the sensor itself performs some fundamental corrections in hardware that simply cannot be disabled. Specifically:
Black level adjustment — the sensor subtracts an optical black reference level from the pixel values at the hardware level.
Bad pixel correction — the sensor identifies and corrects defective pixels on-chip.
These happen before the data ever leaves the sensor. They’re not configurable through any register we have access to (or at all, really — they’re part of the OV5647’s internal readout pipeline).
So the bottom line: libcamera-raw will get you the closest thing to unprocessed, linear raw data that the OV5647 can produce — way better than the default output for EMVA 1288 purposes — but the Arducam B0176 cannot deliver guaranteed absolute exposure linearity because of those two hardware-level corrections you can’t turn off. It’s a limitation of the sensor silicon, not the module or the driver stack.