-
Notifications
You must be signed in to change notification settings - Fork 7
Main Process
#Main The main loop of the program. Captures webcam, and until "q" is pressed on the keyboard, captures each frame and processes it with imageTest.
def webcamTest():
"""Runs a detection test on an image and displays the result"""
cap = cv2.VideoCapture(0) #Setup webcam
while(True):
ret, frame = cap.read() #Capture frame by frame
imageTest(frame,video=True)
if cv2.waitKey(1) & 0xFF == ord('q'): #Exit
break
#When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
#Runs on each Frame It is important that this process be run in a try, else statement so that it always returns an image regardless of whether or not it finds the border at any given time. When it finds the border it should stop and present the processed image. The main process consists of finding the focus points, sorting them, classifying them (corners, reference by shape, markers by shape and fill), sorting the corners + reference, fixing the perspective using the sort as the border, and the reference as a corner, cropping the image by a percent of its width, and finally filtering it for the end result.
def imageTest(img, video = False):
"""Runs a detection test on an image and displays the result"""
fp, shapes, depth = detect(img)
try:
corners = findCorners(fp)
sort = sortCorners(corners)
ref = getRef(fp,depth)
out = fixPerspective(img,sort,ref)
out = cropImage(out,.04*out.shape[0])
out = filterOut(out)
cv2.imshow('img',out)
cv2.waitKey(0)
except:
out = img
cv2.imshow('img',out)
if not video: cv2.waitKey(0)
#Detection of Polygons and Focus Points
def detect(img):
"""Detects the polygons and returns their focus points along with their classifying shapes"""
polys, heir = findPolys(img)
fp,depth = findFocusPoints(polys, heir)
shapes = map(lambda z: len(z),fp) #Classify by length
return fp, shapes, depth
#Classification of Focus Points Needs to be separated out as its own method.
#Draw Outlines over Image This method draws all the focus points colored randomly by their shape over top of the given image.
def drawOutlines(img,fp,shapes):
"""Draws focus point outlines on the img along with their shapes classified by colors"""
out = img.copy()
#Converts to color if grayscale
if isinstance(out[0,0],list) and len(out[0,0])!=3:
out = cv2.cvtColor(out,cv2.COLOR_GRAY2RGB)
for i in range(len(fp)):
f,s = fp[i],shapes[i]
random.seed(s)
color = [random.randrange(255) for x in range(3)]
out = drawBorder(out,f,color)
return out
This is distinct from the drawBorder method which draws just one contour of a given color.
def drawBorder(img, border, c=(255,0,0)):
"""Returns img with the border drawn overlay."""
temp = img.copy()
border = np.array(np.round(border), dtype=np.int32)
out = cv2.drawContours(temp, [border], 0, color = c,thickness = 4)
return out