From ddcde335382fd1dc3127c65b8f01f676a8f9338a Mon Sep 17 00:00:00 2001 From: sunsocool Date: Mon, 9 Sep 2024 18:47:35 +0800 Subject: [PATCH] init commit --- README.md | 1 + realtime_Detection.py | 137 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 README.md create mode 100644 realtime_Detection.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..522ebbc --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +OpenCV 做图形监测 \ No newline at end of file diff --git a/realtime_Detection.py b/realtime_Detection.py new file mode 100644 index 0000000..903eda7 --- /dev/null +++ b/realtime_Detection.py @@ -0,0 +1,137 @@ +import cv2 +import numpy as np + + +cap = cv2.VideoCapture(0) + +def nothing(x): + # any operation + pass + +''' +HoughLinesP: +threshold: The minimum number of intersections to "*detect*" a line +minLineLength: The minimum number of points that can form a line. Lines with less than this number of points are disregarded. +maxLineGap: The maximum gap between two points to be considered in the same line. +''' + +cv2.namedWindow("Trackbars", cv2.WINDOW_AUTOSIZE) + +cv2.createTrackbar("threshold", "Trackbars", 0, 255, nothing) +cv2.createTrackbar("minLineLength", "Trackbars", 0, 255, nothing) +cv2.createTrackbar("maxLineGap", "Trackbars", 0, 255, nothing) + + +''' +Canny: +threshold1 first threshold for the hysteresis procedure. +threshold2 second threshold for the hysteresis procedure. +apertureSize aperture size for the Sobel operator. +''' + +cv2.createTrackbar("threshold1", "Trackbars", 0, 255, nothing) +cv2.createTrackbar("threshold2", "Trackbars", 0, 255, nothing) +# cv2.createTrackbar("apertureSize", "Trackbars", 3, 7, nothing) + + + +cv2.namedWindow("CircleTrackbars", cv2.WINDOW_AUTOSIZE) + +''' +Hough Circle Transform: +Blur +param_1 = 200: Upper threshold for the internal Canny edge detector. +param_2 = 100*: Threshold for center detection. +min_radius = 0: Minimum radius to be detected. If unknown, put zero as default. +max_radius = 0: Maximum radius to be detected. If unknown, put zero as default. + +''' +# cv2.createTrackbar("blur", "CircleTrackbars", 5, 16, nothing) +cv2.createTrackbar("param_1", "CircleTrackbars", 260, 500, nothing) +cv2.createTrackbar("param_2", "CircleTrackbars", 30, 255, nothing) +cv2.createTrackbar("min_radius", "CircleTrackbars", 0, 255, nothing) +cv2.createTrackbar("max_radius", "CircleTrackbars", 0, 255, nothing) + +font = cv2.FONT_HERSHEY_COMPLEX + + +while True: + + #HoughLinesP: + threshold = cv2.getTrackbarPos("threshold", "Trackbars") + minLineLength = cv2.getTrackbarPos("minLineLength", "Trackbars") + maxLineGap = cv2.getTrackbarPos("maxLineGap", "Trackbars") + + #Canny: + threshold1 = cv2.getTrackbarPos("threshold1", "Trackbars") + threshold2 = cv2.getTrackbarPos("threshold2", "Trackbars") + # apertureSize = cv2.getTrackbarPos("apertureSize", "Trackbars") + + + #Hough Circle Transform: + # blur = cv2.getTrackbarPos("blur", "CircleTrackbars") + param_1 = cv2.getTrackbarPos("param_1", "CircleTrackbars") + param_2 = cv2.getTrackbarPos("param_2", "CircleTrackbars") + min_radius = cv2.getTrackbarPos("min_radius", "CircleTrackbars") + max_radius = cv2.getTrackbarPos("max_radius", "CircleTrackbars") + + _, frame = cap.read() + src = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + # dst = cv2.Canny(src, 50, 200, None, 3) + # dst = cv2.Canny(src, threshold1, threshold2, None, apertureSize) + + dst = cv2.Canny(src, threshold1, threshold2, None, 3) + + cdstP = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR) + + # linesP = cv2.HoughLinesP(dst, 1, np.pi / 180, 50, None, 50, 10) + linesP = cv2.HoughLinesP(dst, 1, np.pi / 180, threshold, None, minLineLength, maxLineGap) + + if linesP is not None: + for i in range(0, len(linesP)): + l = linesP[i][0] + cv2.line(cdstP, (l[0], l[1]), (l[2], l[3]), (0,0,255), 3, cv2.LINE_AA) + + #draw circles + cv2.circle(cdstP, (l[0], l[1]), 10, (0,255,0), -1) + cv2.circle(cdstP, (l[2], l[3]), 10, (0,255,0), -1) + + + gray = cv2.medianBlur(src, 5) + # gray = cv2.medianBlur(src, 9) + rows = gray.shape[0] + + # cv2.imshow("gray Blur", gray) + + # circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, rows / 8, + # param1=260, param2=30, + # minRadius=10, maxRadius=150) + + + circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, rows / 8, + param1=param_1, param2=param_2, + minRadius=min_radius, maxRadius=max_radius) + + if circles is not None: + circles = np.uint16(np.around(circles)) + for i in circles[0, :]: + center = (i[0], i[1]) + # circle center + # cv2.circle(src, center, 1, (0, 100, 100), 3) + cv2.circle(src, center, 1, (60, 100, 100), 3) + # circle outline + radius = i[2] + #cv2.circle(src, center, radius, (255, 0, 255), 3) + cv2.circle(src, center, radius, (190, 90, 190), 3) + + + cv2.imshow("Source", src) + cv2.imshow("Detected Lines (in red) - Probabilistic Line Transform", cdstP) + + + key = cv2.waitKey(1) + if key == 27: + break + +cap.release() +cv2.destroyAllWindows()