#!/bin/sh
PROGNAME=`basename $0`
USAGE="Usage: $PROGNAME <left_image_file> <right_image_file> <optional_args>"

LEFT_FILE_ROOT=$1
RIGHT_FILE_ROOT=$2
INLIER_DIST="1.0"
SCORE_METH="-l"
CORNER_ONE="800"
CORNER_TWO="800"
EXTENSION="jpg"
CORRMATCH_METH="-l"
CORRMATCH_THRESHOLD="0.9"
STOP_EARLY_PROB="0.99999"
WINDOW_SIZE="13"
MAX_X_DISPARITY="0.3"
MAX_Y_DISPARITY="0.3"
CORRMATCH_TYPE="-rgbavg"
ANGLE_ROTATION=0
NUMBER_STEPS=0
DOUBLE_INLIER_DIST=`expr $INLIER_DIST : '\([0-9]*\)'`
DOUBLE_INLIER_DIST=`expr $DOUBLE_INLIER_DIST + $DOUBLE_INLIER_DIST + 1`
FUNDAMENTAL_ALGO="-h"
SUBPIXMATCH=""

if [ $# -lt 2 ]; then
	echo $USAGE
	echo "   "
	echo "Optional args and current defaults:"
	echo "Inlier distance -d <number>" $INLIER_DIST 
	echo "Corner one count -m <number>" $CORNER_ONE 
	echo "Corner two count -n <number>" $CORNER_TWO 
	echo "Corrmatch method: least squares -l or cross-correlate -c" $CORRMATCH_METH
	echo "Corrmatch type : intensity -i or colour -r" $CORRMATCH_TYPE
	echo "Corrmatch threshold -t <number>" $CORRMATCH_THRESHOLD
	echo "Stop early prob -s <number>" $STOP_EARLY_PROB
	echo "Window size -w <size>" $WINDOW_SIZE
	echo "Max X disparity -x <image fraction>" $MAX_X_DISPARITY
	echo "Max Y disparity -y <image fraction>" $MAX_Y_DISPARITY
	echo "Angle rotation -a <number>" $ANGLE_ROTATION
	echo "Number steps -b <number>" $NUMBER_STEPS
	echo "File extension type -e <type>" $EXTENSION
	echo "Fundamental matrix algorithm: [-hartley | -affine | -torr]" $FUNDAMENTAL_ALGO
	echo "Scoring method: [-count | -l2]" $SCORE_METH
	echo "Subpixel correlation: -subpixcorr correlation on (shown as -n), default off (shown as blank)" $SUBPIXMATCH
	exit 1
fi

shift
shift
while [ $# -ne 0 ]; do
	case "$1" in
		-d)
			shift
			INLIER_DIST=$1
			DOUBLE_INLIER_DIST=`expr $INLIER_DIST : '\([0-9]*\)'`
			DOUBLE_INLIER_DIST=`expr $DOUBLE_INLIER_DIST + $DOUBLE_INLIER_DIST + 1`
			shift
			;;
		-subpixcorr)
			SUBPIXMATCH="-n"
			shift
			;;
		-affine)
			FUNDAMENTAL_ALGO="-a"
			shift
			;;
		-hartley)
			FUNDAMENTAL_ALGO="-h"
			shift
			;;
		-torr)
			FUNDAMENTAL_ALGO=""
			shift
			;;
		-count)
			SCORE_METH="-c"
			shift
			;;
		-l2)
			SCORE_METH="-l2"
			shift
			;;
		-w)
			shift
			WINDOW_SIZE=$1
			shift
			;;
		-i)
			CORRMATCH_TYPE="-i"
			shift
			;;
		-a)
			shift
			ANGLE_ROTATION=$1
			shift
			;;
		-b)
			shift
			NUMBER_STEPS=$1
			shift
			;;
		-r)
			CORRMATCH_TYPE="-rgbavg"
			shift
			;;
		-l)
			CORRMATCH_METH="-l"
			shift
			;;
		-c)
			CORRMATCH_METH="-c"
			shift
			;;
		-m)
			shift
			CORNER_ONE=$1
			shift
			;;
		-x)
			shift
			MAX_X_DISPARITY=$1
			shift
			;;
		-y)
			shift
			MAX_Y_DISPARITY=$1
			shift
			;;
		-t)
			shift
			CORRMATCH_THRESHOLD=$1
			shift
			;;
		-s)
			shift
			STOP_EARLY_PROB=$1
			shift
			;;
		-n)
			shift
			CORNER_TWO=$1
			shift
			;;

		-e)
			shift
			EXTENSION=$1
			shift
			;;	
		*)
			echo $USAGE
			exit 1
			;;
	esac
done

echo "Inlier distance -d <number>" $INLIER_DIST 
echo "Corner one count -m <number>" $CORNER_ONE 
echo "Corner two count -n <number>" $CORNER_TWO 
echo "Corrmatch method: least squares -l or cross-correlate -c" $CORRMATCH_METH
echo "Corrmatch type: intensity -i or colour -r" $CORRMATCH_TYPE
echo "Corrmatch threshold -t <number>" $CORRMATCH_THRESHOLD
echo "Stop early prob -s <number>" $STOP_EARLY_PROB
echo "Window size -w <size>" $WINDOW_SIZE
echo "Max X disparity -x <size>" $MAX_X_DISPARITY
echo "Max Y disparity -y <size>" $MAX_Y_DISPARITY
echo "Angle rotation -a <number>" $ANGLE_ROTATION
echo "Number steps -b <number>" $NUMBER_STEPS
echo "File extension type -e <type>" $EXTENSION
echo "Fundamental matrix algorithm: [-hartley | -affine | -torr]" $FUNDAMENTAL_ALGO
echo "Scoring method: [-count | -l2]" $SCORE_METH
echo "Subpixel match: -subpixel matching on (shown as -n), default off (shown as blank)" $SUBPIXMATCH

LEFT_FILE="$LEFT_FILE_ROOT.$EXTENSION"
RIGHT_FILE="$RIGHT_FILE_ROOT.$EXTENSION"
#
#first time through to get an approximate fundamental matrix
#
findcorners -h -f $LEFT_FILE -m $CORNER_ONE 
findcorners -h -f $RIGHT_FILE -m $CORNER_ONE 
corrmatch -lf $LEFT_FILE -rf $RIGHT_FILE -xp $MAX_X_DISPARITY -yp $MAX_Y_DISPARITY -w $WINDOW_SIZE $CORRMATCH_METH $CORRMATCH_TYPE $CORRMATCH_THRESHOLD -a $ANGLE_ROTATION -s $NUMBER_STEPS $SUBPIXMATCH

#
#filter the matches from corrmatch and compute fundamental
#
# first we produce a warp so that we can derotate if necessary
dispgradfilter -f $LEFT_FILE-$RIGHT_FILE.matches -m 3.0 
echo "Computing first fundamental"
compfund -n 4000 -f $LEFT_FILE-$RIGHT_FILE.matches.filtered -d $INLIER_DIST $SCORE_METH -s $STOP_EARLY_PROB $FUNDAMENTAL_ALGO


#
#second time through with the aid of previous fundamental
#
if [ "$CORNER_ONE" -eq "$CORNER_TWO" ]; then
	echo "CORNERS EQUAL, SKIPPING findcorners"
else
	findcorners -h -f $LEFT_FILE -m $CORNER_TWO 
	findcorners -h -f $RIGHT_FILE -m $CORNER_TWO 
fi

#corrmatch -lf $LEFT_FILE -rf $RIGHT_FILE -xp $MAX_X_DISPARITY -yp $MAX_Y_DISPARITY -w $WINDOW_SIZE -f $LEFT_FILE-$RIGHT_FILE.matches.filtered.FM -m $LEFT_FILE-$RIGHT_FILE.matches.filtered -k $LEFT_FILE-$RIGHT_FILE.matches.filtered.WM $CORRMATCH_METH $CORRMATCH_TYPE  $CORRMATCH_THRESHOLD -e 4 -a $ANGLE_ROTATION -s $NUMBER_STEPS 
corrmatch -lf $LEFT_FILE -rf $RIGHT_FILE -xp $MAX_X_DISPARITY -yp $MAX_Y_DISPARITY -w $WINDOW_SIZE -f $LEFT_FILE-$RIGHT_FILE.matches.filtered.FM -m $LEFT_FILE-$RIGHT_FILE.matches.filtered $CORRMATCH_METH $CORRMATCH_TYPE  $CORRMATCH_THRESHOLD -e 4 -a $ANGLE_ROTATION -s $NUMBER_STEPS  $SUBPIXMATCH

#
#filter the matches from corrmatch and compute fundamental
#
dispgradfilter -f $LEFT_FILE-$RIGHT_FILE.matches -m 3.0 
echo "Computing second fundamental"
compfund -n 4000 -f $LEFT_FILE-$RIGHT_FILE.matches.filtered -d $INLIER_DIST $SCORE_METH -s $STOP_EARLY_PROB $FUNDAMENTAL_ALGO

