Created
June 5, 2020 13:57
-
-
Save elbruno/6220e1b3e2ae7314e2167d451474e5f8 to your computer and use it in GitHub Desktop.
WebCamFaceDetectedAndCenterofCam.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Bruno Capuano 2020 | |
# display the camera feed using OpenCV | |
# display a 3x3 Grid | |
# detect faces using openCV and haar cascades | |
# calculate the relative position for the face from the center of the camera | |
import os | |
import time | |
import cv2 | |
def displayGrid(frame): | |
# Add a 3x3 Grid | |
cv2.line(frame, (int(camera_Width/2)-centerZone, 0) , (int(camera_Width/2)-centerZone, camera_Heigth) , lineColor, lineThickness) | |
cv2.line(frame, (int(camera_Width/2)+centerZone, 0) , (int(camera_Width/2)+centerZone, camera_Heigth) , lineColor, lineThickness) | |
cv2.line(frame, (0, int(camera_Heigth / 2) - centerZone), (camera_Width, int(camera_Heigth / 2) - centerZone), lineColor, lineThickness) | |
cv2.line(frame, (0, int(camera_Heigth / 2) + centerZone), (camera_Width, int(camera_Heigth / 2) + centerZone), lineColor, lineThickness) | |
def calculatePositionForDetectedFace(frame, x, y, h , w): | |
# calculate direction and relative position of the face | |
cx = int(x + (w / 2)) # Center X of the Face | |
cy = int(y + (h / 2)) # Center Y of the Face | |
if (cx <int(camera_Width/2) - centerZone): | |
cv2.putText (frame, " LEFT " , (20, 50), cv2.FONT_HERSHEY_COMPLEX, 1 , colorGreen, 2) | |
dir = 1 | |
elif (cx > int(camera_Width / 2) + centerZone): | |
cv2.putText(frame, " RIGHT ", (20, 50), cv2.FONT_HERSHEY_COMPLEX,1,colorGreen, 3) | |
dir = 2 | |
elif (cy < int(camera_Heigth / 2) - centerZone): | |
cv2.putText(frame, " UP ", (20, 50), cv2.FONT_HERSHEY_COMPLEX,1,colorGreen, 3) | |
dir = 3 | |
elif (cy > int(camera_Heigth / 2) + centerZone): | |
cv2.putText(frame, " DOWN ", (20, 50), cv2.FONT_HERSHEY_COMPLEX, 1,colorGreen, 3) | |
dir = 4 | |
else: dir=0 | |
# display detected face frame, line from center and direction to go | |
cv2.line (frame, (int(camera_Width/2),int(camera_Heigth/2)), (cx,cy), colorRed, messageThickness) | |
cv2.rectangle(frame, (x, y), (x + w, y + h), colorBlue, messageThickness) | |
cv2.putText (frame, str(int(x)) + " " + str(int(y)), (x - 20, y - 45), cv2.FONT_HERSHEY_COMPLEX,0.7, colorRed, messageThickness) | |
# Camera Settings | |
camera_Width = 1024 # 1280 # 640 | |
camera_Heigth = 780 # 960 # 480 | |
centerZone = 100 | |
# GridLine color green and thickness | |
lineColor = (0, 255, 0) | |
lineThickness = 2 | |
# message color and thickness | |
colorBlue = (255, 0, 0) | |
colorGreen = (0, 255, 0) | |
colorRed = (0, 0, 255) #red | |
messageThickness = 2 | |
dsize = (camera_Width, camera_Heigth) | |
video_capture = cv2.VideoCapture(1) | |
time.sleep(2.0) | |
# enable face and smile detection | |
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') | |
i = 0 | |
while True: | |
i = i + 1 | |
ret, frameOrig = video_capture.read() | |
frame = cv2.resize(frameOrig, dsize) | |
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) | |
displayGrid(frame) | |
# detect faces | |
faces = face_cascade.detectMultiScale(gray, 1.3, 5) | |
for (x, y, w, h) in faces: | |
# display face in grid | |
calculatePositionForDetectedFace(frame, x, y, h , w) | |
cv2.imshow('@ElBruno - Follow Faces', frame) | |
if cv2.waitKey(1) & 0xFF == ord('q'): | |
break | |
video_capture.release() | |
cv2.destroyAllWindows() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment