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()