Mario Bergeron
Published © Apache-2.0

Automatic Activation of a Simple White Balance Algorithm

This project takes a look at using marker-based augmented reality to activate a simple white balance algorithm.

BeginnerFull instructions provided1 hour1,625

Things used in this project

Hardware components

UltraZed-EV Starter Kit
Avnet UltraZed-EV Starter Kit
×1
Avnet Quad AR0231AT Camera FMC Bundle
×1

Software apps and online services

Avnet Vitis-AI 1.3 Flow for UltraZed-EV Starter Kit + Quad Camera FMC
OpenCV
OpenCV

Story

Read more

Code

Launch quadcam gstreamer pipeline for AASWB

SH
#!/bin/sh

###########################
## Set media graph nodes ##
###########################

MEDIA_CTL_DEV="/dev/media1"
#MEDIA_CTL_DEV="/dev/media2"
#MEDIA_CTL_DEV=$1

### Set the number of camera streams to 4
#yavta --no-query -w '0x0098c981 4' /dev/v4l-subdev4

### Set the image sensor resolution and format
media-ctl -d $MEDIA_CTL_DEV -V '"AR0231.7-0011":0 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"AR0231.7-0012":0 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"AR0231.7-0013":0 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"AR0231.7-0014":0 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'

sleep 1

### Set the SERDES resolution and format
media-ctl -d $MEDIA_CTL_DEV -V '"MAX9286-SERDES.7-0048":0 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"MAX9286-SERDES.7-0048":1 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"MAX9286-SERDES.7-0048":2 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"MAX9286-SERDES.7-0048":3 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"MAX9286-SERDES.7-0048":4 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'

sleep 1

### Set up the CSI Rx subsystem resolution and format
media-ctl -d $MEDIA_CTL_DEV -V '"a0000000.mipi_csi2_rx_subsystem":0 [fmt:SGRBG8/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"a0000000.mipi_csi2_rx_subsystem":1 [fmt:SGRBG8/1920x1080 field:none]'

sleep 1

### Setup the AXI Switch resolution and format
media-ctl -d $MEDIA_CTL_DEV -V '"amba_pl@0:axis_switch@0":0 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"amba_pl@0:axis_switch@0":1 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"amba_pl@0:axis_switch@0":2 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"amba_pl@0:axis_switch@0":3 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'
media-ctl -d $MEDIA_CTL_DEV -V '"amba_pl@0:axis_switch@0":4 [fmt:SGRBG8/1920x1080 field:none colorspace:srgb]'

sleep 1

### Set Camera 0 capture pipeline properties, resize from 1920x1080 to 640x360
media-ctl -d $MEDIA_CTL_DEV -V '"b0040000.v_demosaic":0 [fmt:SGRBG8/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0040000.v_demosaic":1 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0000000.v_proc_ss":0 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0000000.v_proc_ss":1 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0080000.v_proc_ss":0 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0080000.v_proc_ss":1 [fmt:RBG24/640x360 field:none]'

sleep 1

### Set Camera 1 capture pipeline properties, resize from 1920x1080 to 640x360
media-ctl -d $MEDIA_CTL_DEV -V '"b0070000.v_demosaic":0 [fmt:SGRBG8/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0070000.v_demosaic":1 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0010000.v_proc_ss":0 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0010000.v_proc_ss":1 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b00c0000.v_proc_ss":0 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b00c0000.v_proc_ss":1 [fmt:RBG24/640x360 field:none]'

sleep 1

### Set Camera 2 capture pipeline properties, resize from 1920x1080 to 640x360
media-ctl -d $MEDIA_CTL_DEV -V '"b01d0000.v_demosaic":0 [fmt:SGRBG8/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b01d0000.v_demosaic":1 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0020000.v_proc_ss":0 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0020000.v_proc_ss":1 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0100000.v_proc_ss":0 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0100000.v_proc_ss":1 [fmt:RBG24/640x360 field:none]'

sleep 1

### Set Camera 3 capture pipeline properties, resize from 1920x1080 to 640x360
media-ctl -d $MEDIA_CTL_DEV -V '"b01f0000.v_demosaic":0 [fmt:SGRBG8/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b01f0000.v_demosaic":1 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0030000.v_proc_ss":0 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0030000.v_proc_ss":1 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0140000.v_proc_ss":0 [fmt:RBG24/1920x1080 field:none]'
media-ctl -d $MEDIA_CTL_DEV -V '"b0140000.v_proc_ss":1 [fmt:RBG24/640x360 field:none]'

# ### Set Brightness of CSC to 100%
yavta --no-query -w '0x0098c9a1 100' /dev/v4l-subdev10
yavta --no-query -w '0x0098c9a1 100' /dev/v4l-subdev11
yavta --no-query -w '0x0098c9a1 100' /dev/v4l-subdev12
yavta --no-query -w '0x0098c9a1 100' /dev/v4l-subdev13

        
gst-launch-1.0  \
    v4l2src device=/dev/video2 io-mode=4 ! \
    video/x-raw, width=640, height=360, format=BGR, framerate=30/1 ! \
    markerdetect wb-script="~/quadcam_aaswb.sh" wb-skip-frames=0 ! \
    fpsdisplaysink video-sink="kmssink bus-id=b0050000.v_mix plane-id=38 \
    render-rectangle=\"<0,0,640,360>\"" sync=false fullscreen-overlay=true \
    \
    v4l2src device=/dev/video3 io-mode=4 ! \
    video/x-raw, width=640, height=360, format=BGR, framerate=30/1 ! \
    queue ! vaifacedetect ! queue ! \
    fpsdisplaysink video-sink="kmssink bus-id=b0050000.v_mix plane-id=39 \
    render-rectangle=\"<640,0,640,360>\"" sync=false fullscreen-overlay=true \
    \
    v4l2src device=/dev/video4 io-mode=4 ! \
    video/x-raw, width=640, height=360, format=BGR, framerate=30/1 ! \
    queue ! vaifacedetect ! queue ! \
    fpsdisplaysink video-sink="kmssink bus-id=b0050000.v_mix plane-id=40 \
    render-rectangle=\"<0,360,640,360>\"" sync=false fullscreen-overlay=true \
    \
    v4l2src device=/dev/video5 io-mode=4 ! \
    video/x-raw, width=640, height=360, format=BGR, framerate=30/1 ! \
    queue ! vaifacedetect ! queue ! \
    fpsdisplaysink video-sink="kmssink bus-id=b0050000.v_mix plane-id=41 \
    render-rectangle=\"<640,360,640,360>\"" sync=false fullscreen-overlay=true \
    
     

# ### Set brightness of CSC back to 50%
# yavta --no-query -w '0x0098c9a1 50' /dev/v4l-subdev10
# yavta --no-query -w '0x0098c9a1 50' /dev/v4l-subdev11
# yavta --no-query -w '0x0098c9a1 50' /dev/v4l-subdev12
# yavta --no-query -w '0x0098c9a1 50' /dev/v4l-subdev13

AAWSB algorithm for quadcam

SH
#!/bin/bash

b_mean=$1
g_mean=$2
r_mean=$3

#echo "White Balance script"
#echo "   Color averages (B/G/R) = $b_mean/$g_mean/$r_mean"

#####################
## SENSOR CONTROLS ##
#####################
DEFAULT_PATH="/dev/v4l-subdev"

AR0231_COLOR_GAIN_RED="0x0098090e"
AR0231_COLOR_GAIN_BLUE="0x0098090f"
AR0231_COLOR_GAIN_GREEN="0x00980924"
AR0231_EXPOSURE="0x00980911"
AR0231_DIGITAL_GAIN="0x00980913"
AR0231_ANALOG_GAIN="0x009e0903"
AR0231_HORIZONTAL_FLIP="0x00980914"
AR0231_VERTICAL_FLIP="0x00980915"
AR0231_TEST_PATTERN="0x009f0903"

RED_GAIN_VALUE="280"
BLUE_GAIN_VALUE="1100"
GREEN_GAIN_VALUE="256"
EXPOSURE_VALUE="1000"
DIGITAL_GAIN_VALUE="606"
ANALOG_GAIN_VALUE="5"
HORIZONTAL_FLIP_VALUE="0"
VERTICAL_FLIP_VALUE="0"
TEST_PATTERN_VALUE="0"

# Get current values
val=0
subnode="$DEFAULT_PATH$val"
b_gain_str=$(yavta --no-query -r "$AR0231_COLOR_GAIN_BLUE" "$subnode" 2>&1)
g_gain_str=$(yavta --no-query -r "$AR0231_COLOR_GAIN_GREEN" "$subnode" 2>&1)
r_gain_str=$(yavta --no-query -r "$AR0231_COLOR_GAIN_RED" "$subnode" 2>&1)
exposure_str=$(yavta --no-query -r "$AR0231_EXPOSURE" "$subnode" 2>&1)
#echo "   Blue Gain = $b_gain_str"
#echo "   Green Gain = $g_gain_str"
#echo "   Red Gain = $r_gain_str"
b_gain=$(echo $b_gain_str | cut -d' ' -f 7)
g_gain=$(echo $g_gain_str | cut -d' ' -f 7)
r_gain=$(echo $r_gain_str | cut -d' ' -f 7)
exposure=$(echo $exposure_str | cut -d' ' -f 7)
#echo "   Current Color Gains (B/G/R) = $b_gain/$g_gain/$r_gain"
#echo "   Current Exposure = $exposure"

# Define targeted color average
x_mean=150
#x_mean=g_mean

# Adjust gains according to color averages
b_delta=$(( x_mean - b_mean ))
g_delta=$(( x_mean - g_mean ))
r_delta=$(( x_mean - r_mean ))
# large values cause oscillations, need to dampen adjustments
b_delta=$(( b_delta > +50 ? +50 : b_delta ))
b_delta=$(( b_delta < -50 ? -50 : b_delta ))
g_delta=$(( g_delta > +50 ? +50 : g_delta ))
g_delta=$(( g_delta < -50 ? -50 : g_delta ))
r_delta=$(( r_delta > +50 ? +50 : r_delta ))
r_delta=$(( r_delta < -50 ? -50 : r_delta ))
b_adjust=$(( b_delta/4 ))
g_adjust=$(( g_delta/4 ))
r_adjust=$(( r_delta/4 ))
# apply adjustments to color gains
BLUE_GAIN_VALUE=$((  b_gain + b_adjust ))
GREEN_GAIN_VALUE=$(( g_gain + g_adjust ))
RED_GAIN_VALUE=$((   r_gain + r_adjust ))
#echo "   Updated Color Gains (B/G/R) = $BLUE_GAIN_VALUE/$GREEN_GAIN_VALUE/$RED_GAIN_VALUE"
#echo "   Updated Color Gains (B/G/R) = $BLUE_GAIN_VALUE/$GREEN_GAIN_VALUE/$RED_GAIN_VALUE ($b_adjust/$g_adjust/$r_adjust)"

echo "QuadCam AASWB : BGR Averages = $b_mean/$g_mean/$r_mean | BGR Gains = $BLUE_GAIN_VALUE/$GREEN_GAIN_VALUE/$RED_GAIN_VALUE ($b_adjust/$g_adjust/$r_adjust)"

#echo -n "Setting sensor controls... "
for val in {0..3}
do
	subnode="$DEFAULT_PATH$val"
	yavta --no-query -l "$subnode" > /dev/null 2>&1
	yavta --no-query -w "$AR0231_COLOR_GAIN_RED $RED_GAIN_VALUE" "$subnode" > /dev/null 2>&1
	yavta --no-query -w "$AR0231_COLOR_GAIN_BLUE $BLUE_GAIN_VALUE" "$subnode" > /dev/null 2>&1
	yavta --no-query -w "$AR0231_COLOR_GAIN_GREEN $GREEN_GAIN_VALUE" "$subnode" > /dev/null 2>&1
	yavta --no-query -w "$AR0231_EXPOSURE $EXPOSURE_VALUE" "$subnode" > /dev/null 2>&1
	#yavta --no-query -w "$AR0231_DIGITAL_GAIN $DIGITAL_GAIN_VALUE" "$subnode" > /dev/null 2>&1
	#yavta --no-query -w "$AR0231_ANALOG_GAIN $ANALOG_GAIN_VALUE" "$subnode" > /dev/null 2>&1
	#yavta --no-query -w "$AR0231_HORIZONTAL_FLIP $HORIZONTAL_FLIP_VALUE" "$subnode" > /dev/null 2>&1
	#yavta --no-query -w "$AR0231_VERTICAL_FLIP $VERTICAL_FLIP_VALUE" "$subnode" > /dev/null 2>&1
	#yavta --no-query -w "$AR0231_TEST_PATTERN $TEST_PATTERN_VALUE" "$subnode" > /dev/null 2>&1
done
#echo "Done!"

Credits

Mario Bergeron

Mario Bergeron

38 projects • 256 followers
Mario Bergeron is a Technical Marketing Engineer working at Avnet, specializing in embedded vision and machine learning.

Comments