diff --git a/camera module/main.py b/camera module/main.py index 5a594a5..f3cc7fd 100644 --- a/camera module/main.py +++ b/camera module/main.py @@ -1,19 +1,22 @@ import cv2 # Constant variables definition. -DESIRED_HEIGHT = 480 # The input image will be resized to this height, preserving its aspect ratio. -BLUE_THRESHOLD = 150 # If the blue channel is bigger than this, it is considered background and removed. -BINARY_THRESHOLD = 1 # If the pixel is not brighter than this, it is removed before detection. - - -# Colors (assuming BGR order). +DESIRED_HEIGHT = 480 # The input image will be resized to this height, preserving its aspect ratio. +BLUE_THRESHOLD = 150 # If the blue channel is bigger than this, it is considered background and removed. +BINARY_THRESHOLD = 1 # If the pixel is not brighter than this, it is removed before detection. +LINE_THICKNESS = 2 # Thickness of the drawn lines. +BLUR_KERNEL_SIZE = 3 # The size of the Gaussian blur kernel. +DILATION_KERNEL_SIZE = 5 # The size of the dilation kernel. +DILATION_ITERATIONS = 5 # The number of dilation iterations. + +# Colors (assuming the default BGR order). RED = (0, 0, 255) GREEN = (0, 255, 0) BLUE = (255, 0, 0) YELLOW = (0, 255, 255) -# Function definitions +# -------------- Function definitions ----------------------------- def resizeImage(img): "Resize the input image based on the DESIRED_HEIGHT variable." p = img.shape; @@ -22,49 +25,71 @@ def resizeImage(img): img = cv2.resize(img, ( DESIRED_HEIGHT, int(width) )) return img +def processImage(img): + + # Resize image to the desired height. + resized = resizeImage(img) + + dim = resized.shape + + # Remove BLUE + noBlue = resized.copy() + for i in range(dim[0]): + for j in range(dim[1]): + if (resized[i,j,0] > BLUE_THRESHOLD): + noBlue[i,j,:] = 0 + + # Convert to grayscale. + gray = cv2.cvtColor(noBlue, cv2.COLOR_BGR2GRAY) + + # Blur the image. + blur = cv2.GaussianBlur(gray, (BLUR_KERNEL_SIZE, BLUR_KERNEL_SIZE), 0) + + # Threshold the image and find its contours. + _, imgThres = cv2.threshold(blur, BINARY_THRESHOLD, 255, cv2.THRESH_BINARY) + + # Dilate the image. + dilated = cv2.dilate(imgThres, (DILATION_KERNEL_SIZE,DILATION_KERNEL_SIZE), iterations=DILATION_ITERATIONS) + + # Find the largest image contour. + _, contours, hierarchy = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) + maxContour = max(contours, key = cv2.contourArea) + + ''' + hull = cv2.convexHull(maxContour) + cv2.drawContours(imgOriginal, maxContour, -1, (0,0,255), 3) + cv2.drawContours(imgOriginal, hull, -1, (255,0,0), 3) + ''' + + # Get the bounding rectangle of the contour. + x,y,w,h = cv2.boundingRect(maxContour) + + # Get the centroid of the rectangle. + objCenterX = int( (x + x + w) / 2) + objCenterY = int( (y + y + h) / 2) + imgCenterX = int(dim[1]/2) + imgCenterY = int(dim[0]/2) + + # Draw the bounding rectangle and its centroid to the image. + cv2.circle(resized, (objCenterX, objCenterY), 5, YELLOW, LINE_THICKNESS) + cv2.rectangle(resized, (x,y), (x+w,y+h), RED, LINE_THICKNESS) + + return resized + ##################################################################################### + # Read image from source img = cv2.imread('/home/stelios/Desktop/IoT/Talos_Drones_Tracking_and_Telemetry/camera module/drone.jpg', cv2.IMREAD_COLOR) -# Resize image to the desired height. -img = resizeImage(img) - -imgOriginal = img.copy() - -# Remove BLUE -p = img.shape -for i in range(p[0]): - for j in range(p[1]): - if (img[i,j,0] > BLUE_THRESHOLD): - img[i,j,:] = 0 - -# Convert to grayscale. -img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) - -# Threshold the image and find its contours. -thres, imgThres = cv2.threshold(img, BINARY_THRESHOLD, 255, cv2.THRESH_BINARY) -img2, contours, hierarchy = cv2.findContours(imgThres, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) - -# Find the biggest contour. -maxContour = max(contours, key = cv2.contourArea) - -''' -hull = cv2.convexHull(maxContour) -cv2.drawContours(imgOriginal, maxContour, -1, (0,0,255), 3) -cv2.drawContours(imgOriginal, hull, -1, (255,0,0), 3) -''' - -# Get the bounding rectangle of the contour. -x,y,w,h = cv2.boundingRect(maxContour) - -# Get the centroid of the rectangle. -centerX = int( (x + x + w) / 2) -centerY = int( (y + y + h) / 2) +# Process the image and get the output. +output = processImage(img) -# Draw the bounding rectangle and its centroid to the image. -cv2.circle(imgOriginal, (centerX, centerY), 5, YELLOW, 2) -cv2.rectangle(imgOriginal, (x,y), (x+w,y+h), RED, 2) +cv2.imshow('Output', output) -cv2.imshow('Output', imgOriginal) -cv2.waitKey(0) \ No newline at end of file +# Terminate if the escape key is pressed or the window is closed. +while True: + k = cv2.waitKey() + if k == 27 or k == 255: + break +cv2.destroyAllWindows() \ No newline at end of file