環境是 Python27
需要下載庫:
pygame 處理幀
http://www.lfd.uci.edu/~gohlke/pythonlibs/bpchanvi/pygame-1.9.2pre.win-amd64-py2.7.exe
VideoCature取得攝像頭圖像
http://www.lfd.uci.edu/~gohlke/pythonlibs/bpchanvi/VideoCapture-0.9.5.win-amd64-py2.7.exe
PIL python Image Lib 圖像處理,最基礎的依賴包
http://www.lfd.uci.edu/~gohlke/pythonlibs/bpchanvi/PIL-1.1.7.win-amd64-py2.7.exe
先來個攝像頭截取的代碼(從DEMO中摳出來的)
1 import VideoCapture 2 3 cam = VideoCapture.Device(devnum=0) 4 cam.saveSnapshot('test.jpg', quality=75, timestamp=3, boldfont=1)
然后是比較復雜的連續從攝像頭中取得視頻流,把原有的DEMO代碼加了注釋調整了下順序
1 #coding=utf-8 2 from VideoCapture import Device 3 import ImageDraw, sys, pygame, time 4 from pygame.locals import * 5 from PIL import ImageEnhance 6 7 # 設置窗口、攝像頭分辨率 8 res = (640,480) 9 10 # 初始化窗口 11 pygame.init() 12 pygame.display.set_caption('Webcam') 13 pygame.font.init() 14 15 screen = pygame.display.set_mode((640,480)) 16 font = pygame.font.SysFont("Courier",11) 17 18 # 取得攝像頭設備,設置分辨率 19 cam = Device() 20 cam.setResolution(res[0],res[1]) 21 22 # 顯示文字信息函數 23 def disp(phrase,loc): 24 s = font.render(phrase, True, (200,200,200)) 25 sh = font.render(phrase, True, (50,50,50)) 26 screen.blit(sh, (loc[0]+1,loc[1]+1)) 27 screen.blit(s, loc) 28 29 # 亮度,對比度 30 brightness = 1.0 31 contrast = 1.0 32 # 截圖計數器 33 shots = 0 34 35 while 1: 36 camshot = ImageEnhance.Brightness(cam.getImage()).enhance(brightness) 37 camshot = ImageEnhance.Contrast(camshot).enhance(contrast) 38 for event in pygame.event.get(): 39 if event.type == pygame.QUIT: sys.exit() 40 keyinput = pygame.key.get_pressed() 41 # 快捷鍵處理,調節亮度對比度 42 if keyinput[K_1]: brightness -= .1 43 if keyinput[K_2]: brightness += .1 44 if keyinput[K_3]: contrast -= .1 45 if keyinput[K_4]: contrast += .1 46 # 呼出調試 47 if keyinput[K_q]: cam.displayCapturePinProperties() 48 if keyinput[K_w]: cam.displayCaptureFilterProperties() 49 # 截圖保存,shots為計數器 50 if keyinput[K_s]: 51 filename = str(time.time()) + ".jpg" 52 cam.saveSnapshot(filename, quality=80, timestamp=0) 53 shots += 1 54 # 從攝像頭中取得圖像 55 camshot = pygame.image.frombuffer(camshot.tostring(), res, "RGB") 56 screen.blit(camshot, (0,0)) 57 disp("S:" + str(shots), (10,4)) 58 disp("B:" + str(brightness), (10,16)) 59 disp("C:" + str(contrast), (10,28)) 60 # 填充圖像 61 pygame.display.flip()
自己是准備處理圖像,把截屏出來的那個圖片,取得邊緣。
1 import Image 2 import ImageFilter 3 img = Image.open('test.jpg') 4 new_img = img.filter(ImageFilter.FIND_EDGES) 5 new_img.save('test2.jpg')
原本的想法是從攝像頭中取得圖像進行分析,分析眼動來替代鼠標的位置。不過取出的視頻精度顯然很低。看來這個要以來高精度的攝像頭,高精度的攝像頭帶來的問題就是處理的速度降低。
同時,攝像頭在本本上,來定位腦袋、眼球、筆記本、攝像頭,轉換為屏幕上的鼠標軌跡,顯然有點困難。不過在家里面做個體感的游戲還湊合。
整體上看,