嘗試實現手勢控制計算機(持續跟進)

2022-08-27 04:39:11 字數 3915 閱讀 8493

基於語言python,主要運用的包有cv2等

1.在python中實現攝像頭的影象獲取

安裝opencv:

1. 安裝依賴

pip install --upgrade setuptools

pip install numpy matplotlib

2.安裝opencv python版

pip install opencv-python

實現攝像頭影象獲取**

#-*- coding:utf-8 -*-

import cv2

import time

cap = cv2.videocapture(0)#調取攝像頭,0表示系統預設攝像頭

while true:

ret,photo = cap.read()#讀取影象

cv2.imshow('please take our photo!',photo)#將影象傳送自視窗

key = cv2.waitkey(2)#設定等待時間,若為0影象定格

if key == ord(" "):#輸入空格截圖

filename = time.strftime('%y%m%d-%h%m%s')+".jpg"#檔名為當前時間

cv2.imwrite(filename,photo)#儲存位置

if key == ord('q'):#輸入q退出

break

3.第一次嘗試

想用去背景後獲取二值影象,然後檢測凸包的方式來識別手勢,效果很差

實時去掉背景**

比對手勢形狀**(完全行不通)

# -*- coding:utf-8 -*-

import numpy as np

import cv2

from matplotlib import pyplot as plt

im = cv2.imread('test1.jpg')#需要識別的圖

im2 = cv2.imread('ex2.jpg')#標準例圖

kernel = cv2.getstructuringelement(cv2.morph_ellipse,(3,3))#3*3的橢圓核

img = cv2.cvtcolor(im,cv2.color_bgr2gray)#用這個方式轉換的原因是最後輸出時希望能看到彩色的的輪廓圖

img2 = cv2.cvtcolor(im2,cv2.color_bgr2gray)

ret,thresh = cv2.threshold(img,127,255,0)

ret,thresh2 = cv2.threshold(img2,127,255,0)#將影象二值化

dst = cv2.morphologyex(thresh,cv2.morph_open,kernel)

dst2 = cv2.morphologyex(thresh2,cv2.morph_open,kernel)#將影象進行開運算

img,contours,hierarchy = cv2.findcontours(dst,1,2)

max = 0

maxl = -1

for i in range(len(contours)):

if cv2.contourarea(contours[i]) > max :

max = cv2.contourarea(contours[i])

maxl = i

print(maxl)

print(len(contours))

cnt = contours[maxl]#找到需識別圖中最大的輪廓,即手的輪廓

img,contours,hierarchy = cv2.findcontours(dst2,1,2)

cnt2 = contours[len(contours)-1]#對照例圖中手的輪廓

cv2.drawcontours(im,[cnt],0,(0,255,0),3)

ret = cv2.matchshapes(cnt,cnt2,1,0.0)

print(ret)#將兩輪廓進行比對

# cv2.imshow('img',img)

# cv2.imshow('thresh',thresh)

cv2.imshow('im',im)

cv2.waitkey(0)

識別凸包**(準確度低)

kernel = cv2.getstructuringelement(cv2.morph_ellipse,(3,3))#3*3的橢圓核

img = cv2.cvtcolor(im,cv2.color_bgr2gray)#用這個方式轉換的原因是最後輸出時希望能看到彩色的的輪廓圖

ret,thresh = cv2.threshold(img,127,255,0)

dst = cv2.morphologyex(thresh,cv2.morph_open,kernel)

img,contours,hierarchy = cv2.findcontours(dst,1,2)

max = 0

maxl = -1

for i in range(len(contours)):

if cv2.contourarea(contours[i]) > max :

max = cv2.contourarea(contours[i])

maxl = i

print(maxl)

print(len(contours))

cnt = contours[maxl]#找到需識別圖中最大的輪廓,即手的輪廓

#顯示凸包

hull = cv2.convexhull(cnt,returnpoints=true)

print(hull)

cv2.polylines(im, [hull], true, (0, 255, 0), 2)

#凸性檢測

# hull = cv2.convexhull(cnt,returnpoints=false)

# defect = cv2.convexitydefects(cnt,hull)

## for i in range(defect.shape[0]):

# s,e,f,d = defect[i,0]

# start = tuple(cnt[s][0])

# end = tuple(cnt[e][0])

# far = tuple(cnt[f][0])

# # cv2.line(im,start,end,[0,255,0],2)

# # cv2.circle(im,start,5,[0,0,255],-1)

# # cv2.circle(im,end,5,[0,0,255],-1)

# cv2.circle(im,far,5,[0,0,255],-1)

m = cv2.moments(cnt)

cx = int(m['m10']/m['m00'])

cy = int(m['m01']/m['m00'])

cv2.circle(im,(cx,cy),5,[0,0,255],-1)

cv2.imshow('img',im)

cv2.waitkey(0)

分析原因,是因為

1)背景雜質太多,且由於使用了筆記本自帶攝像頭,無法單獨識別到手

2)光線不均勻,導致背景減除時無法準確識別到整個手的完整輪廓

綜上,該方法在要求實現條件更為廣泛的情況下不太行得通

計算機色彩控制

我們軟體工程導論的授課老師講到 計算機只會0101地執行人們的命令。不對!那只是cpu該幹的事,一台完整的pc可不僅僅只有cpu,音效卡 音響,顯示卡 顯示器,都是一台計算機該有的裝置。那麼cpu 0101的二進位制制訊號是如何控制色彩和聲音的呢?首先讓我們來了解一下計算機 顯示 顯示卡 全稱顯示介...

實現計算機

實現乙個計算器 實現兩個運算元 小數和整數均可 的加 減 乘 除 清零操作。1.加法運算 2.減法運算 3.乘法運算 4.除法運算 64 16 4 using system using system.collections.generic using system.componentmodel us...

大話計算機 計算機系統 硬體 控制器

運算器只能完成運算,而如何保證這些運算的正確執行,以及出錯了如何處理它等這些,都需要控制器來控制。控制器用於控制cpu的工作,它決定了計算機執行的過程的自動化。控制器主要由指令 時序 匯流排和中斷等控制邏輯組成。用一張思維導圖概括更直觀些。下面主要介紹控制器中的指令控制邏輯。當cpu 在執行一條指令...