commit
ddcde33538
@ -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()
|
Loading…
Reference in new issue