原创声明

高达模型制作技巧

微信公众号《高达模型制作技巧》自创办以来深受各个方面大力支持,众多作者编辑译者亦倾力付出辛苦的汗水和独特的创意。对本公众号原创文章的转载请联系公众号编辑获得授权。私自转载行为和任何不负责的摘录行为,本公众号运营主体将进行最大程度的追责。

作者:Hydra.CasterDamon工作室

这是昨天收到的作者投稿,在iN的建议下就给大家改成了一个教程。

先看看是什么:

利用摄像头和舵机组建的一只人脸跟踪大魔。只要你出现在它的视野中,这只大摩头就会一只盯着你。

有一种 硝烟散尽 在废墟里找到了一个大魔 只剩下头 但眼睛还亮着的感觉……

其实要实现这个控制并不难,整体上仅仅需要200多行代码,在程序中都算作是小程序了。即便是未来真的出现高达,高达的目标追踪功能的代码其实也是可以从作者的项目中进行扩展的。

那么我们来看看这只大摩头是如何制作出来的:

作者的教程:

第一次写教程没有啥经验 有写的不好的地方欢迎指正

这个大魔源于一个我在写的人脸追踪的项目,做好了就像下面这个。

但是作为胶佬自然不会就这么止步,所以就想到了把他美化一下,就想到了买一个大魔头,然后把它装在里面。

接下来先教大家制作这个人脸追踪平台,成本不到100元。

需要的东西有:

  • 舵机两个

  • 二轴云台一个

  • Arduino nano3开发板一个

  • usb摄像头一个

  • usb线一根

网上买的云台质量不会很好,舵机可能不能很好的卡进去,所以要先把舵机打磨好,然后像下图这样组装好。

舵机一共有三根线,黄色的是信号线,红色和褐色分别是正负极。如下图所示。

我们将正负极的线剪断,然后将两个舵机的正极接在一起,负极接在一起,再剪断一根没用的usb线,usb线里面也会有正负极线,对应的将正极接在一起,负极接在一起。这样就可以通过usb向舵机供电了。

再将x轴的舵机信号线接到arduino nano开发板的D8接口接到Y轴的舵机信号线上,D9接口接到X轴的舵机信号线上。

这样硬件部分的连接就算完成了。

接下来就是向arduino nano烧录程序了。

下载arduino的IDE

将arduino nano通过usb连接到电脑上。做如下配置,在工具中选择开发板。

配置端口,我这里是COM5,大家根据自己的实际情况选择。

然后点击编译,编译无错误,上传。

等待上传完成。

最后将摄像头连接到电脑上,打开pycharm软件,运行python人脸识别代码。

Python会将识别到的人脸的坐标通过串口发送给arduino nano开发板。开发板根据接收到的坐标对舵机进行控制。

以上关于人脸追踪的介绍就完成了。

下面就是大魔头的做旧了。

首先把大魔头的眼睛以下的部分全部掏空,然后打磨平整,保证大魔头可以正好套在云台上。

然后在外甲加上伤痕,我没有电动锯,所以就用了三角形的锉刀,一点一点搓出来的伤口。随后就是对动力管等上漆,这里用的田宫的喷灌,金属浅枪铁色。

先在表面上一层消光,以免裂件。然后就是渍洗。我用了郡仕的铁锈色渗线液进行渍洗。

等渍洗液干透,就可以用棉签蘸取稀释剂擦去多余的渍洗液了。

然后干扫、用面相笔蘸取黑色补充细节掉漆。

完成!

后面则是代码了:

Arduino  舵机驱动代码:

#include <Servo.h>    // 声明调用Servo.h库Servo myservo;        // 创建一个舵机对象Servo myservo1;        // 创建一个舵机对象int posx = 60;          // 变量pos用来存储舵机位置int posy = 60;          // 变量pos用来存储舵机位置int c = 0;void setup() {   Serial.begin(9600);    myservo.attach(9);  // 将引脚9上的舵机与声明的舵机对象连接起来    myservo1.attach(8);  // 将引脚9上的8机与声明的舵机对象连接起来    myservo.write(posx);     myservo1.write(posy);// 给舵机写入角度} void loop() {  while(Serial.available()>0)//当有信号的时候  {    char val=Serial.read();    Serial.println(val);     if(val=='0'){     //左上    if(posx -3>=60){      posx = posx -3;          c = 1;    }    if(posy -2>=0){      posy = posy -2;          c = 1;    }    }else if(val=='1'){    //右上    if(posx +3<=120){      posx = posx +3;          c = 1;    }    if(posy -2>=60){      posy = posy -2;          c = 1;    }    }else if(val=='2'){    //左下    if(posx -3>=0){      posx = posx -3;          c = 1;    }    if(posy +2<=120){      posy = posy +2;          c = 1;    }    }else if(val=='3'){    //右下    if(posx +3<=120){      posx = posx +3;          c = 1;    }    if(posy +2<=120){      posy = posy +2;          c = 1;    }    }else if(val=='4'){    //上    if(posy -2>=0){      posy = posy -2;          c = 1;    }    }else if(val=='5'){    //左    if(posx -3>=0){      posx = posx -3;          c = 1;    }   }else if(val=='6'){    //右    if(posx +3<=120){      posx = posx +3;          c = 1;    }    }else if(val=='7'){    //下    if(posy +2<=120){      posy = posy +2;          c = 1;    }    }   if(c ==1){    Serial.println("dong");    myservo.write(posx);     myservo1.write(posy);// 给舵机写入角度      }  c = 0;   Serial.println(posx);   Serial.println(val);  } }

上位机(也就是我们的电脑)人脸识别代码:

#!Anaconda/anaconda/pythonimport dlib                     #人脸识别的库dlibimport numpy as np              #数据处理的库numpyimport cv2                      #图像处理的库OpenCvfrom pyfirmata import Arduino, utilimport timeimport serialclass face_emotion():    def __init__(self):        # 使用特征提取器get_frontal_face_detector        self.detector = dlib.get_frontal_face_detector()        # dlib的68点模型,使用作者训练好的特征预测器        self.predictor = dlib.shape_predictor("./shape_predictor_68_face_landmarks.dat")        # 建cv2摄像头对象,这里使用电脑自带摄像头,如果接了外部摄像头,则自动切换到外部摄像头        self.cap = cv2.VideoCapture(0)        # 设置视频参数,propId设置的视频参数,value设置的参数值        self.cap.set(3, 480)        # 截图screenshoot的计数器        self.cnt = 0        self.ser = serial.Serial()        self.ser.baudrate = 9600  # 设置波特率        self.ser.port = "COM5"  # 端口是COM3        self.ser.open()  # 打开串口    def learning_face(self):        # cap.isOpened() 返回true/false 检查初始化是否成功        while(self.cap.isOpened()):            # cap.read()            # 返回两个值:            #    一个布尔值true/false,用来判断读取视频是否成功/是否到视频末尾            #    图像对象,图像的三维矩阵            flag, im_rd = self.cap.read()            # 每帧数据延时1ms,延时为0读取的是静态帧            k = cv2.waitKey(1)            # 取灰度            img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)            # 使用人脸检测器检测每一帧图像中的人脸。并返回人脸数rects            faces = self.detector(img_gray, 0)            # 待会要显示在屏幕上的字体            font = cv2.FONT_HERSHEY_SIMPLEX            # 如果检测到人脸            if len(faces) != 0:                # 对每个人脸都标出68个特征点                for i in range(len(faces)):                    # enumerate方法同时返回数据对象的索引和数据,k为索引,d为faces中的对象                    for k, d in enumerate(faces):                        cv2.rectangle(im_rd, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255))                        fw(self, d.top(), d.bottom(), d.left(), d.right())                        # 计算人脸热别框边长                        self.face_width = d.right() - d.left()                # 标出人脸数                cv2.putText(im_rd, "Faces: "+str(len(faces)), (20,50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)            else:                # 没有检测到人脸                cv2.putText(im_rd, "No Face", (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)            # 窗口显示            cv2.imshow("camera", im_rd)        # 释放摄像头        self.cap.release()        # 删除建立的窗口        cv2.destroyAllWindows()def fw(self, t, b, l, r):    y = (b - t) / 2 + t    x = (r - l) / 2 + l    print(str(t)+"    "+str(b)+"   "+str(l)+"   "+str(r))    print("    " +str(x) + "   " + str(y))    if x-280>=50 and abs(y-300)<=40:        print("右")        self.ser.write(b"5")    elif x - 280 >= 50 and y - 300 >= 40:        print("右下")        self.ser.write(b"2")    elif x - 280 >= 50 and y - 300<=-40:        print("右上")        self.ser.write(b"0")    elif x - 280 <= -50 and abs(y-300)<=40:        print("左")        self.ser.write(b"6")    elif x - 280 <= -50 and y-300<=-40:        print("左上")        self.ser.write(b"1")    elif x - 280 <= -50 and y-300 >= 40:        print("左下")        self.ser.write(b"3")    elif abs(x - 280) <= 50 and y-300>=40:        print("下")        self.ser.write(b"7")    elif abs(x - 280) <= 50 and y-300<=-40:        print("上")        self.ser.write(b"4")if __name__ == "__main__":    my_face = face_emotion()    my_face.learning_face()

idea粘贴代码为什么都在一行_【学园】今天程序员的每一行代码都是未来高达身上的一颗螺丝...相关推荐

  1. laravel改代码没变化_菜鸡程序员是如何写代码的?

    每个程序员都要历经从菜鸡到大牛过程蜕变胡过程.当初大家起点都差不多,工作多年后,有些人依然停留在菜鸡,有些人却已成为大牛,所有的事情,都是一点一滴习惯养成.让我们看看菜鸡程序员是如何写代码的?有可能找 ...

  2. python代码情话_谁说程序员不懂浪漫?代码情书专门为你定制

    今天是520,被很多人称为网络情人节. 说来也怪,从谈恋爱到结婚,每逢情人节前的那个深夜,我都会被沉重的压力折腾的无法入眠. 为什么?因为不知道送什么礼物,不知道用什么样的甜言蜜语才能更有创意. 不是 ...

  3. java程序员标准指法_作为一个程序员,标准指法盲打都不会的该反省一下自己了...

    149 2019-05-23 12:46:50 +08:00 再给这个帖子加一段学术研究的结果. Disputes over advantages There are many other typin ...

  4. 今天创客的每一个创作都是未来变形金刚身上的一颗螺丝

    没错,整整一个半月,日日不停歇,吴工单枪匹马做了个擎天柱,会变成卡车的那位!如上篇文章说的那样,请观众朋友们相信所有的等待都是为了更绚烂的绽放... 吴工五年级的时候大概是1989年,变形金刚席卷了神 ...

  5. android租房软件代码,这几天网上很火的,程序员租房贴出代码

    [Java] 纯文本查看 复制代码import java.util.*; /** * By Zjx on 2018-02-14 11:33. */ public class Tel { public ...

  6. bi工程师和java哪个好_每个好架构师都是一位出色的程序员

    [51CTO独家特稿]架构师,听起来是如此神秘的一个称号.尤其是在开发领域刚入门不久的菜鸟级程序员眼中,架构师都是高手,都是牛人,都是如此高高在上的存在. 不过,在搞了四.五年编程之后,程序员们往往早 ...

  7. java程序员可以只用windos吗_程序员要写多少代码 才能开发一个window操作系统

    开发一个window操作系统需要程序员写多少行代码呢? 微软的Windows系统是伴随我们已久的老朋友了,大多数人都是一代一代Windows的用上来,老用户几乎都形成一个共识,就是微软的系统有一代会很 ...

  8. 你们这些程序员,真得每天都在读代码吗?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 近日,外媒上的一篇文章震惊了我,它赤裸裸地写道:你们这些程序员们,真得每天都在读代码吗?多数 ...

  9. 小学弟问:程序员的工作是不是每天都是敲一天的代码呢?

    大家好,我是小贺. 今天在某乎上看到一个小学弟的问题,不由得想起来刚进大学的小贺,也有过类似天真的想法. 此时工作一年半的小贺学长,好为人师的天性暴露无遗,忍不住怒答一波. 嘿,小学弟,来看看这个! ...

最新文章

  1. 跨区域MPLS TE
  2. 一个妹子的大厂后台面试经验总结
  3. java怎么保存文件_java里数据怎么保存到硬盘或TXT文件里去
  4. 快速迭代的测试人员的思考
  5. Winform中通过NPOI导出Excel的三种方式(HSSFWorkbook,XSSFWorkbook,SXSSFWorkbook)附代码下载
  6. 阿里云明确生态边界:不做SaaS、被集成
  7. python爬取哔哩哔哩视频_Python实现视频爬取下载
  8. [转] 外企面试官最爱提的问题 TOP10
  9. 传智播客python2018_Python视频教程下载-2018传智播客Python视频教程下载-西西软件下载...
  10. vbyone接口引脚定义_USB3.1 Type-C 高速接口设计指南
  11. vsual studio 如何关闭禁止mscorsvw.exe (转)
  12. 如何在WPS文字中插入打勾(叉)方框
  13. 计算机内部如何防止溢出,电脑提示堆栈溢出是什么意思 该怎么解决
  14. app store 注册账号生成证书上传app完整的教程
  15. pdf2html java_pdf2HtmlEX的使用
  16. SHT30使用的学习过程1SHT30工作模式介绍
  17. 非静态成员必须与特定对象相对
  18. 目标检测入坑指南3:VGGNet神经网络
  19. CouchDB的简单使用
  20. mongodb多数据源配置

热门文章

  1. 水晶报表技术(3)——.NET 2005 中动态水晶报表的实现
  2. ehcache 手动刷新缓存_清空DNS缓存的两个小方法
  3. java i o是什么流_Java I/O 流,输入流、输出流
  4. 大工18秋计算机应用基础1,大工18秋《计算机应用基础》在线测试1答案.pdf
  5. 怎么只要小数部分C语言,如何得出一个浮点数的小数部分,要把各个位保存到一个数组里边。...
  6. 经典html,经典 HTML
  7. 大学生计算机考试题题库,大学生统考计算机一级考试试题题库(供参考)
  8. 21天Jenkins打卡Day17-查看Jenkins服务器上的目录结构
  9. java环境安装1359错误_解决The valid characters are defined in RFC 7230 and RFC 3986错误问题...
  10. java this 方法,使用“this”用方法(用Java)