Hadron ov64b snapshots have a vertical image artifact
-
We have our VOXL2 with Hadron connected on J8. We have everything setup and can capture images successfully. After taking a bunch of images we noticed a vertical artifact in the hires_snapshot that consistently appears in the same column of pixels (~340).
Is this a data processing flaw? If so is there a way to diagnose / troubleshoot it? Here is my voxl-camera-server.conf and an example crop of the artifact.
{ "version": 0.1, "fsync_en": false, "fsync_gpio": 109, "cameras": [{ "type": "boson", "name": "boson", "enabled": true, "camera_id": 0, "fps": 30, "en_preview": true, "en_misp": false, "preview_width": 640, "preview_height": 512, "en_raw_preview": true, "en_small_video": false, "en_large_video": false, "ae_mode": "off", "en_rotate": false, "small_video_width": 640, "small_video_height": 480, "small_venc_mode": "h264", "small_venc_br_ctrl": "cqp", "small_venc_Qfixed": 30, "small_venc_Qmin": 15, "small_venc_Qmax": 40, "small_venc_nPframes": 9, "small_venc_mbps": 2, "small_venc_osd": false, "large_video_width": -1, "large_video_height": -1, "large_venc_mode": "h264", "large_venc_br_ctrl": "cqp", "large_venc_Qfixed": 40, "large_venc_Qmin": 15, "large_venc_Qmax": 50, "large_venc_nPframes": 29, "large_venc_mbps": 40, "large_venc_osd": false, "misp_width": -1, "misp_height": -1, "misp_venc_enable": true, "misp_venc_mode": "h264", "misp_venc_br_ctrl": "cqp", "misp_venc_Qfixed": 30, "misp_venc_Qmin": 15, "misp_venc_Qmax": 50, "misp_venc_nPframes": 29, "misp_venc_mbps": 2, "misp_venc_osd": false, "misp_awb": "auto", "misp_gamma": 1, "gain_min": 54, "gain_max": 8000 }, { "type": "ov64b", "name": "hires", "enabled": true, "camera_id": 1, "fps": 15, "en_preview": true, "en_misp": false, "preview_width": 1920, "preview_height": 1080, "en_raw_preview": false, "en_small_video": false, "en_large_video": false, "en_snapshot": true, "ae_mode": "isp", "gain_min": 100, "gain_max": 32000, "small_video_width": 1024, "small_video_height": 768, "small_venc_mode": "h264", "small_venc_br_ctrl": "cqp", "small_venc_Qfixed": 30, "small_venc_Qmin": 15, "small_venc_Qmax": 40, "small_venc_nPframes": 9, "small_venc_mbps": 2, "small_venc_osd": false, "large_video_width": 3840, "large_video_height": 2160, "large_venc_mode": "h264", "large_venc_br_ctrl": "cqp", "large_venc_Qfixed": 40, "large_venc_Qmin": 15, "large_venc_Qmax": 50, "large_venc_nPframes": 29, "large_venc_mbps": 40, "large_venc_osd": false, "en_snapshot_width": 9248, "en_snapshot_height": 6944, "exif_focal_length": 3.0999999046325684, "exif_focal_length_in_35mm_format": 17, "exif_fnumber": 1.2400000095367432, "snapshot_jpeg_quality": 75, "misp_width": -1, "misp_height": -1, "misp_venc_enable": true, "misp_venc_mode": "h265", "misp_venc_br_ctrl": "cqp", "misp_venc_Qfixed": 38, "misp_venc_Qmin": 15, "misp_venc_Qmax": 50, "misp_venc_nPframes": 29, "misp_venc_mbps": 30, "misp_venc_osd": false, "misp_awb": "auto", "misp_gamma": 1.6 }] }
Additionally - we are noticing a soft focus on every image. Are there any camera-server parameters for the Hadron that could lead to this sort of effect? Image EXIF shows:
9248 x 6944 72 dpi 24 bit 3.1 mm f/1.24 1/2500 ISO 54 EXP 0Lastly - are we able to capture RAW images from the hadron at full resolution?
Thanks!
-
@restore, that is strange. Does this effect appear in the jpeg snapshot only? (as opposed to the preview stream).
Yes, we do support saving raw bayer10 for this camera. For 9248 x 6944, each image would be something like 80MB (10-bit bayer)
In order to test it,
- set your preview width and height to 9248 x 6944
- en_raw_preview : true
- en_snapshot : false (for now)
- en_misp : true
- set misp width and height to something reasonable (1920x1080)
When you run it, assuming there are no errors, you should see
hires_bayerpipe and you can dump individual images usingvoxl-record-raw-imagetool.I have not tested this in a while, but it should work. Let me know if you run into any issues.
Also, please use an SDK that is not older than few months, as we recently enabled the full raw resolution support for this camera.
Regarding the jpeg smoothing, the parameters are baked into the chromatix tuning file and we have not tuned that for any particular application. However, you should first check whether the jpeg encode quality is sufficiently high.
snapshot_jpeg_qualityparam in yourvoxl-camera-server.confis set to 75.Alex
-
@Alex-Kushleyev thanks for your response!
I will try these suggestions and let you know how it goes.
I tested jpeg quality at 75 and 95 and did not notice much of a difference in sharpness.
-
@restore , a few more things:
- you should set the auto exposure to
lme_msv, which is the non-isp option, since we would not be using isp in this case - before saving the raw bayer, start the misp output stream, so that AE can actually process, otherwise the exposure will be stuck in default value -- the bayer stream does not trigger AE to process.
Alex
- you should set the auto exposure to
-
@Alex-Kushleyev I tried to configure for raw capture but am getting an error with camera-server:
existing instance of voxl-camera-server found, attempting to stop it MISP awb str: auto Setting MISP AWB to Auto MISP channels enabled in defaults : 0 ERROR: object missing misp_channels MISP awb str: auto Setting MISP AWB to Auto MISP channels enabled in defaults : 0 ERROR: object missing misp_channels ================================================================= configuration for 2 cameras: cam #0 name: boson sensor type: boson isEnabled: 1 camId: 0 camId2: -1 fps: 30 en_rotate: 0 en_rotate2: 0 en_preview: 1 pre_width: 640 pre_height: 512 en_raw_preview: 1 en_small_video: 0 small_video_width: 640 small_video_height: 480 en_large_video: 0 large_video_width: -1 large_video_height: -1 en_misp: 1 misp_width: -1 misp_height: -1 en_snapshot: 0 snap_width: -1 snap_height: -1 exif_focal_length: 0.000000 exif_focal_len_35mm_format:0 exif_fnumber: 0.000000 ae_mode: off msv_exposure_min_us: 20 msv_exposure_max_us: 33000 gain_min : 54 gain_max : 8000 standby_enabled: 0 decimator: 1 independent_exposure:0 cam #1 name: hires sensor type: ov64b isEnabled: 1 camId: 1 camId2: -1 fps: 15 en_rotate: 0 en_rotate2: 0 en_preview: 1 pre_width: 9248 pre_height: 6944 en_raw_preview: 1 en_small_video: 0 small_video_width: 1024 small_video_height: 768 en_large_video: 0 large_video_width: 3840 large_video_height: 2160 en_misp: 1 misp_width: 1920 misp_height: 1080 en_snapshot: 0 snap_width: 9248 snap_height: 6944 exif_focal_length: 3.100000 exif_focal_len_35mm_format:17 exif_fnumber: 1.240000 ae_mode: lme_msv msv_exposure_min_us: 20 msv_exposure_max_us: 33000 gain_min : 100 gain_max : 32000 standby_enabled: 0 decimator: 1 independent_exposure:0 fsync_en: 0 fsync_gpio: 109 ================================================================= thread is locked to cores: 4 5 6 7 connected to mavlink pipe Connected to cpu-monitor Starting Camera: boson (id #0) gbm_create_device(156): Info: backend name is: msm_drm MISP Initializing!!! Detected 1 platform(s) Detected 1 GPU device(s) Starting Camera: hires (id #1) ERROR: Configure streams failed for camera: 1 ERROR: Failed to configure streams for camera: hires ERROR: Failed to start camera: hires ------ voxl-camera-server: Started 1 of 2 camerasvoxl-version:
system-image: 1.8.04-M0054-14.1a-perf kernel: #1 SMP PREEMPT Mon Mar 24 22:31:58 UTC 2025 4.19.125 ──────────────────────────────────────────────────────────────────────────────── hw platform: M0054 mach.var: 1.0.1 SKU: MCCA-M0054-C11-T0-M0-X0 ──────────────────────────────────────────────────────────────────────────────── voxl-suite: 1.5.1 ──────────────────────────────────────────────────────────────────────────────── Packages: Repo: http://voxl-packages.modalai.com/ qrb5165 dev Last Updated: 2026-03-18 19:55:21 List: libfc-sensor 1.0.7 libmodal-cv 0.5.18 libmodal-exposure 0.1.4 libmodal-journal 0.2.6 libmodal-json 0.4.7 libmodal-pipe 2.13.2 libqrb5165-io 0.5.0 libvoxl-cci-direct 0.3.3 libvoxl-cutils 0.1.5 modalai-slpi 1.2.0 mv-voxl 0.1-r0 qrb5165-bind 0.1-r0 qrb5165-dfs-server 0.2.0 qrb5165-imu-server 1.1.3 qrb5165-mini-tof-server 0.2.2 qrb5165-rangefinder-server 0.1.5 qrb5165-slpi-test-sig 01-r0 qrb5165-system-tweaks 0.3.6 qrb5165-tflite 2.8.0-2 voxl-ardupilot 4.8.0-325875bb voxl-bind-spektrum 0.1.1 voxl-camera-calibration 0.6.0 voxl-camera-server 2.2.4 voxl-ceres-solver 2:1.14.0-10 voxl-configurator 1.0.3 voxl-cpu-monitor 0.6.0 voxl-docker-support 1.3.1 voxl-elrs 0.4.7 voxl-esc 1.5.4 voxl-feature-tracker 0.5.2 voxl-flow-server 0.3.6 voxl-gphoto2-server 0.0.10 voxl-joystick-server 0.0.6 voxl-jpeg-turbo 2.1.3-7 voxl-lepton-server 1.3.3 voxl-lepton-tracker 0.0.4 voxl-libgphoto2 0.0.4 voxl-libuvc 1.0.7 voxl-logger 0.5.3 voxl-mavcam-manager 0.6.0 voxl-mavlink 0.1.5 voxl-mavlink-server 1.4.15-202603130958 voxl-modem 1.1.8 voxl-mongoose 7.7.0-2 voxl-mpa-to-ros 0.3.9 voxl-mpa-tools 1.4.0 voxl-open-vins 0.4.19 voxl-open-vins-server 0.3.12 voxl-opencv 4.5.5-3 voxl-osd 0.1.8 voxl-portal 0.7.11 voxl-px4 1.14.0-2.0.105 voxl-px4-params 0.7.6 voxl-qvio-server 1.2.0 voxl-remote-id 0.0.9 voxl-reset-slpi 0.0.1 voxl-state-estimator 0.0.5 voxl-streamer 0.7.5 voxl-suite 1.5.1 voxl-tag-detector 0.0.5 voxl-tflite-server 0.4.1 voxl-utils 1.4.8 voxl-uvc-server 0.1.7 voxl-vision-hub 1.8.23 voxl-vtx 1.4.7 voxl-wavemux 0.0.1 voxl2-io 0.0.3 voxl2-system-image 1.8.04-r0 voxl2-wlan 1.0-r0@Alex-Kushleyev said in Hadron ov64b snapshots have a vertical image artifact:
before saving the raw bayer, start the misp output stream, so that AE can actually process
what do you mean by start the misp output stream?
-
@restore , the change to enable the maximum resolution raw output for OV64B was made at the end of October 2025, so you would need at least SDK 1.6.0, I believe. There was a change in the camera pipeline (not the camera driver) to allow such a large image size. Are you able to test on a newer SDK (just test the latest if you can)?
Additionally, the resolution 9248x6944 cannot be directly used in MISP debayering (which uses OpenCL). There are some special requirements on the image stride, which width of 9248 does not match. So what will happen is the cpu will realign the image before feeding it to the gpu, but it is a lot of data to copy for a 64Mpix sensor. So I made a small change in width from 9248 to 9216 (just cut off 32 pixels) and it can be fed into the gpu directly. That change is not published yet, but i can share it.
Lets first confirm that you can use the 1.6.x SDK to start the camera server at 9248x6944 and you should be able to save raw bayer and view the misp output.
you can always double check the list of available raw resolutions using
voxl-camera-server -lby "start the misp output stream", i mean that you need to have a client that subscribes to the misp output stream, so that the frames start going and AE can work, sending exposure and gain updates to the camera, so that the image is properly exposed. For example, viewing the stream in
voxl-portalor just usingvoxl-inspect-cam hires_misp_colorto get the data flowing, then you can save the raw bayer, which will have the proper exposure and gain applied.Alex
-
@Alex-Kushleyev we are still having some issues getting the raw images from the hadron. We have updated to SDK 1.6.3. Here is the results when setting the preview resolution to 4624x3472 and disabling MISP (camera server runs, cant get raw image):
Setting MISP AWB to Auto MISP channels enabled in defaults : 0 MISP channels enabled in config file: 0 Setting MISP AWB to Auto MISP channels enabled in defaults : 0 MISP channels enabled in config file: 0 ================================================================= configuration for 2 cameras: cam #0 name: boson type: boson bayer_type: 0 enabled: 0 camera_id: 0 camera_id_second: -1 fps: 30 en_rotate: 0 en_rotate2: 0 en_preview: 1 en_raw_preview: 1 preview_width: 640 preview_height: 512 en_misp: 0 misp_width: -1 misp_height: -1 en_small_video: 0 small_video_width: 640 small_video_height: 480 en_large_video: 0 large_video_width: -1 large_video_height: -1 en_snapshot: 0 snap_width: -1 snap_height: -1 exif_focal_length: 0.000000 exif_focal_len_35mm_format:0 exif_fnumber: 0.000000 ae_mode: off msv_exposure_min_us: 20 msv_exposure_max_us: 33000 gain_min : 54 gain_max : 8000 standby_enabled: 0 decimator: 1 independent_exposure:0 cam #1 name: hires type: ov64b bayer_type: 1 enabled: 1 camera_id: 1 camera_id_second: -1 fps: 5 en_rotate: 0 en_rotate2: 0 en_preview: 1 en_raw_preview: 1 preview_width: 4624 preview_height: 3472 en_misp: 0 misp_width: 4624 misp_height: 3472 en_small_video: 1 small_video_width: 1024 small_video_height: 768 en_large_video: 0 large_video_width: 3840 large_video_height: 2160 en_snapshot: 0 snap_width: 3840 snap_height: 2160 exif_focal_length: 3.100000 exif_focal_len_35mm_format:17 exif_fnumber: 1.240000 ae_mode: isp msv_exposure_min_us: 20 msv_exposure_max_us: 33000 gain_min : 100 gain_max : 32000 standby_enabled: 0 decimator: 1 independent_exposure:0 fsync_en: 0 fsync_gpio: 109 ================================================================= thread is locked to cores: 4 5 6 7 connected to mavlink pipe Connected to cpu-monitor Skipping Camera: boson, configuration marked disabled Starting Camera: hires (id #1) Estimated imu dt = 0.000977s gbm_create_device(156): Info: backend name is: msm_drm ------ voxl-camera-server: Started 1 of 2 cameras ------ voxl-camera-server: Camera server is now running Received RAW10 frame from camera hires, will be converting to RAW8 on cpuHere is what we see when we do use MISP, and full resolution:
existing instance of voxl-camera-server found, attempting to stop it Setting MISP AWB to Auto MISP channels enabled in defaults : 0 MISP channels enabled in config file: 0 Setting MISP AWB to Auto MISP channels enabled in defaults : 0 MISP channels enabled in config file: 0 ================================================================= configuration for 2 cameras: cam #0 name: boson type: boson bayer_type: 0 enabled: 0 camera_id: 0 camera_id_second: -1 fps: 30 en_rotate: 0 en_rotate2: 0 en_preview: 1 en_raw_preview: 1 preview_width: 640 preview_height: 512 en_misp: 0 misp_width: -1 misp_height: -1 en_small_video: 0 small_video_width: 640 small_video_height: 480 en_large_video: 0 large_video_width: -1 large_video_height: -1 en_snapshot: 0 snap_width: -1 snap_height: -1 exif_focal_length: 0.000000 exif_focal_len_35mm_format:0 exif_fnumber: 0.000000 ae_mode: off msv_exposure_min_us: 20 msv_exposure_max_us: 33000 gain_min : 54 gain_max : 8000 standby_enabled: 0 decimator: 1 independent_exposure:0 cam #1 name: hires type: ov64b bayer_type: 1 enabled: 1 camera_id: 1 camera_id_second: -1 fps: 5 en_rotate: 0 en_rotate2: 0 en_preview: 1 en_raw_preview: 1 preview_width: 9248 preview_height: 6944 en_misp: 1 misp_width: 1920 misp_height: 1080 en_small_video: 1 small_video_width: 1024 small_video_height: 768 en_large_video: 0 large_video_width: 3840 large_video_height: 2160 en_snapshot: 0 snap_width: 3840 snap_height: 2160 exif_focal_length: 3.100000 exif_focal_len_35mm_format:17 exif_fnumber: 1.240000 ae_mode: lme_msv msv_exposure_min_us: 20 msv_exposure_max_us: 33000 gain_min : 100 gain_max : 32000 standby_enabled: 0 decimator: 1 independent_exposure:0 fsync_en: 0 fsync_gpio: 109 ================================================================= thread is locked to cores: 4 5 6 7 connected to mavlink pipe Connected to cpu-monitor Skipping Camera: boson, configuration marked disabled Starting Camera: hires (id #1) ERROR: Configure streams failed for camera: 1 ERROR: Failed to configure streams for camera: hires ERROR: Failed to start camera: hires ERROR: failed to initialize any cameras ------ voxl-camera-server: Started 0 of 2 cameras ------ voxl-camera-server: Camera server is now running ------ voxl-camera-server: Camera server is now stopping ------ voxl-camera-server: Camera server exited gracefully, returning -1 IMU Manager closing and exiting -
OK, I will test it and get back to you shortly

-
@Alex-Kushleyev Some additional info: When we ran at the lower resolution and tried viewing hires_bayer in the voxl portal this error would pop up in the terminal running
voxl-camera-server:ERROR: Could not find frame size from the raw buffer ERROR: MISP: Unexpected frame size for camera hires, width 4624, height 3472, stride 5792, alloc 20111360 bytes, calc frame size 20109824 ERROR: Could not find frame size from the raw bufferThank you for your speedy response
-
@cguzikowski , OK, yes i know what that issue is (unexpected frame size). I will that and test both resolutions.
-
Good news. I got it working, but there were a few things needed to update. I packaged everything into a zip : https://storage.googleapis.com/modalai_public/temp/ov64b/20260401/ov64b_20260401.zip . It contains
- latest sensormodules for Boson and ov64b
- voxl-camera-server conf
- updated default tuning file (to fix the gain scale so that gain 1.0 is 100, not 54)
- updated
com.qti.chi.override.sofile which contains some pipeline information, now it will allow the large raw resolutions
(I thought the above changes were already in the latest SDK but somehow they did not make it, I will need to double check).
I also made some changes to the ov64b driver:
- updated frame length for the 9248x6944 mode so that it is 10fps (not 9.2) -- this is close to max
- added modes
9216x6944@10fpsand4608x3472@30fps(slightly cropped on the right), so that these buffers can be used by MISP / gpu without doing a copy.
I am able to capture the raw bayer at
9216x6944,9248x6944,4624x3472,4608x3472resolutionsvoxl-inspect-cam hires_bayer ... | Pipe Name | bytes | wide | hgt |exp(ms)| gain | frame id |latency(ms)| fps | mbps | format | hires_bayer |79994880 | 9216 | 6944 | 33.00 | 1594 | 130 | 157.9 | 10.0 | 6415.5 | RAW10In order to enable the misp support for the
4624x3472and4608x3472resolutions in camera server, need a small update:
https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/commit/389b1f4628a9b9cc0e53c43a5cf0e457717e1270You can save the raw bayer using the
voxl-record-raw-imagetool, for example:voxl-record-raw-image hires_bayer -d .You should be able to dump some raw bayer images and de-bayer them offline.
Also, here is the contents of the README that is inside the zip:
Supported Hardware
- voxl2
- Hadron plugged into VOXL2 J8 via M0181 adapter
Instructions
- copy Boson sensormodule to /usr/lib/camera/
- copy ov64b sensormodule with correct id to /usr/lib/camera/
- copy com.qti.tuned.default.bin to /usr/lib/camera to fix the gain scale (1.0x = 100)
- back up /usr/lib/hw/com.qti.chi.override.so and replace it with com.qti.chi.override.so.20260401 (rename to com.qti.chi.override.so)
- this updated file allows the pipeline to use the highest resolution of the ov64b camera
- copy voxl-camera-server.conf to /etc/modalai
Suported Resolutions
- mode 0 : 9248x6944 10 bit 10 fps
- mode 1 : 9216x6944 10 bit 10 fps (MISP no copy) -- crop 32 pixels on the right
- mode 2 : 4624x3472 10 bit 30 fps
- mode 3 : 4608x3472 10 bit 30 fps (MISP no copy) -- crop 16 pixels on the right
- mode 4 : 3840x2160 10 bit 60 fps (MISP no copy)
- mode 5 : 1920x1080 10 bit 240 fps
- mode 6 : 1920x1080 10 bit 30 fps
Notes
- even thought the 9248x6944 and 9216x6944 modes are 10 fps, you need to specify 30fps in the camera config file. This will be investigated further.
-
Once you confirm this working, we can discuss the options for snapshots without going through the ISP, but you can either saw the raw bayer or any of the misp outputs using
voxl-record-raw-imageand convert to jpg / png offline if that works for you, but we can also help add a compression option tovoxl-record-raw-image.Please note that the current debayering algorithm in MISP does add some smoothing / interpolation, so the YUV image is not going to be as crisp as possible. You could compare it to the jpg output of the ISP (even thought it has artifacts). If you are looking for highest possible fidelity, it may be best to perform offline processing on the raw bayer, then you have more options.
Alex