सामग्री पर जाएं

के लिए संदर्भ ultralytics/solutions/distance_calculation.py

नोट

यह फ़ाइल यहाँ उपलब्ध है https://github.com/ultralytics/ultralytics/बूँद/मुख्य/ultralytics/समाधान/distance_calculation.py का उपयोग करें। यदि आप कोई समस्या देखते हैं तो कृपया पुल अनुरोध का योगदान करके इसे ठीक करने में मदद करें 🛠️। 🙏 धन्यवाद !



ultralytics.solutions.distance_calculation.DistanceCalculation

उनके ट्रैक के आधार पर वास्तविक समय वीडियो स्ट्रीम में दो वस्तुओं के बीच दूरी की गणना करने के लिए एक वर्ग।

में स्रोत कोड ultralytics/solutions/distance_calculation.py
class DistanceCalculation:
    """A class to calculate distance between two objects in real-time video stream based on their tracks."""

    def __init__(self):
        """Initializes the distance calculation class with default values for Visual, Image, track and distance
        parameters.
        """

        # Visual & im0 information
        self.im0 = None
        self.annotator = None
        self.view_img = False
        self.line_color = (255, 255, 0)
        self.centroid_color = (255, 0, 255)

        # Predict/track information
        self.clss = None
        self.names = None
        self.boxes = None
        self.line_thickness = 2
        self.trk_ids = None

        # Distance calculation information
        self.centroids = []
        self.pixel_per_meter = 10

        # Mouse event
        self.left_mouse_count = 0
        self.selected_boxes = {}

        # Check if environment support imshow
        self.env_check = check_imshow(warn=True)

    def set_args(
        self,
        names,
        pixels_per_meter=10,
        view_img=False,
        line_thickness=2,
        line_color=(255, 255, 0),
        centroid_color=(255, 0, 255),
    ):
        """
        Configures the distance calculation and display parameters.

        Args:
            names (dict): object detection classes names
            pixels_per_meter (int): Number of pixels in meter
            view_img (bool): Flag indicating frame display
            line_thickness (int): Line thickness for bounding boxes.
            line_color (RGB): color of centroids line
            centroid_color (RGB): colors of bbox centroids
        """
        self.names = names
        self.pixel_per_meter = pixels_per_meter
        self.view_img = view_img
        self.line_thickness = line_thickness
        self.line_color = line_color
        self.centroid_color = centroid_color

    def mouse_event_for_distance(self, event, x, y, flags, param):
        """
        This function is designed to move region with mouse events in a real-time video stream.

        Args:
            event (int): The type of mouse event (e.g., cv2.EVENT_MOUSEMOVE, cv2.EVENT_LBUTTONDOWN, etc.).
            x (int): The x-coordinate of the mouse pointer.
            y (int): The y-coordinate of the mouse pointer.
            flags (int): Any flags associated with the event (e.g., cv2.EVENT_FLAG_CTRLKEY,
                cv2.EVENT_FLAG_SHIFTKEY, etc.).
            param (dict): Additional parameters you may want to pass to the function.
        """
        global selected_boxes
        global left_mouse_count
        if event == cv2.EVENT_LBUTTONDOWN:
            self.left_mouse_count += 1
            if self.left_mouse_count <= 2:
                for box, track_id in zip(self.boxes, self.trk_ids):
                    if box[0] < x < box[2] and box[1] < y < box[3] and track_id not in self.selected_boxes:
                        self.selected_boxes[track_id] = []
                        self.selected_boxes[track_id] = box

        if event == cv2.EVENT_RBUTTONDOWN:
            self.selected_boxes = {}
            self.left_mouse_count = 0

    def extract_tracks(self, tracks):
        """
        Extracts results from the provided data.

        Args:
            tracks (list): List of tracks obtained from the object tracking process.
        """
        self.boxes = tracks[0].boxes.xyxy.cpu()
        self.clss = tracks[0].boxes.cls.cpu().tolist()
        self.trk_ids = tracks[0].boxes.id.int().cpu().tolist()

    def calculate_centroid(self, box):
        """
        Calculate the centroid of bounding box.

        Args:
            box (list): Bounding box data
        """
        return int((box[0] + box[2]) // 2), int((box[1] + box[3]) // 2)

    def calculate_distance(self, centroid1, centroid2):
        """
        Calculate distance between two centroids.

        Args:
            centroid1 (point): First bounding box data
            centroid2 (point): Second bounding box data
        """
        pixel_distance = math.sqrt((centroid1[0] - centroid2[0]) ** 2 + (centroid1[1] - centroid2[1]) ** 2)
        return pixel_distance / self.pixel_per_meter, (pixel_distance / self.pixel_per_meter) * 1000

    def start_process(self, im0, tracks):
        """
        Calculate distance between two bounding boxes based on tracking data.

        Args:
            im0 (nd array): Image
            tracks (list): List of tracks obtained from the object tracking process.
        """
        self.im0 = im0
        if tracks[0].boxes.id is None:
            if self.view_img:
                self.display_frames()
            return
        self.extract_tracks(tracks)

        self.annotator = Annotator(self.im0, line_width=2)

        for box, cls, track_id in zip(self.boxes, self.clss, self.trk_ids):
            self.annotator.box_label(box, color=colors(int(cls), True), label=self.names[int(cls)])

            if len(self.selected_boxes) == 2:
                for trk_id, _ in self.selected_boxes.items():
                    if trk_id == track_id:
                        self.selected_boxes[track_id] = box

        if len(self.selected_boxes) == 2:
            for trk_id, box in self.selected_boxes.items():
                centroid = self.calculate_centroid(self.selected_boxes[trk_id])
                self.centroids.append(centroid)

            distance_m, distance_mm = self.calculate_distance(self.centroids[0], self.centroids[1])
            self.annotator.plot_distance_and_line(
                distance_m, distance_mm, self.centroids, self.line_color, self.centroid_color
            )

        self.centroids = []

        if self.view_img and self.env_check:
            self.display_frames()

        return im0

    def display_frames(self):
        """Display frame."""
        cv2.namedWindow("Ultralytics Distance Estimation")
        cv2.setMouseCallback("Ultralytics Distance Estimation", self.mouse_event_for_distance)
        cv2.imshow("Ultralytics Distance Estimation", self.im0)

        if cv2.waitKey(1) & 0xFF == ord("q"):
            return

__init__()

विज़ुअल, इमेज, ट्रैक और दूरी के लिए डिफ़ॉल्ट मानों के साथ दूरी गणना वर्ग को इनिशियलाइज़ करता है पैरामीटर।

में स्रोत कोड ultralytics/solutions/distance_calculation.py
14 बांग्लादेश बांग्लादेश 14 बांग्लादेश बांग्लादेश 14 बांग्लादेश बांग्लादेश 14 बांग्लादेश बांग्लादेश 14 बांग्लादेश बांग्लादेश 14  बांग्लादेश बांग्लादेश 14 बांग्लादेश बांग्लादेश 14बजकर 15 मिनट पर 16 1718 1920 20 21 24 25 26 27 28 39404142
def __init__(self):
    """Initializes the distance calculation class with default values for Visual, Image, track and distance
    parameters.
    """

    # Visual & im0 information
    self.im0 = None
    self.annotator = None
    self.view_img = False
    self.line_color = (255, 255, 0)
    self.centroid_color = (255, 0, 255)

    # Predict/track information
    self.clss = None
    self.names = None
    self.boxes = None
    self.line_thickness = 2
    self.trk_ids = None

    # Distance calculation information
    self.centroids = []
    self.pixel_per_meter = 10

    # Mouse event
    self.left_mouse_count = 0
    self.selected_boxes = {}

    # Check if environment support imshow
    self.env_check = check_imshow(warn=True)

calculate_centroid(box)

बाउंडिंग बॉक्स के केन्द्रक की गणना करें।

पैरामीटर:

नाम प्रकार विवरण: __________ चूक
box list

बाउंडिंग बॉक्स डेटा

आवश्यक
में स्रोत कोड ultralytics/solutions/distance_calculation.py
108 109 110 111 112 113 114115
def calculate_centroid(self, box):
    """
    Calculate the centroid of bounding box.

    Args:
        box (list): Bounding box data
    """
    return int((box[0] + box[2]) // 2), int((box[1] + box[3]) // 2)

calculate_distance(centroid1, centroid2)

दो सेंट्रोइड के बीच की दूरी की गणना करें।

पैरामीटर:

नाम प्रकार विवरण: __________ चूक
centroid1 point

पहला बाउंडिंग बॉक्स डेटा

आवश्यक
centroid2 point

दूसरा बाउंडिंग बॉक्स डेटा

आवश्यक
में स्रोत कोड ultralytics/solutions/distance_calculation.py
117118 119 120 121 122 123 124 125126
def calculate_distance(self, centroid1, centroid2):
    """
    Calculate distance between two centroids.

    Args:
        centroid1 (point): First bounding box data
        centroid2 (point): Second bounding box data
    """
    pixel_distance = math.sqrt((centroid1[0] - centroid2[0]) ** 2 + (centroid1[1] - centroid2[1]) ** 2)
    return pixel_distance / self.pixel_per_meter, (pixel_distance / self.pixel_per_meter) * 1000

display_frames()

प्रदर्शन फ्रेम।

में स्रोत कोड ultralytics/solutions/distance_calculation.py
170 171 172 173 174 175 176 177
def display_frames(self):
    """Display frame."""
    cv2.namedWindow("Ultralytics Distance Estimation")
    cv2.setMouseCallback("Ultralytics Distance Estimation", self.mouse_event_for_distance)
    cv2.imshow("Ultralytics Distance Estimation", self.im0)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        return

extract_tracks(tracks)

प्रदान किए गए डेटा से परिणाम निकालता है।

पैरामीटर:

नाम प्रकार विवरण: __________ चूक
tracks list

ऑब्जेक्ट ट्रैकिंग प्रक्रिया से प्राप्त पटरियों की सूची।

आवश्यक
में स्रोत कोड ultralytics/solutions/distance_calculation.py
 97 98 99  100 101 102 103 104 105 106
def extract_tracks(self, tracks):
    """
    Extracts results from the provided data.

    Args:
        tracks (list): List of tracks obtained from the object tracking process.
    """
    self.boxes = tracks[0].boxes.xyxy.cpu()
    self.clss = tracks[0].boxes.cls.cpu().tolist()
    self.trk_ids = tracks[0].boxes.id.int().cpu().tolist()

mouse_event_for_distance(event, x, y, flags, param)

यह फ़ंक्शन वास्तविक समय वीडियो स्ट्रीम में माउस घटनाओं के साथ क्षेत्र को स्थानांतरित करने के लिए डिज़ाइन किया गया है।

पैरामीटर:

नाम प्रकार विवरण: __________ चूक
event int

माउस ईवेंट का प्रकार (उदा., cv2. EVENT_MOUSEMOVE, सीवी 2। EVENT_LBUTTONDOWN, आदि)।

आवश्यक
x int

माउस सूचक का x-निर्देशांक.

आवश्यक
y int

माउस सूचक का y-निर्देशांक.

आवश्यक
flags int

इवेंट से जुड़े कोई भी फ़्लैग (उदा., cv2. EVENT_FLAG_CTRLKEY, सीवी2. EVENT_FLAG_SHIFTKEY, आदि)।

आवश्यक
param dict

अतिरिक्त पैरामीटर जिन्हें आप फ़ंक्शन में पास करना चाह सकते हैं।

आवश्यक
में स्रोत कोड ultralytics/solutions/distance_calculation.py
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 868788899091 92939495
def mouse_event_for_distance(self, event, x, y, flags, param):
    """
    This function is designed to move region with mouse events in a real-time video stream.

    Args:
        event (int): The type of mouse event (e.g., cv2.EVENT_MOUSEMOVE, cv2.EVENT_LBUTTONDOWN, etc.).
        x (int): The x-coordinate of the mouse pointer.
        y (int): The y-coordinate of the mouse pointer.
        flags (int): Any flags associated with the event (e.g., cv2.EVENT_FLAG_CTRLKEY,
            cv2.EVENT_FLAG_SHIFTKEY, etc.).
        param (dict): Additional parameters you may want to pass to the function.
    """
    global selected_boxes
    global left_mouse_count
    if event == cv2.EVENT_LBUTTONDOWN:
        self.left_mouse_count += 1
        if self.left_mouse_count <= 2:
            for box, track_id in zip(self.boxes, self.trk_ids):
                if box[0] < x < box[2] and box[1] < y < box[3] and track_id not in self.selected_boxes:
                    self.selected_boxes[track_id] = []
                    self.selected_boxes[track_id] = box

    if event == cv2.EVENT_RBUTTONDOWN:
        self.selected_boxes = {}
        self.left_mouse_count = 0

set_args(names, pixels_per_meter=10, view_img=False, line_thickness=2, line_color=(255, 255, 0), centroid_color=(255, 0, 255))

दूरी गणना और प्रदर्शन मापदंडों को कॉन्फ़िगर करता है।

पैरामीटर:

नाम प्रकार विवरण: __________ चूक
names dict

ऑब्जेक्ट डिटेक्शन क्लासेस के नाम

आवश्यक
pixels_per_meter int

मीटर में पिक्सेल की संख्या

10
view_img bool

फ्रेम प्रदर्शन का संकेत ध्वज

False
line_thickness int

बाउंडिंग बॉक्स के लिए लाइन मोटाई।

2
line_color RGB

सेंट्रोइड रेखा का रंग

(255, 255, 0)
centroid_color RGB

BBOX सेंट्रोइड के रंग

(255, 0, 255)
में स्रोत कोड ultralytics/solutions/distance_calculation.py
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 6061 62 63 64 65 66676869
def set_args(
    self,
    names,
    pixels_per_meter=10,
    view_img=False,
    line_thickness=2,
    line_color=(255, 255, 0),
    centroid_color=(255, 0, 255),
):
    """
    Configures the distance calculation and display parameters.

    Args:
        names (dict): object detection classes names
        pixels_per_meter (int): Number of pixels in meter
        view_img (bool): Flag indicating frame display
        line_thickness (int): Line thickness for bounding boxes.
        line_color (RGB): color of centroids line
        centroid_color (RGB): colors of bbox centroids
    """
    self.names = names
    self.pixel_per_meter = pixels_per_meter
    self.view_img = view_img
    self.line_thickness = line_thickness
    self.line_color = line_color
    self.centroid_color = centroid_color

start_process(im0, tracks)

ट्रैकिंग डेटा के आधार पर दो बाउंडिंग बॉक्स के बीच की दूरी की गणना करें।

पैरामीटर:

नाम प्रकार विवरण: __________ चूक
im0 nd array

प्रतिबिंब

आवश्यक
tracks list

ऑब्जेक्ट ट्रैकिंग प्रक्रिया से प्राप्त पटरियों की सूची।

आवश्यक
में स्रोत कोड ultralytics/solutions/distance_calculation.py
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158159 160161 162 163 164 165 166 167 168
def start_process(self, im0, tracks):
    """
    Calculate distance between two bounding boxes based on tracking data.

    Args:
        im0 (nd array): Image
        tracks (list): List of tracks obtained from the object tracking process.
    """
    self.im0 = im0
    if tracks[0].boxes.id is None:
        if self.view_img:
            self.display_frames()
        return
    self.extract_tracks(tracks)

    self.annotator = Annotator(self.im0, line_width=2)

    for box, cls, track_id in zip(self.boxes, self.clss, self.trk_ids):
        self.annotator.box_label(box, color=colors(int(cls), True), label=self.names[int(cls)])

        if len(self.selected_boxes) == 2:
            for trk_id, _ in self.selected_boxes.items():
                if trk_id == track_id:
                    self.selected_boxes[track_id] = box

    if len(self.selected_boxes) == 2:
        for trk_id, box in self.selected_boxes.items():
            centroid = self.calculate_centroid(self.selected_boxes[trk_id])
            self.centroids.append(centroid)

        distance_m, distance_mm = self.calculate_distance(self.centroids[0], self.centroids[1])
        self.annotator.plot_distance_and_line(
            distance_m, distance_mm, self.centroids, self.line_color, self.centroid_color
        )

    self.centroids = []

    if self.view_img and self.env_check:
        self.display_frames()

    return im0





2024-01-05 बनाया गया, अपडेट किया गया 2024-01-10
लेखक: आयुषएक्सेल (1), chr043416@gmail.com (1)