我有一个校准过程,我想在其中获得屏幕的最大高度和最大宽度。因此,我制作了一个不断扩大的矩形,希望通过图像处理对其进行坐标处理。始终会以一个角度查看此矩形。
我使用了一个彩色矩形在HSV范围内对其进行检测,但似乎无法正常工作。首先,我检测出绿色矩形,然后对其进行阈值处理,然后检测出精巧边缘,然后找到轮廓并过滤最大轮廓。最终近似轮廓显示在屏幕快照的“ img”标签中。
这里的问题是绿色矩形的进一步边缘显示为黑色,并且在HSV范围内未检测到。因此无法获得最大宽度和高度。即使在边缘检测中我具有矩形的左上角和右下角。
除了检测彩色矩形的HSV范围外,还有其他方法可以跟踪缩放矩形。由于矩形正在移动,因此应该存在。
代码:
video = cv2.VideoCapture('rectCalibration2.mp4')
img = np.zeros((360,640,3))
prevImg = np.zeros((360,640,3))
finalContour = []
end_time = time.time() + 15
largestArea = 5000
while(video.isOpened()):
_, frame = video.read()
if frame is None:
print('ended')
break
frame = cv2.resize(frame, (640, 360))
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
greenLower = (55, 100, 6)
greenUpper = (70, 255, 255)
mask = cv2.inRange(hsv, greenLower, greenUpper)
th = cv2.adaptiveThreshold(mask,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
th = cv2.erode(th, None, iterations=3)
th = cv2.dilate(th, None, iterations=3)
edges = cv2.Canny(th,200,400)
m, contours, hierarchy =
cv2.findContours(edges,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
largeContours = []
for contour in contours:
area = cv2.contourArea(contour)
if area > largestArea:
largestArea = area
largeContours.append(contour)
finalContour = contour
img = np.zeros((360,640,3))
cv2.drawContours(img, largeContours, -1, (255, 255, 255))
prevImg = img
if (prevImg is not img):
end_time = time.time() + 15
if time.time() > end_time:
epsilon = 0.1 * cv2.arcLength(finalContour, True)
approx = cv2.approxPolyDP(finalContour, epsilon, True)
print(approx)
prevImg = np.zeros((360,640,3))
cv2.drawContours(prevImg,[approx],0,(255,255,255),2)
cv2.imshow('final', prevImg)
video.release()
break
cv2.imshow('frame',frame)
cv2.imshow('img', img)
cv2.imshow('edges', edges)
if cv2.waitKey(33) == ord('q'):
video.release()
break
“ img”标签显示的finalContour不是最大宽度和高度