ToB企服应用市场:ToB评测及商务社交产业平台

标题: Python:一个单针刻度表的辨认步伐 [打印本页]

作者: 拉不拉稀肚拉稀    时间: 2024-8-6 20:36
标题: Python:一个单针刻度表的辨认步伐
辨认单针刻度表(例如钟表)的时间通常涉及几个关键步调,包罗图像预处理、针检测、刻度辨认和时间盘算。以下是一个示例方案,展示如何使用 OpenCV 和 Python 进行单针刻度表的辨认。假设我们处理的是简化的钟表图像,其中针清晰可见且配景简朴。
1. 情况设置

确保已安装必要的库:
  1. pip install opencv-python numpy matplotlib
复制代码
2. 代码示例

以下是一个根本示例代码,演示如何检测单针刻度表的针,并盘算出指示的时间:
  1. import cv2
  2. import numpy as np
  3. import math
  4. import matplotlib.pyplot as plt
  5. def preprocess_image(image_path):
  6.     # 读取图像
  7.     img = cv2.imread(image_path)
  8.     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  9.     # 图像去噪
  10.     blurred = cv2.GaussianBlur(gray, (5, 5), 0)
  11.     # 边缘检测
  12.     edges = cv2.Canny(blurred, 50, 150)
  13.     return img, gray, edges
  14. def detect_dial_contour(edges):
  15.     # 检测圆形轮廓
  16.     circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 20,
  17.                                param1=50, param2=30, minRadius=10, maxRadius=100)
  18.     if circles is not None:
  19.         circles = np.round(circles[0, :]).astype("int")
  20.         return circles
  21.     return None
  22. def detect_hand(gray, circles):
  23.     if circles is None:
  24.         return None, None
  25.     # 选择最大的圆作为表盘
  26.     (cX, cY, cR) = circles[0]
  27.     mask = np.zeros_like(gray)
  28.     cv2.circle(mask, (cX, cY), cR, 255, -1)
  29.     masked_gray = cv2.bitwise_and(gray, gray, mask=mask)
  30.     # 找到针
  31.     _, thresh = cv2.threshold(masked_gray, 1, 255, cv2.THRESH_BINARY)
  32.     contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  33.     if contours:
  34.         # 假设最大的轮廓是指针
  35.         contour = max(contours, key=cv2.contourArea)
  36.         M = cv2.moments(contour)
  37.         if M["m00"] != 0:
  38.             cX = int(M["m10"] / M["m00"])
  39.             cY = int(M["m01"] / M["m00"])
  40.             return (cX, cY), (cX, cY)
  41.     return None, None
  42. def calculate_angle(hand_point, center):
  43.     dx = hand_point[0] - center[0]
  44.     dy = hand_point[1] - center[1]
  45.     angle = math.atan2(dy, dx) * 180 / np.pi
  46.     if angle < 0:
  47.         angle += 360
  48.     return angle
  49. def main(image_path):
  50.     img, gray, edges = preprocess_image(image_path)
  51.     circles = detect_dial_contour(edges)
  52.     hand_point, center = detect_hand(gray, circles)
  53.    
  54.     if hand_point is not None:
  55.         # Calculate angle
  56.         angle = calculate_angle(hand_point, center)
  57.         print(f"Detected angle: {angle:.2f} degrees")
  58.         
  59.         # Draw results
  60.         cv2.circle(img, center, 5, (0, 255, 0), -1)
  61.         cv2.line(img, center, hand_point, (0, 0, 255), 2)
  62.         cv2.imshow("Clock", img)
  63.         cv2.waitKey(0)
  64.         cv2.destroyAllWindows()
  65.     else:
  66.         print("No hand detected")
  67. if __name__ == "__main__":
  68.     main("clock.jpg")
复制代码
3. 代码表明

4. 扩展和改进


总结

这个示例展示了如何使用 OpenCV 和 Python 来辨认单针刻度表的时间。你可以根据具体的钟表图像和需求进行调整和优化。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4