{"id":77,"date":"2021-12-11T18:20:28","date_gmt":"2021-12-11T18:20:28","guid":{"rendered":"http:\/\/darlotech.co.uk\/?page_id=77"},"modified":"2021-12-17T23:04:49","modified_gmt":"2021-12-17T23:04:49","slug":"robot-snake","status":"publish","type":"page","link":"https:\/\/darlotech.co.uk\/?page_id=77","title":{"rendered":"Robot Snake"},"content":{"rendered":"\n<p>My &#8216;snake&#8217; will track a human face via a little bit of AI programming.<\/p>\n\n\n\n<center><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<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"Face Tracking Snake\" width=\"620\" height=\"349\" src=\"https:\/\/www.youtube.com\/embed\/utwpie3XC70?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure><\/center>\n\n\n\n<p>The &#8216;snake&#8217; was driven directly from a computer running a Python program.<\/p>\n\n\n\n<p>The head movement was via two servo motors in a pan\/tilt arrangement, controlled by a Pololu Maestro controller.<\/p>\n\n\n\n<p>Below is the Python code I used for this project.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2\nimport sys\nimport datetime\nimport random\nimport win32api\nimport maestro\nfrom maestro import Controller\n\npan = 7000  # Initial position of servo, centre (10000 is max turn)\ntilt =7000 # Initial position of servo, centre\n\nwin = 10\n\nx_mid = 200\ny_mid = 160\n\nservo = maestro.Controller('COM7')\nservo.setTarget(0,pan)\nservo.setTarget(1,tilt)\nservo.close()\n\nfaceCascade = cv2.CascadeClassifier('C:\\OpenCV ver 2\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_default.xml')\nfont = cv2.FONT_HERSHEY_PLAIN\n\ncounter = 0\nmove = 0\nlength = 400\n\nvideo_capture = cv2.VideoCapture(0)\n\nwhile True:\n    ret, frame = video_capture.read()           # Capture frame-by-frame\n    counter = counter + 1\n    move = move + 10\n    if counter &gt; 1024:\n        counter = 0\n    if move &gt; 150:\n        move = 0\n    cv2.putText(frame, 'Phils robotic snake', (10, 25), font, 1.0, (0, 255, 0), 1, 2)\n    timenow = datetime.datetime.now().strftime(\"%a, %d %B %Y %H:%M:%S\")\n    cv2.putText(frame, timenow, (10, 45), font, 1.0, (0, 255, 0), 1, 2)\n    cv2.putText(frame, 'Tracking', (580, 10), font, 1.0, (0, 255, 0), 1, 2)\n    cv2.circle(frame, (400+move, 470), 2, (0, 255, 0), thickness=-1, lineType=8, shift=0)\n    cv2.circle(frame, (550-move, 470), 2, (0, 255, 0), thickness=-1, lineType=8, shift=0)\n    cv2.line(frame, (630, 10), (630,10+length), (0, 255, 0), thickness=1, lineType=8, shift=0)\n\n\n    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\n\n    faces = faceCascade.detectMultiScale(\n        gray,\n        scaleFactor=1.1,\n        minNeighbors=7,\n        minSize=(30, 30),\n        flags=cv2.cv.CV_HAAR_SCALE_IMAGE\n    )\n\n    for (x, y, w, h) in faces:\n        cv2.putText(frame, 'pan = ' + str(pan) + '   tilt = ' + str(tilt), (10, 475), font, 0.7, (0, 255, 0), 1, 2)\n        cv2.putText(frame, 'x = ' + str(x - x_mid) + '   y = ' + str(y - y_mid), (10, 455), font, 0.7, (0, 255, 0), 1, 2)\n        cv2.circle(frame, (x+w\/2,y+h\/2), 10, (0, 255, 0), thickness=1, lineType=8, shift=0)\n        cv2.circle(frame, (x+w\/2, y+h\/2), 30, (0, 255, 0), thickness=1, lineType=8, shift=0)\n        cv2.line(frame, (x+w\/2,y+h\/2-100), (x+w\/2,y+h\/2+100), (0, 255, 0), thickness=1, lineType=8, shift=0)\n        cv2.line(frame, (x+w\/2-100,y+h\/2), (x+w\/2+100,y+h\/2), (0, 255, 0), thickness=1, lineType=8, shift=0)\n        meter = x\n        cv2.arrowedLine(frame, (630, 10+meter), (615, 10+meter), (0, 255, 0), thickness=2, shift=0, tipLength=0.2)\n        cv2.putText(frame, 'Pheidi detected', (x+w\/2+10,y), font, 1.0, (0, 0, 255), 1, 2)\n\n        servo = maestro.Controller('COM7')\n        if (x - x_mid) &gt; win:\n            pan = pan + ((x - x_mid)\/2)\n        if (x - x_mid) &lt; -win:\n            pan = pan - ((x_mid - x)\/2)\n        if (y - y_mid) &gt; win:\n            tilt = tilt - ((y - y_mid)\/3)\n        if (y - y_mid) &lt; -win:\n            tilt = tilt + ((y_mid - y)\/3)\n\n        if pan &gt; 10000:\n            pan = 10000\n        if pan &lt; 10:\n            pan = 10\n        if tilt &gt; 10000:\n            tilt = 10000\n        if tilt &lt; 10:\n            tilt = 10\n        servo.setTarget(0, pan)\n        servo.setTarget(1, tilt)\n        servo.close()\n\n    if cv2.waitKey(1) &amp; 0xFF == ord('q'):\n        break\n    cv2.namedWindow('Video', cv2.WINDOW_NORMAL)\n    cv2.imshow('Video', frame)      # Display the resulting frame\n# Release the capture\nvideo_capture.release()\ncv2.destroyAllWindows()\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>My &#8216;snake&#8217; will track a human face via a little bit of AI programming. The &#8216;snake&#8217; was driven directly from&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":27,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_regular_price":[],"currency_symbol":[],"spay_email":"","footnotes":""},"class_list":["post-77","page","type-page","status-publish","hentry"],"post_slider_layout_featured_media_urls":{"thumbnail":"","post_slider_layout_landscape_large":"","post_slider_layout_portrait_large":"","post_slider_layout_square_large":"","post_slider_layout_landscape":"","post_slider_layout_portrait":"","post_slider_layout_square":"","full":""},"_links":{"self":[{"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/77","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=77"}],"version-history":[{"count":5,"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/77\/revisions"}],"predecessor-version":[{"id":349,"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/77\/revisions\/349"}],"up":[{"embeddable":true,"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/27"}],"wp:attachment":[{"href":"https:\/\/darlotech.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=77"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}