|
|
@ -1,9 +1,13 @@ |
|
|
|
import cv2 |
|
|
|
import base64 |
|
|
|
import zmq |
|
|
|
import servo |
|
|
|
|
|
|
|
# Constant variables definition. |
|
|
|
MAJOR_VERSION = cv2.getVersionMajor() |
|
|
|
SERVO_INITIAL_X_ANGLE = 0 # The initial horizontal angle of the camera. |
|
|
|
SERVO_INITIAL_Y_ANGLE = 0 # The initial vertical angle of the camera. |
|
|
|
SERVO_STEP_ANGLE = 5 # The angle at which the servo motors move each frame. |
|
|
|
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 = 30 # If the pixel is not brighter than this, it is removed before detection. |
|
|
@ -32,30 +36,6 @@ def resizeImage(img): |
|
|
|
img = cv2.resize(img, ( DESIRED_HEIGHT, int(width) )) |
|
|
|
return img |
|
|
|
|
|
|
|
def removeColors(img): |
|
|
|
out = None |
|
|
|
dim = img.shape |
|
|
|
blue = img.copy() |
|
|
|
for i in range(dim[0]): |
|
|
|
for j in range(dim[1]): |
|
|
|
pixel = img[i,j] |
|
|
|
if pixel[0] > 150: |
|
|
|
blue[i,j,:] = 255 |
|
|
|
else: |
|
|
|
blue[i,j,:] = 0 |
|
|
|
|
|
|
|
gray = cv2.cvtColor(blue, cv2.COLOR_BGR2GRAY) |
|
|
|
if MAJOR_VERSION == 3: |
|
|
|
_, contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) |
|
|
|
else: |
|
|
|
contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) |
|
|
|
if len(contours) > 0: |
|
|
|
maxContour = max(contours, key = cv2.contourArea) |
|
|
|
x,y,w,h = cv2.boundingRect(maxContour) |
|
|
|
out = img[y:y+h,x:x+w,:] |
|
|
|
|
|
|
|
return out |
|
|
|
|
|
|
|
def findMatchingContour(img, objX, objY): |
|
|
|
|
|
|
|
dilated = img.copy() |
|
|
@ -105,7 +85,7 @@ def processImage(img): |
|
|
|
if MAJOR_VERSION == 3: |
|
|
|
_, contours, hierarchy = cv2.findContours(dilated, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) |
|
|
|
else: |
|
|
|
contours, hierarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) |
|
|
|
contours, hierarchy = cv2.findContours(dilated, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) |
|
|
|
if len(contours) > 0: |
|
|
|
maxContour = max(contours, key = cv2.contourArea) |
|
|
|
else: |
|
|
@ -170,9 +150,10 @@ footage_socket.connect('tcp://' + client_ip.decode() + ':5555') |
|
|
|
|
|
|
|
#camera = cv2.VideoCapture(0) # init the camera |
|
|
|
|
|
|
|
servoX = SERVO_INITIAL_X_ANGLE |
|
|
|
servoY = SERVO_INITIAL_Y_ANGLE |
|
|
|
|
|
|
|
|
|
|
|
cap = cv2.VideoCapture('C:/Users/Giorgos Ger/Desktop/drone_test.mp4') |
|
|
|
cap = cv2.VideoCapture('C:/Users/steyi/Desktop/drone_test.mp4') |
|
|
|
if (cap.isOpened() == False): |
|
|
|
print('Error opening stream.') |
|
|
|
quit() |
|
|
@ -189,6 +170,29 @@ while (cap.isOpened()): |
|
|
|
jpg_as_text = base64.b64encode(buffer) |
|
|
|
footage_socket.send(jpg_as_text) |
|
|
|
cv2.waitKey(33) |
|
|
|
|
|
|
|
# Move the servo motors. |
|
|
|
if yDir == 1: |
|
|
|
servoY = servoY + SERVO_STEP_ANGLE |
|
|
|
if servoY > 180: |
|
|
|
servoY = 180 |
|
|
|
servo.SetAngleUp(servoY) |
|
|
|
elif yDir == -1: |
|
|
|
servoY = servoY - SERVO_STEP_ANGLE |
|
|
|
if servoY < 0: |
|
|
|
servoY = 0 |
|
|
|
servo.SetAngleUp(servoY) |
|
|
|
if xDir == 1: |
|
|
|
servoX = servoX + SERVO_STEP_ANGLE |
|
|
|
if servoX > 180: |
|
|
|
servoX = 180 |
|
|
|
if servoX < 0: |
|
|
|
servoX = 0 |
|
|
|
servo.SetAngleDown(servoX) |
|
|
|
elif xDir == -1: |
|
|
|
servoX = servoX - SERVO_STEP_ANGLE |
|
|
|
servo.SetAngleDown(servoX) |
|
|
|
|
|
|
|
else: |
|
|
|
break |
|
|
|
except KeyboardInterrupt: |
|
|
|