ModalAI Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Hadron ov64b snapshots have a vertical image artifact

    Video and Image Sensors
    2
    6
    46
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • R
      restore
      last edited by

      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
                      }]
      }
      

      d2a6eb7b-eab9-4286-b292-0d1813e0875e-image.png

      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 0
      

      Lastly - are we able to capture RAW images from the hadron at full resolution?

      Thanks!

      Alex KushleyevA 1 Reply Last reply Reply Quote 0
      • Alex KushleyevA
        Alex Kushleyev ModalAI Team @restore
        last edited by

        @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_bayer pipe and you can dump individual images using voxl-record-raw-image tool.

        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_quality param in your voxl-camera-server.conf is set to 75.

        Alex

        R 1 Reply Last reply Reply Quote 0
        • R
          restore @Alex Kushleyev
          last edited by

          @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.

          Alex KushleyevA 1 Reply Last reply Reply Quote 0
          • Alex KushleyevA
            Alex Kushleyev ModalAI Team @restore
            last edited by Alex Kushleyev

            @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

            R 1 Reply Last reply Reply Quote 0
            • R
              restore @Alex Kushleyev
              last edited by

              @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 cameras
              

              voxl-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?

              Alex KushleyevA 1 Reply Last reply Reply Quote 0
              • Alex KushleyevA
                Alex Kushleyev ModalAI Team @restore
                last edited by Alex Kushleyev

                @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 -l

                by "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-portal or just using voxl-inspect-cam hires_misp_color to get the data flowing, then you can save the raw bayer, which will have the proper exposure and gain applied.

                Alex

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post
                Powered by NodeBB | Contributors