项目缘由与总结
手机上的Timberman游戏被朋友挑战,无奈只能达到300多分,突发奇想做一个自动化的系统来替代人进行操作,反超朋友记录
Timberman游戏规则简单,应该很轻松就能做出一套系统来实现自动化操作,况且机器毕竟是机器,依赖于算法做出的判断基本不会出错。
但是实践下来,遇到了不少问题,最终这套系统没有按照理想的情况运行下去,原因如下
1. 树莓派处理速度不够理想,无法瞬间得出运算结果
2. 手里只有盛辉MG995型舵机,实在是大材小用,树莓派也不能很好的进行驱动,也没有单独为他购置一套设备
3. 常规电容笔的工作是依赖于传递人手的电容进行工作的
4. 准备着手准备毕业设计,这个小东西只能暂时搁置了
等将来入手性能更加强大的树莓派2之后,再重启这个小项目吧,下面简单记录一下这个小东西
设备图片
实现思路
- 获取图像
- 切割
- 灰度化
- 与标准图进行对比
- 判断相似度
- 做出响应
工具
- 树莓派及摄像头
- 一个稳定的支撑平台
- Python Imaging Library 库(简称pil库)
源代码
源代码十分简单,都是直接调用pil库的函数直接运行,舵机因为硬件问题调试的不是很完美,等着以后有了新装备再来完善
#!/usr/bin/python
#coding: utf8
import math
import os
import operator
import time
import signal
import atexit
#import cv2.cv as cv
import RPi.GPIO as GPIO
from PIL import Image
atexit.register(GPIO.cleanup)
servopin = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servopin, GPIO.OUT, initial=False)
p = GPIO.PWM(servopin,50) #50HZ
while (True):
os.system(‘fswebcam -r 320×240 -d /dev/video0 -p yuyv -S 5 /root/timberman/testpictire.jpg‘)
time.sleep(0.5)
takeimg = Image.open(‘testpictire.jpg‘)#打开图片
region = (50,50,150,220) #设置切割接线
ctake = takeimg.crop(region) #切割
Lctake = ctake.convert(‘L‘) #灰度化
Lctake.save(‘fintest.jpg‘)
standimage = Image.open(‘Lstand.jpg‘)
h1 = Lctake.histogram()
h2 = standimage.histogram()
rms = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1) )
if rms<1000:
#p = GPIO.PWM(servopin,50) #50HZ
p.start(0)
for i in range(0,181,5):
p.ChangeDutyCycle(2.5 + 10 * i / 180) #设置转动角度
time.sleep(0.02) #等该20ms周期结束
p.ChangeDutyCycle(0) #归零信号
else:
#p = GPIO.PWM(servopin,50) #50HZ
p.start(0)
for i in range(181,0,-5):
p.ChangeDutyCycle(2.5 + 10 * i / 180) #设置转动角度
time.sleep(0.02) #等该20ms周期结束
p.ChangeDutyCycle(0) #归零信号
后期需要改进项
- 优化代码
- 调整舵机可控性
- 针对不同场景建立大量标准图,对各个场景进行优化,增加判断准确度
- 提高程序运行响应速度甚至考虑通过Arduino控制将项目移植到电脑上,通过PC进行运算
- 研究一下如何优雅的让电容笔工作
时间: 2024-10-13 01:06:56