screwdriver/yolo_predict.py
2025-02-06 16:10:58 +08:00

53 lines
2.4 KiB
Python

import cv2
from ultralytics import YOLO
import numpy as np
class yolo_class():
def __init__(self,yolo_path):
self.yolo_path = yolo_path
# model = YOLO("yolov8n-cls.pt") # load an official model
self.model = YOLO(yolo_path) # load a custom model
def YoloDetect(self,imgs):
# Load a model
# Predict with the model
results = self.model(imgs) # predict on an image
# print(results)
return results
def FindMaxContours_For_torxtamperproof(self, contours, size=100):
try:
# 計算輪廓面積
area = [cv2.contourArea(contour) for contour in contours]
# 找到前三大的面積的索引
max_indices = np.argsort(np.array(area))[::-1][:3]
# 取得前三大的輪廓
max_contours = [contours[i] for i in max_indices if cv2.contourArea(contours[i]) > 100]
# 計算每個輪廓的重心
centroids = []
for contour in max_contours:
moments = cv2.moments(contour)
# 檢查面積是否為非零值,避免除以零的情況
if moments["m00"] != 0:
cx = moments["m10"] / moments["m00"]
cy = moments["m01"] / moments["m00"]
centroids.append(np.array([cx, cy]))
# 計算每個輪廓的重心距離影像中心的距離
center = np.array([size / 2, size / 2]) # 替換成你的影像寬高
distances = [np.linalg.norm(centroid - center) for centroid in centroids]
# 找到最近的輪廓索引
closest_idx = np.argmin(np.array(distances))
# 找到最近的輪廓在前三大輪廓中的索引
final_idx = max_indices[closest_idx]
except Exception as e:
# self.dev_logger.error(f'FindMaxContours_For_torxtamperproof {e}')
final_idx = -1
print(f'FindMaxContours_For_torxtamperproof --> {e}')
return final_idx
if __name__ == '__main__':
yolo = yolo_class(r"C:\Users\user\Desktop\0723ProgramBackup\model\1c344897-1978-4664-9bbd-256be14a3125.pt")
image = cv2.imread(r"D:\Screwdriver_image\Milwaukee_0826\AOI_Origin\20240824_161248_phillips_2_NotValid_5_0_0.png", cv2.IMREAD_GRAYSCALE)
print(f"yolo.YoloDetect(image)[0].probs = {yolo.YoloDetect(image)[0].probs.top1}") #抓到的第一個類別