File size: 2,542 Bytes
399dd2d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import gradio as gr
import cv2
import numpy as np
import json

def detect_aruco_markers(image, dictionary_preset,
                         cornerRefinementMethod, detectInvertedMarker, adaptiveThreshConstant):
    # Convert to grayscale
    gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

    # Load predefined dictionary
    aruco_dict = cv2.aruco.getPredefinedDictionary(getattr(cv2.aruco, dictionary_preset))

    # Initialize detector parameters
    parameters = cv2.aruco.DetectorParameters()
    parameters.cornerRefinementMethod = getattr(cv2.aruco, cornerRefinementMethod)
    parameters.detectInvertedMarker = detectInvertedMarker
    parameters.adaptiveThreshConstant = adaptiveThreshConstant

    detector = cv2.aruco.ArucoDetector(aruco_dict, parameters)

    # Detect markers
    corners, ids, rejected = detector.detectMarkers(gray)
    print("Detected IDs:", ids)

    detections = []
    if ids is not None:
        annotated_image = cv2.aruco.drawDetectedMarkers(image.copy(), corners, ids)
        for i in range(len(ids)):
            marker_info = {
                "id": int(ids[i][0]),
                "corners": [np.array(corner).tolist() for corner in corners[i]]
            }
            detections.append(marker_info)
    else:
        annotated_image = image.copy()

    return annotated_image, json.dumps(detections, indent=4)

# Available ArUco dictionary presets
dictionary_choices = [name for name in dir(cv2.aruco) if name.startswith("DICT_")]
corner_refinement_choices = ["CORNER_REFINE_NONE", "CORNER_REFINE_SUBPIX", "CORNER_REFINE_CONTOUR", "CORNER_REFINE_APRILTAG"]

# Gradio interface
iface = gr.Interface(
    fn=detect_aruco_markers,
    inputs=[
        gr.Image(type="numpy"),
        gr.Dropdown(choices=dictionary_choices, label="Dictionary Preset", value="DICT_6X6_250"),	
        gr.Dropdown(choices=corner_refinement_choices, label="Corner Refinement Method", value="CORNER_REFINE_NONE"),
        gr.Checkbox(label="Detect Inverted Marker", value=False),
        gr.Slider(minimum=3, maximum=201, step=2, label="Adaptive Thresh", value=7),
    ],
    outputs=[
        gr.Image(type="numpy", label="Detected Markers"),
        gr.Code(label="Detection Data (JSON)", language="json")
    ],
    title="ArUco Marker Detector with Parameter Control",
    description="Upload an image and adjust ArUco detection parameters. The detected markers are drawn on the image, and the detection data (IDs and corner coordinates) is provided in JSON format.",
)

if __name__ == "__main__":
    iface.launch()