ArucoDetector / app.py
vincentb25's picture
Working with most parameters
022b5a1
import cv2
#from aruco_detector import ArucoDetector
import gradio as gr
import os
dict_list = ['DICT_4X4_50',
'DICT_4X4_100',
'DICT_4X4_250',
'DICT_4X4_1000',
'DICT_5X5_50',
'DICT_5X5_100',
'DICT_5X5_250',
'DICT_5X5_1000',
'DICT_6X6_50',
'DICT_6X6_100',
'DICT_6X6_250',
'DICT_6X6_1000',
'DICT_7X7_50',
'DICT_7X7_100',
'DICT_7X7_250',
'DICT_7X7_1000',
'DICT_ARUCO_ORIGINAL',
'DICT_APRILTAG_16h5',
'DICT_APRILTAG_25h9',
'DICT_APRILTAG_36h10',
'DICT_APRILTAG_36h11',
'DICT_ARUCO_MIP_36h12']
def inference(image_path, dict_name, draw_rejects,
adaptiveThreshWinSizeMin, adaptiveThreshWinSizeMax, adaptiveThreshWinSizeStep, adaptiveThreshConstant,
minMarkerPerimeterRate, maxMarkerPerimeterRate,
polygonalApproxAccuracyRate, minCornerDistanceRate, minDistanceToBorder, minMarkerDistanceRate,
cornerRefinementMethod, cornerRefinementWinSize, cornerRefinementMaxIterations, cornerRefinementMinAccuracy,
markerBoderBits, perspectiveRemovePixelPerCell, perspectiveRemoveIgnoredMarginPerCell, maxErroneousBitsInBorderRate, minOtsuStdDev, errorCorrectionRate):
if not dict_name:
raise gr.Error("No model selected. Please select a model.")
if not image_path:
raise gr.Error("No image provided. Please upload an image.")
dict_index = dict_list.index(dict_name)
aruco_dict = cv2.aruco.getPredefinedDictionary(dict_index)
aruco_params = cv2.aruco.DetectorParameters()
aruco_params.adaptiveThreshWinSizeMin = int(adaptiveThreshWinSizeMin)
aruco_params.adaptiveThreshWinSizeMax = int(adaptiveThreshWinSizeMax)
aruco_params.adaptiveThreshWinSizeStep = int(adaptiveThreshWinSizeStep)
aruco_params.adaptiveThreshConstant = int(adaptiveThreshConstant)
aruco_params.minMarkerPerimeterRate = minMarkerPerimeterRate
aruco_params.maxMarkerPerimeterRate = maxMarkerPerimeterRate
aruco_params.polygonalApproxAccuracyRate = polygonalApproxAccuracyRate
aruco_params.minCornerDistanceRate = minCornerDistanceRate
aruco_params.minDistanceToBorder = minDistanceToBorder
aruco_params.minMarkerDistanceRate = minMarkerDistanceRate
aruco_params.cornerRefinementMethod = cornerRefinementMethods.index(cornerRefinementMethod)
aruco_params.cornerRefinementWinSize = int(cornerRefinementWinSize)
aruco_params.cornerRefinementMaxIterations = int(cornerRefinementMaxIterations)
aruco_params.cornerRefinementMinAccuracy = cornerRefinementMinAccuracy
aruco_params.markerBorderBits = int(markerBoderBits)
aruco_params.perspectiveRemovePixelPerCell = int(perspectiveRemovePixelPerCell)
aruco_params.perspectiveRemoveIgnoredMarginPerCell = perspectiveRemoveIgnoredMarginPerCell
aruco_params.maxErroneousBitsInBorderRate = maxErroneousBitsInBorderRate
aruco_params.minOtsuStdDev = minOtsuStdDev
aruco_params.errorCorrectionRate = errorCorrectionRate
detector = cv2.aruco.ArucoDetector(aruco_dict, aruco_params)
image = cv2.imread(image_path)
corners, ids, rejectedImgPoints = detector.detectMarkers(image)
thresh_image = cv2.adaptiveThreshold(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, int(adaptiveThreshConstant), 2)
image = cv2.aruco.drawDetectedMarkers(image, corners, ids, borderColor=(0, 255, 0))
if draw_rejects:
image = cv2.aruco.drawDetectedMarkers(image, rejectedImgPoints, borderColor=(0, 0, 255))
for corner in corners:
cv2.polylines(image, [corner.astype(int)], isClosed=True, color=(0, 255, 0), thickness=3)
cv2.imwrite("output.jpg", image)
output_image = cv2.cvtColor(cv2.imread("output.jpg"), cv2.COLOR_BGR2RGB)
# TODO make a gif going through the thresh win size
return output_image, thresh_image
def get_aruco_dict():
#PREDEFINED_DICTIONARY_NAME
return dict_list
aruco_dict = get_aruco_dict()
image_paths= [['examples/cans.png', 'DICT_4X4_50', 3, 23, 4, 7],
['examples/image4k.png', 'DICT_4X4_50', 3, 23, 4, 7],
['examples/pose.png', 'DICT_5X5_1000', 3, 23, 4, 7],
['examples/singlemarkerssource.jpg', 'DICT_6X6_250', 3, 23, 4, 7],
]
cornerRefinementMethods = ["CORNER_REFINE_NONE", "CORNER_REFINE_SUBPIX", "CORNER_REFINE_CONTOUR", "CORNER_REFINE_APRILTAG"]
with gr.Blocks() as demo:
gr.Markdown("# Aruco tag detection\nSelect the aruco library, upload an image, and detect the aruco tags.")
with gr.Row():
with gr.Column():
image_input = gr.Image(type="filepath", label="Upload Image")
dict_dropdown = gr.Dropdown(choices=aruco_dict, label="Select aruco library")
advanced_params = gr.Accordion("Advanced Parameters", open=False)
with advanced_params:
rejects_radio = gr.Checkbox(label="Show Rejects", value=False)
thresh_min_slider = gr.Slider(minimum=3, maximum=100, step=1, value=3, label="adapatativeThreshWinSizeMin")
thresh_max_slider = gr.Slider(minimum=0, maximum=100, step=1, value=23, label="adapatativeThreshWinSizeMax")
thresh_step_slider = gr.Slider(minimum=1, maximum=100, step=1, value=10, label="adapatativeThreshWinSizeStep")
thresh_const_slider = gr.Slider(minimum=0, maximum=50, step=1, value=7, label="adapatativeThreshConstant")
min_marker_p_slider = gr.Slider(minimum=0, maximum=1, step=0.01, value=0.03, label="minMarkerPerimeterRate")
max_marker_p_slider = gr.Slider(minimum=0, maximum=10, step=0.01, value=4.0, label="maxMarkerPerimeterRate")
poly_approx_acc_rate_slider = gr.Slider(minimum=0, maximum=1, step=0.01, value=0.05, label="polygonalApproxAccuracyRate")
min_corner_distance_rate_slider = gr.Slider(minimum=0, maximum=1, step=0.01, value=0.05, label="minCornerDistanceRate")
min_distance_to_border_slider = gr.Slider(minimum=0, maximum=25, step=1, value=3, label="minDistanceToBorder")
min_marker_distance_rate_slider = gr.Slider(minimum=0, maximum=1, step=0.01, value=0.05, label="minMarkerDistanceRate")
cornerRefinementMethod_radio = gr.Radio(
choices=cornerRefinementMethods,
label="cornerRefinementMethod", value=cornerRefinementMethods[0]
)
cornerRefinementWinSize_slider = gr.Slider(minimum=0, maximum=20, step=1, value=5, label="cornerRefinementWinSize")
cornerRefinementMaxIterations_slider = gr.Slider(minimum=1, maximum=50, step=1, value=30, label="cornerRefinementMaxIterations")
cornerRefinementMinAccuracy_slider = gr.Slider(minimum=0.01, maximum=2, step=0.01, value=0.1, label="cornerRefinementMinAccuracy")
markerBoderBits_slider = gr.Slider(minimum=1, maximum=100, step=1, value=1, label="markerBoderBits")
perspectiveRemovePixelPerCell_slider = gr.Slider(minimum=0, maximum=100, step=1, value=8, label="perspectiveRemovePixelPerCell")
perspectiveRemoveIgnoredMarginPerCell_slider = gr.Slider(minimum=0, maximum=1, step=0.01, value=0.13, label="perspectiveRemoveIgnoredMarginPerCell")
maxErroneousBitsInBorderRate_slider = gr.Slider(minimum=0, maximum=1, step=0.01, value=0.04, label="maxErroneousBitsInBorderRate")
minOtsuStdDev_slider = gr.Slider(minimum=0, maximum=10, step=0.1, value=5.0, label="minOtsuStdDev")
errorCorrectionRate_slider = gr.Slider(minimum=0, maximum=1, step=0.01, value=0.6, label="errorCorrectionRate")
submit_button = gr.Button("Submit")
with gr.Column():
output_image = gr.Image(type="numpy", label="Output Image")
thresh_image = gr.Image(type="numpy", label="Thresh Image")
examples = gr.Examples(examples=image_paths, inputs=[image_input, dict_dropdown, thresh_min_slider, thresh_max_slider, thresh_step_slider, thresh_const_slider], outputs=[output_image, thresh_image])
submit_button.click(
inference,
inputs=[image_input, dict_dropdown, rejects_radio, thresh_min_slider, thresh_max_slider, thresh_step_slider, thresh_const_slider, min_marker_p_slider, max_marker_p_slider, poly_approx_acc_rate_slider, min_corner_distance_rate_slider, min_distance_to_border_slider, min_marker_distance_rate_slider, cornerRefinementMethod_radio, cornerRefinementWinSize_slider, cornerRefinementMaxIterations_slider, cornerRefinementMinAccuracy_slider, markerBoderBits_slider, perspectiveRemovePixelPerCell_slider, perspectiveRemoveIgnoredMarginPerCell_slider, maxErroneousBitsInBorderRate_slider, minOtsuStdDev_slider, errorCorrectionRate_slider],
outputs=[output_image, thresh_image]
)
demo.launch()