{"id":1159,"date":"2023-09-18T03:19:43","date_gmt":"2023-09-17T19:19:43","guid":{"rendered":"http:\/\/bversion.com\/WordPress\/?p=1159"},"modified":"2023-09-24T20:12:10","modified_gmt":"2023-09-24T12:12:10","slug":"drone-programming-face-detection-and-tracking","status":"publish","type":"post","link":"https:\/\/bversion.com\/WordPress\/2023\/09\/18\/drone-programming-face-detection-and-tracking\/","title":{"rendered":"Drone Programming &#8211; Face Detection and Tracking"},"content":{"rendered":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Program Tello with Python #3 - Face Detection and Tracking\" width=\"604\" height=\"340\" src=\"https:\/\/www.youtube.com\/embed\/wzp7E1X0nmA?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>If I hadn&#8217;t tried, I never have known that doing face detection nowadays is such simple and easy. Even for a beginner like me, I can make it happen within a few hours\u2026 after I spent a few days learning and understanding the libraries. It is worth having a try, it will lead you to a new world and start to understand vision computing, deep learning, and AI development. Let&#8217;s take a look at what I did.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Basic Concept<\/h2>\n\n\n<style>.wp-block-kadence-iconlist.kt-svg-icon-list-items1159_e6ff40-1d:not(.this-stops-third-party-issues){margin-top:0px;margin-bottom:0px;}.wp-block-kadence-iconlist.kt-svg-icon-list-items1159_e6ff40-1d ul.kt-svg-icon-list:not(.this-prevents-issues):not(.this-stops-third-party-issues):not(.tijsloc){margin-top:0px;margin-right:0px;margin-bottom:var(--global-kb-spacing-sm, 1.5rem);margin-left:0px;}.wp-block-kadence-iconlist.kt-svg-icon-list-items1159_e6ff40-1d ul.kt-svg-icon-list{grid-row-gap:5px;}.wp-block-kadence-iconlist.kt-svg-icon-list-items1159_e6ff40-1d ul.kt-svg-icon-list .kt-svg-icon-list-item-wrap .kt-svg-icon-list-single{margin-right:10px;}.kt-svg-icon-list-items1159_e6ff40-1d ul.kt-svg-icon-list .kt-svg-icon-list-level-0 .kt-svg-icon-list-single svg{font-size:20px;}<\/style>\n<div class=\"wp-block-kadence-iconlist kt-svg-icon-list-items kt-svg-icon-list-items1159_e6ff40-1d kt-svg-icon-list-columns-1 alignnone\"><ul class=\"kt-svg-icon-list\"><style>.kt-svg-icon-list-item-1159_5e0565-d2 .kt-svg-icon-list-text mark.kt-highlight{background-color:unset;font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}<\/style>\n<li class=\"wp-block-kadence-listitem kt-svg-icon-list-item-wrap kt-svg-icon-list-item-1159_5e0565-d2\"><span class=\"kb-svg-icon-wrap kb-svg-icon-fe_checkCircle kt-svg-icon-list-single\"><svg viewBox=\"0 0 24 24\"  fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"  aria-hidden=\"true\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/><polyline points=\"22 4 12 14.01 9 11.01\"\/><\/svg><\/span><span class=\"kt-svg-icon-list-text\">Capture video frame from the drone<\/span><\/li>\n\n\n<style>.kt-svg-icon-list-item-1159_a1d019-07 .kt-svg-icon-list-text mark.kt-highlight{background-color:unset;font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}<\/style>\n<li class=\"wp-block-kadence-listitem kt-svg-icon-list-item-wrap kt-svg-icon-list-item-1159_a1d019-07\"><span class=\"kb-svg-icon-wrap kb-svg-icon-fe_checkCircle kt-svg-icon-list-single\"><svg viewBox=\"0 0 24 24\"  fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"  aria-hidden=\"true\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/><polyline points=\"22 4 12 14.01 9 11.01\"\/><\/svg><\/span><span class=\"kt-svg-icon-list-text\">Use a face detection tool to identify the main face from the frame. Since we have not yet applied face recognition, we just picked the closet one as the main face.<\/span><\/li>\n\n\n<style>.kt-svg-icon-list-item-1159_19f4de-45 .kt-svg-icon-list-text mark.kt-highlight{background-color:unset;font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}<\/style>\n<li class=\"wp-block-kadence-listitem kt-svg-icon-list-item-wrap kt-svg-icon-list-item-1159_19f4de-45\"><span class=\"kb-svg-icon-wrap kb-svg-icon-fe_checkCircle kt-svg-icon-list-single\"><svg viewBox=\"0 0 24 24\"  fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"  aria-hidden=\"true\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/><polyline points=\"22 4 12 14.01 9 11.01\"\/><\/svg><\/span><span class=\"kt-svg-icon-list-text\">Based on the face detected position (x, y) to move the drone and make the face at the center of the frame.<\/span><\/li>\n<\/ul><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Program with CV2 model<\/h2>\n\n\n\n<p>See below for the full program<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-width:19.796875px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Before you run this program, ensure to connect Tello with the WIFI\n\n# Import Tello class from djitellopy library\nfrom djitellopy import Tello\n\n# Import additional library CV2 - OpenCV for image processing, threading for multi-tasking\nimport cv2\nimport threading\nimport time\nimport logging\n\n# Assign tello to the Tello class and set the information to error only\ntello = Tello()\ntello.LOGGER.setLevel(logging.ERROR) #Ignore INFO from Tello\nfly = True #For debuggin purpose\n\n# Assign the pre-trained model - Haar Cascade classifier for CV2 face detection\nface_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')\neyes_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml') \n\n# def a video capture and display function\ndef face_detection(tello):\n\n    while True:\n        # Change the face_center to be global, any changes will be read globally\n        global face_center\n                \n        # Read the frame from Tello and convert the color from BGR to RGB\n        frame = tello.get_frame_read().frame\n        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n        \n        # Convert the image to grayscale for face detection\n        gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)\n\n        # Perform face detection using the pre-train model - haarcascade_frontalface_default.xml\n        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=10, minSize=(80, 80))\n        \n        \n        # Based on CV2 result, find the largest detected face and the position    \n        largest_area = 0\n        largest_face = None\n                \n        for (x, y, w, h) in faces:\n            face_area = w * h\n            if face_area &gt; largest_area:\n                largest_area = face_area\n                largest_face = (x, y, w, h)\n        \n        # Confirm there are two eyes detected inside the face           \n        if largest_face is not None:\n            eyes = eyes_cascade.detectMultiScale(gray) # Using the default parameters\n            eye_count = 0\n            for (ex, ey, _, _) in eyes:\n                if ex - x &lt; w and ey - y &lt; h:\n                    eye_count += 1\n            if eye_count &lt; 2:\n                continue\n            \n        # Highlight the largest face with a box and show the coordinates             \n            x, y, w, h = largest_face\n            face_center = (x + w\/2), (y + h\/2), w\n            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)\n            position_text = f'Face : (x :{x}, y :{y}, w :{w}, h :{h})'\n            center_text = f'{int(x + w\/2)} , {int(y + h\/2)}'\n            rc_text = f'RC({hV}, {dV}, {vV}, {rV})'\n            cv2.putText(frame, position_text, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)\n            cv2.putText(frame, center_text, (int(x + w\/2), int(y + h\/2)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)\n            cv2.putText(frame, rc_text, (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)\n        else:\n            face_center = 480, 360, 200\n        \n        # Display the face detected image and check whether 'q' is bing pressed or not\n        cv2.imshow('Tello Video Stream', frame)              \n        if cv2.waitKey(1) &amp; 0xFF == ord('q'):\n            face_center = False\n            break\n\n########################\n# Start of the program #\n########################\n\n# Connect to the drone via WIFI\ntello.connect()\n\n# Instrust Tello to start video stream and ensure first frame read\ntello.streamon()\n\nwhile True:\n            frame = tello.get_frame_read().frame\n            if frame is not None:\n                break\n\n# Start the face detection thread when the drone is flying\nface_center = 480, 360, 200\nhV = vV = dV = rV = 0\nvideo_thread = threading.Thread(target=face_detection, args=(tello,), daemon=True)\nvideo_thread.start()\n\n# Take off the drone\ntime.sleep(1)\nif fly:\n    tello.takeoff()\n    tello.set_speed(10)\n    time.sleep(2)\n    tello.move_up(80)\n\n# Use RC Control to control the movement of the drone\n# send_rc_control(left_right_velocity, forward_backward_velocity, up_down_velocity, yaw_velocity) from -100 to 100\n\nwhile face_center != False:\n    \n    x, y, w = face_center\n\n    if x &gt; 530:\n        rV = +30           \n    elif x &lt; 430:\n        rV = -30\n    else:\n        rV = 0\n    \n    if y &gt; 410: \n        vV = -20 \n    elif y &lt; 310: \n        vV = 20 \n    else:\n        vV = 0\n        \n    if w &gt; 300:\n        dV = -15\n    elif w &lt; 200:\n        dV = 15\n    else:\n        dV = 0\n    \n    tello.send_rc_control(hV, dV, vV, rV)\n      \n# Landing the drone\nif fly: tello.land()\n\n# Stop the video stream\ntello.streamoff()\n\n# Show the battery level before ending the program\nprint(&quot;Battery :&quot;, tello.get_battery())\" style=\"color:#575279;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Before you run this program, ensure to connect Tello with the WIFI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Import Tello class from djitellopy library<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">from<\/span><span style=\"color: #575279\"> djitellopy <\/span><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> Tello<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Import additional library CV2 - OpenCV for image processing, threading for multi-tasking<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> cv2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> threading<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> logging<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Assign tello to the Tello class and set the information to error only<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> Tello<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">LOGGER<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">setLevel<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">logging<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">ERROR<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">Ignore INFO from Tello<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">fly <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">For debuggin purpose<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Assign the pre-trained model - Haar Cascade classifier for CV2 face detection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">face_cascade <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">CascadeClassifier<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">data<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">haarcascades <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #EA9D34\">&#39;haarcascade_frontalface_default.xml&#39;<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">eyes_cascade <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">CascadeClassifier<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">data<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">haarcascades <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #EA9D34\">&#39;haarcascade_eye.xml&#39;<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line cbp-see-more-line \"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> def a video capture and display function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">def<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">face_detection<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #907AA9; font-style: italic\">tello<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">while<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Change the face_center to be global, any changes will be read globally<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">global<\/span><span style=\"color: #575279\"> face_center<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Read the frame from Tello and convert the color from BGR to RGB<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">get_frame_read<\/span><span style=\"color: #797593\">().<\/span><span style=\"color: #575279\">frame<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">cvtColor<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">COLOR_BGR2RGB<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Convert the image to grayscale for face detection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        gray <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">cvtColor<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">COLOR_RGB2GRAY<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Perform face detection using the pre-train model - haarcascade_frontalface_default.xml<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        faces <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_cascade<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">detectMultiScale<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">gray<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">scaleFactor<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #D7827E\">1.05<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">minNeighbors<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">minSize<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">80<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">80<\/span><span style=\"color: #797593\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Based on CV2 result, find the largest detected face and the position    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        largest_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        largest_face <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">for<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">in<\/span><span style=\"color: #575279\"> faces<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">*<\/span><span style=\"color: #575279\"> h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> face_area <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> largest_area<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                largest_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_area<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                largest_face <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Confirm there are two eyes detected inside the face           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> largest_face <\/span><span style=\"color: #286983\">is<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">not<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            eyes <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> eyes_cascade<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">detectMultiScale<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">gray<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Using the default parameters<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            eye_count <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">for<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">ex<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> ey<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> _<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> _<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">in<\/span><span style=\"color: #575279\"> eyes<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> ex <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">and<\/span><span style=\"color: #575279\"> ey <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                    eye_count <\/span><span style=\"color: #286983\">+=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> eye_count <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><span style=\"color: #286983\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Highlight the largest face with a box and show the coordinates             <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> largest_face<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> w<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">rectangle<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\">w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\">h<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            position_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;Face : (x :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, y :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">y<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, w :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">w<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, h :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">h<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            center_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\"> , <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            rc_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;RC(<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">hV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">dV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">vV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">rV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> position_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> center_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> rc_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">200<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Display the face detected image and check whether &#39;q&#39; is bing pressed or not<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">imshow<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;Tello Video Stream&#39;<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> frame<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\">              <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">waitKey<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">1<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">&amp;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">0x<\/span><span style=\"color: #D7827E\">FF<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">==<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">ord<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;q&#39;<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">False<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">break<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">#######################<\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Start of the program #<\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">#######################<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Connect to the drone via WIFI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">connect<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Instrust Tello to start video stream and ensure first frame read<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">streamon<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #286983\">while<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">get_frame_read<\/span><span style=\"color: #797593\">().<\/span><span style=\"color: #575279\">frame<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> frame <\/span><span style=\"color: #286983\">is<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">not<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><span style=\"color: #286983\">break<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Start the face detection thread when the drone is flying<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">200<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">hV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">video_thread <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> threading<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">Thread<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #907AA9; font-style: italic\">target<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\">face_detection<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">args<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">,),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">daemon<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">video_thread<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">start<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Take off the drone<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">time<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">sleep<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">1<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> fly<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">takeoff<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">set_speed<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    time<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">sleep<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">move_up<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">80<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Use RC Control to control the movement of the drone<\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> send_rc_control(left_right_velocity, forward_backward_velocity, up_down_velocity, yaw_velocity) from -100 to 100<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #286983\">while<\/span><span style=\"color: #575279\"> face_center <\/span><span style=\"color: #286983\">!=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">False<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_center<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">530<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #D7827E\">30<\/span><span style=\"color: #575279\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">430<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">410<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">310<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">300<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">200<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">send_rc_control<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">hV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> dV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> vV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> rV<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Landing the drone<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> fly<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">land<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Stop the video stream<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">streamoff<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Show the battery level before ending the program<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B4637A; font-style: italic\">print<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&quot;Battery :&quot;<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">get_battery<\/span><span style=\"color: #797593\">())<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>If you installed the DJITELLOPY package, CV2 is being installed as well. Otherwise, you need to do this with &#8211; PIP install djitellpy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Face Detection<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:18;--cbp-line-number-width:13.203125px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #575279\">face_cascade <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">CascadeClassifier<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">data<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">haarcascades <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #EA9D34\">&#39;haarcascade_frontalface_default.xml&#39;<\/span><span style=\"color: #797593\">)<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>Besides face detection, CV2 provides different models to support different purposes. All of them are already downloaded when you install the CV2 package. For face detection, we use <strong>haarcascade_frontalface_default.xml<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:94;--cbp-line-number-width:13.203125px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"face_center = 480, 360, 200\nhV = vV = dV = rV = 0\nvideo_thread = threading.Thread(target=face_detection, args=(tello,), daemon=True)\nvideo_thread.start()\" style=\"color:#575279;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #575279\">face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">200<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">hV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">video_thread <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> threading<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">Thread<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #907AA9; font-style: italic\">target<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\">face_detection<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">args<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">,),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">daemon<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">video_thread<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">start<\/span><span style=\"color: #797593\">()<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>The program structure is very similar to the video-capturing project. We need to run the face detection function in a thread (parallel processing) to capture and analyze the face position, updating a global variable &#8211; <strong>face_center<\/strong>, so that the drone movement control can take corresponding actions.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:29;--cbp-line-number-width:13.203125px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #575279\">        frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">get_frame_read<\/span><span style=\"color: #797593\">().<\/span><span style=\"color: #575279\">frame<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">cvtColor<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">COLOR_BGR2RGB<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Convert the image to grayscale for face detection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        gray <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">cvtColor<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">COLOR_RGB2GRAY<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Perform face detection using the pre-train model - haarcascade_frontalface_default.xml<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        faces <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_cascade<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">detectMultiScale<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">gray<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">scaleFactor<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #D7827E\">1.05<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">minNeighbors<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">minSize<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">80<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">80<\/span><span style=\"color: #797593\">))<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>Referring to the last project, we use <strong>get_frame_read()<\/strong> to get the latest frame from Tello&#8217;s camera. As we mentioned before, CV2 processes image data in BGR format but the image feed from Tello&#8217;s camera is in RGB format, the &#8216;R&#8217; &amp; &#8216;G&#8217; are mis-mapped. We need to convert this into &#8216;RGB&#8217; for a correct display. Then, we also need to create an image in grayscale because CV2 performs face detection in grayscale. <\/p>\n\n\n\n<p>We use <strong>detectMultiScale<\/strong> to perform face detection based on the <strong>face_cascade<\/strong> setup and the grayscale image, the result will be stored in <strong>faces<\/strong>. There are three inputs to alter the detection result. Be short,<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>scaleFactor <\/strong>&#8211; controls the resizing of the image at each step to detect objects of different sizes. The higher the number, the faster the progress but more chance of missing faces.<\/li>\n\n\n\n<li><strong>minNeighbors <\/strong>&#8211; controls the sensitivity of the detector by requiring a certain number of overlapping detections to consider a region as a positive detection. Lower the number, more sensitive to potential detections, potentially resulting in more detections but also more false positives.<\/li>\n\n\n\n<li><strong>minSize <\/strong>&#8211; minimum size of the face detected, very straightforward<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:40;--cbp-line-number-width:13.203125px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #575279\">        largest_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        largest_face <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">for<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">in<\/span><span style=\"color: #575279\"> faces<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">*<\/span><span style=\"color: #575279\"> h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> face_area <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> largest_area<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                largest_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_area<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                largest_face <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">)<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>Once the face detection is done, face position and sizes will be returned to the array variable <strong>faces<\/strong>, len of <strong>faces<\/strong> representing how many faces are detected and each <strong>faces[] <\/strong>contains the detected position x, position y, width, and height. We are using a for loop to read the <strong>x, y, w &amp; h<\/strong> and identify the largest face as we mentioned before.<\/p>\n\n\n\n<p><strong>vvv Small tool to understanding Scale Factor and Min Neighbour vvv<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-width:13.203125px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# import the opencv library\nimport cv2\n  \n# Load the pre-trained Haar Cascade classifier for face detection\nface_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')\n  \nscale_factor = 1.1\nmin_neighbors = 10\n      \nwhile(True):\n  \n    frame = cv2.imread(&quot;people.jpg&quot;)\n    \n    # Convert the image to grayscale for face detection\n    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n\n    # Perform face detection\n    faces = face_cascade.detectMultiScale(gray, scaleFactor=scale_factor, minNeighbors=min_neighbors, minSize=(100, 100))\n    biggest_face = [0, 0, 0, 0]\n    \n    # Draw rectangles around the detected faces\n    for i, (x, y, w, h) in enumerate(faces):\n        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)\n        position_text = f'Face {i+1}: (x :{x}, y :{y}, w :{w}, h :{h})'\n        center_text = f'{int(x + w\/2)} , {int(y + h\/2)}'\n        cv2.putText(frame, position_text, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)\n        cv2.putText(frame, center_text, (int(x + w\/2), int(y + h\/2)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)\n           \n    cv2.putText(frame, f'scaleFactor = {scale_factor}, minNeighbors = {min_neighbors}', (10, 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)        \n        \n    # Display the resulting frame\n    cv2.imshow('People', frame)\n      \n    # q - quit\n    # a\/s - add or reduce scale factor by 0.05\n    # z\/x - add or reduce min neighors by 1\n    # desired button of your choice\n    key = cv2.waitKey(0)\n    if key == ord('q'):\n        break\n    elif key == ord('a') and scale_factor &gt; 1.05:\n        scale_factor = round(scale_factor - 0.05, 2)\n    elif key == ord('s'):\n        scale_factor = round(scale_factor + 0.05, 2)\n    elif key == ord('z') and min_neighbors &gt; 1:\n        min_neighbors -= 1\n    elif key == ord('x'):\n        min_neighbors += 1\n    \n# Destroy all the windows\ncv2.destroyAllWindows()\" style=\"color:#575279;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> import the opencv library<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> cv2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Load the pre-trained Haar Cascade classifier for face detection<\/span><\/span>\n<span class=\"line cbp-see-more-line \"><span style=\"color: #575279\">face_cascade <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">CascadeClassifier<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">data<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">haarcascades <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #EA9D34\">&#39;haarcascade_frontalface_default.xml&#39;<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">scale_factor <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">1.1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">min_neighbors <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">10<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">while<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">imread<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&quot;people.jpg&quot;<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Convert the image to grayscale for face detection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    gray <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">cvtColor<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">COLOR_BGR2GRAY<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Perform face detection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    faces <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_cascade<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">detectMultiScale<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">gray<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">scaleFactor<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\">scale_factor<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">minNeighbors<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\">min_neighbors<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">minSize<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">100<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">100<\/span><span style=\"color: #797593\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    biggest_face <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">[<\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Draw rectangles around the detected faces<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">for<\/span><span style=\"color: #575279\"> i<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">in<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">enumerate<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">faces<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">rectangle<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\">w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\">h<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        position_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;Face <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">i<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #D7827E\">1<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">: (x :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, y :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">y<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, w :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">w<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, h :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">h<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        center_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\"> , <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> position_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> center_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;scaleFactor = <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">scale_factor<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, minNeighbors = <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">min_neighbors<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">&#39;<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Display the resulting frame<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">imshow<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;People&#39;<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> frame<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> q - quit<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> a\/s - add or reduce scale factor by 0.05<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> z\/x - add or reduce min neighors by 1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> desired button of your choice<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    key <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">waitKey<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> key <\/span><span style=\"color: #286983\">==<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">ord<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;q&#39;<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">break<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> key <\/span><span style=\"color: #286983\">==<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">ord<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;a&#39;<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">and<\/span><span style=\"color: #575279\"> scale_factor <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">1.05<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        scale_factor <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">round<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">scale_factor <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.05<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> key <\/span><span style=\"color: #286983\">==<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">ord<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;s&#39;<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        scale_factor <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">round<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">scale_factor <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.05<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> key <\/span><span style=\"color: #286983\">==<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">ord<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;z&#39;<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">and<\/span><span style=\"color: #575279\"> min_neighbors <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">1<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        min_neighbors <\/span><span style=\"color: #286983\">-=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> key <\/span><span style=\"color: #286983\">==<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">ord<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;x&#39;<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        min_neighbors <\/span><span style=\"color: #286983\">+=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Destroy all the windows<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">destroyAllWindows<\/span><span style=\"color: #797593\">()<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>To better understand the above parameters, I also wrote a small tool to alter Scale Factor (with a &amp; s key) and Min Neighbour (with z &amp; x key), you can have a try with different photos.<\/p>\n\n\n<style>.wp-block-kadence-advancedheading.kt-adv-heading1159_6663ff-dd, .wp-block-kadence-advancedheading.kt-adv-heading1159_6663ff-dd[data-kb-block=\"kb-adv-heading1159_6663ff-dd\"]{font-style:normal;}.wp-block-kadence-advancedheading.kt-adv-heading1159_6663ff-dd mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading1159_6663ff-dd[data-kb-block=\"kb-adv-heading1159_6663ff-dd\"] mark.kt-highlight{font-style:normal;color:#f76a0c;-webkit-box-decoration-break:clone;box-decoration-break:clone;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.wp-block-kadence-advancedheading.kt-adv-heading1159_6663ff-dd img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading1159_6663ff-dd[data-kb-block=\"kb-adv-heading1159_6663ff-dd\"] img.kb-inline-image{width:150px;vertical-align:baseline;}<\/style>\n<h3 class=\"kt-adv-heading1159_6663ff-dd wp-block-kadence-advancedheading\" data-kb-block=\"kb-adv-heading1159_6663ff-dd\"><strong>Eyes Detection<\/strong><\/h3>\n\n\n\n<p>When we developed the program with face detection only, we found that there was a chance to have &#8216;fault detection&#8217; no ever what parameters we tried, which would interfere with our result and induce a &#8216;ghost&#8217; face. We had added eye detection to ensure a face with eyes is correctly detected, it can greatly improve the detection result.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:19;--cbp-line-number-width:13.203125px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #575279\">eyes_cascade <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">CascadeClassifier<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">data<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">haarcascades <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #EA9D34\">&#39;haarcascade_eye.xml&#39;<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>Assigns <strong>haarcascade_eye.xml<\/strong> to <strong>eyes_cascade<\/strong> for eye detection.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:50;--cbp-line-number-width:13.203125px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> largest_face <\/span><span style=\"color: #286983\">is<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">not<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            eyes <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> eyes_cascade<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">detectMultiScale<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">gray<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Using the default parameters<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            eye_count <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">for<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">ex<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> ey<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> _<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> _<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">in<\/span><span style=\"color: #575279\"> eyes<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> ex <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">and<\/span><span style=\"color: #575279\"> ey <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                    eye_count <\/span><span style=\"color: #286983\">+=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> eye_count <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><span style=\"color: #286983\">continue<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>If the largest face is detected, we will do an eye detection to confirm the largest face with two eyes. Same as face detection, eye position, and size will be returned to the array of variable <strong>eyes<\/strong>. We need to compare that there are at least two eyes in the face box. Our logic is very simple, ensure that the eyes x &amp; y position are within the face box, eye_x (ex) minus face_x (x) should be smaller than the width (w) and eye_y (ey) minus face_y (y) should be smaller than the height (h). Why at least two eyes? because it includes potential fault eye detection within the face box.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Face Position<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:50;--cbp-line-number-width:13.203125px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> largest_face <\/span><span style=\"color: #286983\">is<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">not<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            eyes <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> eyes_cascade<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">detectMultiScale<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">gray<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Using the default parameters<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            eye_count <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">for<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">ex<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> ey<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> _<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> _<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">in<\/span><span style=\"color: #575279\"> eyes<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> ex <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">and<\/span><span style=\"color: #575279\"> ey <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                    eye_count <\/span><span style=\"color: #286983\">+=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> eye_count <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><span style=\"color: #286983\">continue<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Highlight the largest face with a box and show the coordinates             <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> largest_face<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> w<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">rectangle<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\">w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\">h<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            position_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;Face : (x :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, y :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">y<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, w :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">w<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, h :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">h<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            center_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\"> , <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            rc_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;RC(<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">hV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">dV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">vV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">rV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> position_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> center_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> rc_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">200<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>Once we confirm the largest face with eyes, we will get the <strong>face_center<\/strong> position ((x + w\/2), (y + h\/2)) and w for the drone movement. Since we are running the <strong>face_detection()<\/strong> in parallel, we make the <strong>face_center<\/strong> variable global, so that the drone can get the data in real-time and adjust the position.  Then, we highlight the face with a blue box, the face position, and the drone movement (RC &#8211; we explain later) in the video for user information. If there is no face detected, the face_center will keep as 480, 360, 200.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Drone Movement Control<\/h3>\n\n\n\n<p>We target to position the largest face in the center of the camera. The resolution of Tello&#8217;s camera is 960 x 720, i.e. face center is (480, 360). It is not practical to position to a point, so we defined an area (480 +\/- 50, 360 +\/- 50).<\/p>\n\n\n\n<p>With the real time <strong>face_center<\/strong> data from the <strong>face_detection()<\/strong>, we compare this with the box above. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>if x &gt; 530, we need to rotate the drone to right (view from the drone), i.e. clockwise<\/li>\n\n\n\n<li>if x &lt; 430, we need to rotate the drone to left (view from the drone, i.e anti-clockwise <\/li>\n\n\n\n<li>if within the box, no movement is needed<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>if y &gt; 410, we need to move up the drone<\/li>\n\n\n\n<li>if y &lt; 310, we need to move down the drone<\/li>\n\n\n\n<li>if within the box, no movement is needed<\/li>\n<\/ul>\n\n\n\n<p>Besides the x &amp; y position, we also control how close the drone is to our face. We use the w (width) to make the judgment, we control the face size width between 300 &#8211; 200. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>if w &gt; 300, it too close, we need to move the drone away, i.e. backward<\/li>\n\n\n\n<li>if w &lt; 200, it too far, we need to move the drone closer, i.e. forward<\/li>\n\n\n\n<li>if within the range, no movement is needed<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">DJITELLOPY SEND_RC_CONTROL<\/h3>\n\n\n\n<p>In our first project, we move the drone by using commands like move_up(), move_down(), rotate_clockwise(), etc.. Since this is a once-a-time command, the drone will be moving step by step, and also min. 20cm a time. The result will be lagging and unsmooth.<\/p>\n\n\n\n<p>So, we use SEND_RC_CONTROL to control the drone movement. For RC_SEND_CONTROL, it can set the velocity of the drone in four dimensions a time. <\/p>\n\n\n\n<p>* Left\/Right is from drone&#8217;s view<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes has-small-font-size\"><table><tbody><tr><td>Horizontal<\/td><td>-100 &#8211; 0 to move left<\/td><td>0 &#8211; 100 to move right<\/td><\/tr><tr><td>Depth <\/td><td>-100 &#8211; 0 to move backward<\/td><td>0 &#8211; 100 to move forward<\/td><\/tr><tr><td>Vertial<\/td><td>-100 &#8211; 0 to move down<\/td><td>0 -100 to move up<\/td><\/tr><tr><td>Rotation<\/td><td>-100 &#8211; 0 to rotate anti-clockwsie<\/td><td> 0 &#8211; 100 to rotate clockwise<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\">SEND_RC_CONTROL(Horizontal velocity, Depth velocity, Vertial velocity, Rotation velocity)<\/figcaption><\/figure>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:107;--cbp-line-number-width:19.796875px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Use RC Control to control the movement of the drone<\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> send_rc_control(left_right_velocity, forward_backward_velocity, up_down_velocity, yaw_velocity) from -100 to 100<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #286983\">while<\/span><span style=\"color: #575279\"> face_center <\/span><span style=\"color: #286983\">!=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">False<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_center<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">530<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #D7827E\">30<\/span><span style=\"color: #575279\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">430<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">410<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">310<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">300<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">200<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">send_rc_control<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">hV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> dV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> vV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> rV<\/span><span style=\"color: #797593\">)<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>As a result, we have the code above, <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>hV <\/strong>&#8211; Horizontal Velocity<\/li>\n\n\n\n<li><strong>dV<\/strong> &#8211; Depth Velocity<\/li>\n\n\n\n<li><strong>vV<\/strong> &#8211; Vertial Velocity<\/li>\n\n\n\n<li><strong>rV <\/strong>&#8211; Rotation Velocity<\/li>\n<\/ul>\n\n\n\n<p>Since doing rotation is a better approach to adjusting the horizontal position, we used rV instead of hV. Once we send the velocity number to the drone, it will keep moving in the direction according to the velocity until the next change. So, the drone is flying smoothly to the face position and achieves face tracking.<\/p>\n\n\n\n<p>That&#8217;s simple, right?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Face Detection with MediaPipe model?<\/h2>\n\n\n\n<p>Besides using <strong>CV2. haarcascade_frontalface_default.xml<\/strong>, we have tried to use the <strong>MediaPipe.blaze_face_short_range.tflite<\/strong>. We supposed the face detection good is better because it is a deep learning based model. And yes, it is better in accuracy and response. See below comparison,<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"http:\/\/bversion.com\/WordPress\/wp-content\/uploads\/2023\/09\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"591\" height=\"727\" src=\"http:\/\/bversion.com\/WordPress\/wp-content\/uploads\/2023\/09\/image.png\" alt=\"\" class=\"wp-image-1179\" srcset=\"https:\/\/bversion.com\/WordPress\/wp-content\/uploads\/2023\/09\/image.png 591w, https:\/\/bversion.com\/WordPress\/wp-content\/uploads\/2023\/09\/image-244x300.png 244w\" sizes=\"auto, (max-width: 591px) 100vw, 591px\" \/><\/a><\/figure>\n\n\n\n<p>However, <strong>blaze_face_short_range.tflite<\/strong> is a lightweight model for detecting single or multiple faces within selfie-like images from a smartphone camera or webcam. The model is optimized for front-facing phone camera images at short range. The result for our project is not ideal since it cannot detect a long-range face when I moved away from the drone, we will re-test this when the full-range blaze face is released. <\/p>\n\n\n\n<p>See below for the full code with MediaPipe.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-width:19.796875px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Before you run this program, ensure to connect Tello with the WIFI\n\n# Import Tello class from djitellopy library\nfrom djitellopy import Tello\n\n# Import additional library CV2 - OpenCV for image processing, threading for multi-tasking\n# Import MediaPIPE for the face detection\nimport cv2\nimport threading\nimport time\nimport logging\nimport mediapipe as mp\nfrom mediapipe.tasks import python\nfrom mediapipe.tasks.python import vision\n\n# Assign tello to the Tello class and set the information to error only\ntello = Tello()\ntello.LOGGER.setLevel(logging.ERROR) #Ignore INFO from Tello\nfly = True #For debuggin purpose\n\n# Upload the pre-trained model and setup the Face Detection Option for MediaPIPE\nbase_options = python.BaseOptions(model_asset_path='blaze_face_short_range.tflite')\noptions = vision.FaceDetectorOptions(base_options=base_options, min_detection_confidence = 0.8, min_suppression_threshold = 0.3)\ndetector = vision.FaceDetector.create_from_options(options)\n  \n# def a video capture and display function\ndef face_detection(tello):\n\n    while True:\n        # Change the face_center to be global, any changes will be read globally\n        global face_center      \n        \n        # Read the frame from Tello and convert the color from BGR to RGB\n        frame = tello.get_frame_read().frame\n        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n        image = mp.Image(image_format = mp.ImageFormat.SRGB, data = frame)\n        \n        # Perform face detection using the pre-train model - blaze_face_short_range.tflite\n        detection_result = detector.detect(image)\n        \n        # Based on the MediaPIPE result, find the largest detected face and the position    \n        largest_area = 0\n        largest_face = None\n        \n        #faces = len(face_position.detections)\n        #if faces &gt; 0:\n        for face_position in detection_result.detections:\n            x = face_position.bounding_box.origin_x\n            y = face_position.bounding_box.origin_y\n            w = face_position.bounding_box.width\n            h = face_position.bounding_box.height\n            face_area = w * h\n            if face_area &gt; largest_area:\n                largest_area = face_area\n                largest_face = (x, y, w, h)\n        \n        # Highlight the largest face with a box and show the coordinates        \n        if largest_face is not None:\n            x, y, w, h = largest_face\n            face_center = (x + w\/2), (y + h\/2), w\n            \n            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)\n            position_text = f'Face : (x :{x}, y :{y}, w :{w}, h :{h})'\n            center_text = f'{int(x + w\/2)} , {int(y + h\/2)}'\n            rc_text = f'RC({hV}, {dV}, {vV}, {rV})'\n            cv2.putText(frame, position_text, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)\n            cv2.putText(frame, center_text, (int(x + w\/2), int(y + h\/2)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)\n            cv2.putText(frame, rc_text, (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)\n        else:\n            face_center = 480, 360, 200\n        \n        # Display the face detected image and check whether 'q' is bing pressed or not\n        cv2.imshow('Tello Video Stream', frame)              \n        if cv2.waitKey(1) &amp; 0xFF == ord('q'):\n            face_center = False\n            break\n\n########################\n# Start of the program #\n########################\n\n# Connect to the drone via WIFI\ntello.connect()\n\n# Instrust Tello to start video stream and ensure first frame read\ntello.streamon()\nwhile True:\n            frame = tello.get_frame_read().frame\n            if frame is not None:\n                break\n\n# Start the face detection thread when the drone is flying\nface_center = 480, 360, 200\nhV = vV = dV = rV = 0\nvideo_thread = threading.Thread(target=face_detection, args=(tello,), daemon=True)\nvideo_thread.start()\n\n# Take off the drone\ntime.sleep(1)\nif fly:\n    tello.takeoff()\n    tello.set_speed(10)\n    time.sleep(2)\n    tello.move_up(80)\n\n# Use RC Control to control the movement of the drone\n# send_rc_control(left_right_velocity, forward_backward_velocity, up_down_velocity, yaw_velocity) from -100 to 100\nwhile face_center != False:\n    \n    x, y, w = face_center\n\n    if x &gt; 530:\n        rV = +30           \n    elif x &lt; 430:\n        rV = -30\n    else:\n        rV = 0\n    \n    if y &gt; 410: \n        vV = -20 \n    elif y &lt; 310: \n        vV = 20 \n    else:\n        vV = 0\n        \n    if w &gt; 250:\n        dV = -15\n    elif w &lt; 150:\n        dV = 15\n    else:\n        dV = 0\n    \n    tello.send_rc_control(hV, dV, vV, rV)\n      \n# Landing the drone\nif fly: tello.land()\n\n# Stop the video stream\ntello.streamoff()\n\n# Show the battery level before ending the program\nprint(&quot;Battery :&quot;, tello.get_battery())\" style=\"color:#575279;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Before you run this program, ensure to connect Tello with the WIFI<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Import Tello class from djitellopy library<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">from<\/span><span style=\"color: #575279\"> djitellopy <\/span><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> Tello<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Import additional library CV2 - OpenCV for image processing, threading for multi-tasking<\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Import MediaPIPE for the face detection<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> cv2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> threading<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> logging<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> mediapipe <\/span><span style=\"color: #286983\">as<\/span><span style=\"color: #575279\"> mp<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">from<\/span><span style=\"color: #575279\"> mediapipe<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">tasks <\/span><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> python<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">from<\/span><span style=\"color: #575279\"> mediapipe<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">tasks<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">python <\/span><span style=\"color: #286983\">import<\/span><span style=\"color: #575279\"> vision<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Assign tello to the Tello class and set the information to error only<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> Tello<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">LOGGER<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">setLevel<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">logging<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">ERROR<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">Ignore INFO from Tello<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">fly <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">For debuggin purpose<\/span><\/span>\n<span class=\"line cbp-see-more-line \"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Upload the pre-trained model and setup the Face Detection Option for MediaPIPE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">base_options <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> python<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">BaseOptions<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #907AA9; font-style: italic\">model_asset_path<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #EA9D34\">&#39;blaze_face_short_range.tflite&#39;<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">options <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> vision<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">FaceDetectorOptions<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #907AA9; font-style: italic\">base_options<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\">base_options<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">min_detection_confidence<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.8<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">min_suppression_threshold<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.3<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">detector <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> vision<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">FaceDetector<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">create_from_options<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">options<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> def a video capture and display function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">def<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">face_detection<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #907AA9; font-style: italic\">tello<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">while<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Change the face_center to be global, any changes will be read globally<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">global<\/span><span style=\"color: #575279\"> face_center      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Read the frame from Tello and convert the color from BGR to RGB<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">get_frame_read<\/span><span style=\"color: #797593\">().<\/span><span style=\"color: #575279\">frame<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">cvtColor<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">COLOR_BGR2RGB<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        image <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> mp<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">Image<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #907AA9; font-style: italic\">image_format<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> mp<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">ImageFormat<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">SRGB<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">data<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> frame<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Perform face detection using the pre-train model - blaze_face_short_range.tflite<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        detection_result <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> detector<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">detect<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">image<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Based on the MediaPIPE result, find the largest detected face and the position    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        largest_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        largest_face <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">faces = len(face_position.detections)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">if faces &gt; 0:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">for<\/span><span style=\"color: #575279\"> face_position <\/span><span style=\"color: #286983\">in<\/span><span style=\"color: #575279\"> detection_result<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">detections<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            x <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_position<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">bounding_box<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">origin_x<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            y <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_position<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">bounding_box<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">origin_y<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            w <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_position<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">bounding_box<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">width<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            h <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_position<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">bounding_box<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">height<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">*<\/span><span style=\"color: #575279\"> h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> face_area <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> largest_area<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                largest_area <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_area<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                largest_face <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Highlight the largest face with a box and show the coordinates        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> largest_face <\/span><span style=\"color: #286983\">is<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">not<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> h <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> largest_face<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> w<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">rectangle<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\">w<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\">h<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            position_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;Face : (x :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, y :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">y<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, w :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">w<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, h :<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">h<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            center_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\"> , <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            rc_text <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">f<\/span><span style=\"color: #EA9D34\">&#39;RC(<\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">hV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">dV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">vV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">, <\/span><span style=\"color: #286983\">{<\/span><span style=\"color: #575279\">rV<\/span><span style=\"color: #286983\">}<\/span><span style=\"color: #EA9D34\">)&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> position_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> center_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> w<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #575279\"> h<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">putText<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">frame<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> rc_text<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #286983\">FONT_HERSHEY_SIMPLEX<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0.5<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">255<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><span style=\"color: #797593\">),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">200<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Display the face detected image and check whether &#39;q&#39; is bing pressed or not<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">imshow<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;Tello Video Stream&#39;<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> frame<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\">              <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> cv2<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">waitKey<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">1<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">&amp;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">0x<\/span><span style=\"color: #D7827E\">FF<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">==<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #B4637A; font-style: italic\">ord<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&#39;q&#39;<\/span><span style=\"color: #797593\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">False<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">break<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">#######################<\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Start of the program #<\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\">#######################<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Connect to the drone via WIFI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">connect<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Instrust Tello to start video stream and ensure first frame read<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">streamon<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">while<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            frame <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">get_frame_read<\/span><span style=\"color: #797593\">().<\/span><span style=\"color: #575279\">frame<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">            <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> frame <\/span><span style=\"color: #286983\">is<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">not<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">None<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">                <\/span><span style=\"color: #286983\">break<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Start the face detection thread when the drone is flying<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">face_center <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">200<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">hV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">video_thread <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> threading<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">Thread<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #907AA9; font-style: italic\">target<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\">face_detection<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">args<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">,),<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #907AA9; font-style: italic\">daemon<\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #D7827E\">True<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">video_thread<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">start<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Take off the drone<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">time<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">sleep<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">1<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> fly<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">takeoff<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">set_speed<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">10<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    time<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">sleep<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">2<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">move_up<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #D7827E\">80<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Use RC Control to control the movement of the drone<\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> send_rc_control(left_right_velocity, forward_backward_velocity, up_down_velocity, yaw_velocity) from -100 to 100<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">while<\/span><span style=\"color: #575279\"> face_center <\/span><span style=\"color: #286983\">!=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">False<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    x<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> face_center<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">530<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">+<\/span><span style=\"color: #D7827E\">30<\/span><span style=\"color: #575279\">           <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">430<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">30<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">410<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">310<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">20<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">250<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #D7827E\">15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> w <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">150<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">15<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        dV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">send_rc_control<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #575279\">hV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> dV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> vV<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> rV<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">      <\/span><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Landing the drone<\/span><\/span>\n<span class=\"line\"><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> fly<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">land<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Stop the video stream<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">streamoff<\/span><span style=\"color: #797593\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #797593; font-style: italic\">#<\/span><span style=\"color: #9893A5; font-style: italic\"> Show the battery level before ending the program<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B4637A; font-style: italic\">print<\/span><span style=\"color: #797593\">(<\/span><span style=\"color: #EA9D34\">&quot;Battery :&quot;<\/span><span style=\"color: #797593\">,<\/span><span style=\"color: #575279\"> tello<\/span><span style=\"color: #797593\">.<\/span><span style=\"color: #575279\">get_battery<\/span><span style=\"color: #797593\">())<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">PID?<\/h2>\n\n\n\n<p>Thanks to <a href=\"https:\/\/tellopilots.com\/threads\/i-am-new-to-the-tello-programming-just-created-a-face-detection-tracking-program.6611\/\" data-type=\"link\" data-id=\"https:\/\/tellopilots.com\/threads\/i-am-new-to-the-tello-programming-just-created-a-face-detection-tracking-program.6611\/\">Hacky from TelloPilots<\/a> gave me the idea of PID, I started to study and am going to add this to the face detection project. To be frank, I got a failed mark and needed to redo the exam for the Feedback Control System when I was in college. However, I found it very important and useful when working&#8230; you may not know how useful what you were learning when you were a student. (sad..)<\/p>\n\n\n\n<p>So, I need to do some revise first. See below for a basic PID concept,<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"What Is PID Control? | Understanding PID Control, Part 1\" width=\"604\" height=\"340\" src=\"https:\/\/www.youtube.com\/embed\/wkfEZmsQqiA?start=287&#038;feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"PIDs Simplified\" width=\"604\" height=\"340\" src=\"https:\/\/www.youtube.com\/embed\/6OH-wOsVVjg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>As a result, I still have no clue how to implement PID into my program but change the speed from a constant value to a variable that varies according to the distance to the center. The result is much better and I can target the exact center (480,360) instead of a +\/-50 box (480 +\/- 50, 360 +\/- 50), you can replace the following codes.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro padding-bottom-disabled cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.75rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#575279;--cbp-line-number-start:114;--cbp-line-number-width:19.796875px;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#faf4ed\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><pre class=\"shiki rose-pine-dawn\" style=\"background-color: #faf4ed\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">((<\/span><span style=\"color: #575279\">x <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">4.8<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #575279\">            <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> x <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">((<\/span><span style=\"color: #D7827E\">480<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> x<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">4.8<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        rV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">if<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&gt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">((<\/span><span style=\"color: #575279\">y <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">3.6<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">elif<\/span><span style=\"color: #575279\"> y <\/span><span style=\"color: #286983\">&lt;<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #797593\">:<\/span><span style=\"color: #575279\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #56949F\">int<\/span><span style=\"color: #797593\">((<\/span><span style=\"color: #D7827E\">360<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #286983\">-<\/span><span style=\"color: #575279\"> y<\/span><span style=\"color: #797593\">)<\/span><span style=\"color: #286983\">\/<\/span><span style=\"color: #D7827E\">3.6<\/span><span style=\"color: #797593\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">    <\/span><span style=\"color: #286983\">else<\/span><span style=\"color: #797593\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #575279\">        vV <\/span><span style=\"color: #286983\">=<\/span><span style=\"color: #575279\"> <\/span><span style=\"color: #D7827E\">0<\/span><\/span><\/code><\/pre><span style=\"display:flex;align-items:flex-end;padding:10px;width:100%;justify-content:flex-end;background-color:#faf4ed;color:#625c88;font-size:12px;line-height:1;position:relative\">Python<\/span><\/div>\n\n\n\n<p>For safety reasons, I don&#8217;t implement this to the &#8216;Come&#8217; and &#8216;Away&#8217; speeds. I will keep studying how to implement the PID or you can give me an idea how to achieve this. Please leave me comment.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If I hadn&#8217;t tried, I never have known that doing face detection nowadays is such simple and easy. Even for a beginner like me, I can make it happen within a few hours\u2026 after I spent a few days learning and understanding the libraries. It is worth having a try, it will lead you to &hellip; <a href=\"https:\/\/bversion.com\/WordPress\/2023\/09\/18\/drone-programming-face-detection-and-tracking\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Drone Programming &#8211; Face Detection and Tracking<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":6,"featured_media":1182,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"cybocfi_hide_featured_image":"yes","footnotes":""},"categories":[14,12],"tags":[],"class_list":["post-1159","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-drone_control","category-features"],"_links":{"self":[{"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/posts\/1159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/comments?post=1159"}],"version-history":[{"count":26,"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/posts\/1159\/revisions"}],"predecessor-version":[{"id":1254,"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/posts\/1159\/revisions\/1254"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/media\/1182"}],"wp:attachment":[{"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/media?parent=1159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/categories?post=1159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bversion.com\/WordPress\/wp-json\/wp\/v2\/tags?post=1159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}