那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何手勢控制鼠標

454398 ? 來源:wv ? 2019-08-30 11:20 ? 次閱讀

步驟1:安裝Anaconda和需要的軟件包

Anaconda本質上是一個包裝精美的Python IDE,隨附了大量有用的軟件包,如NumPy,Pandas,IPython筆記本等似乎在科學界的各個地方都值得推薦。查看Anaconda以安裝它。

所需的軟件包:

PyAutoGUI

OpenCv

安裝上述軟件包:

OpenCV:

點擊此鏈接逐步安裝for opencv

PyAutoGUI:

PyAutoGUI是一個Python模塊,用于以編程方式控制鼠標和鍵盤。

PyAutoGUI可以從 pip 工具中安裝

打開你的anaconda命令提示并粘貼它:

pip install PyAutoGUI

現在我們準備好了代碼。..。..

第2步:技術概述

它本質上是一個程序,它應用圖像處理,檢索必要的數據,并根據預定義的概念將其實現到計算機的鼠標接口。

代碼是用Python編寫的。它使用跨平臺圖像處理模塊OpenCV,并使用Python特定庫PyAutoGUI實現鼠標操作。

處理網絡攝像頭的視頻捕獲,僅提取三個彩色指尖。他們的中心是用矩量法計算的,根據它們的相對位置決定要執行什么動作。

第3步:視頻入門

目標一:

cv2.VideoCapture()

從中捕獲視頻相機

通常,我們必須使用相機捕捉直播。 OpenCV為此提供了一個非常簡單的接口。讓我們從相機中捕捉視頻(我正在使用筆記本電腦的內置網絡攝像頭),將其轉換為灰度視頻并顯示它。入門只是一項簡單的任務。要捕獲視頻,您需要創建一個VideoCapture對象。它的參數可以是設備索引或視頻文件的名稱。設備索引只是指定哪個攝像頭的數量。通常會連接一臺攝像機(如我的情況)。所以我只傳遞0(或-1)。您可以通過傳遞1來選擇第二個攝像頭,依此類推。之后,您可以逐幀捕獲。但最后,不要忘記發布捕獲。

我們要做的第一件事就是將捕獲的視頻轉換為HSV格式。

代碼:

# All packages needed for the program are imported ahead

import cv2

cap = cv2.VideoCapture(0)

while(1):

# Capture frame-by-frame

_, frameinv = cap.read()

# flip horizontaly to get mirror image in camera

frame = cv2.flip( frameinv, 1)

# Our operations on the frame come here

hsv = cv2.cvtColor( frame, cv2.COLOR_BGR2HSV)

# Display the resulting frame

cv2.imshow(‘Frame’, hsv)

k = cv2.waitKey(10) & 0xFF

if k == 27:

break

cap.release()

cv2.destroyAllWindows()

第4步:顏色范圍

目標二:

calibrateColor()

校準顏色范圍

現在,用戶可以分別校準他的三個手指的顏色范圍。這可以通過在程序開頭三次調用 calibrateColor()函數來完成。

用戶也可以選擇使用默認設置。

代碼:

import cv2

import numpy as np

def nothing(x):

pass

# Create a black image, a window

kernel = np.zeros((300,512,3), np.uint8)

name = ‘Calibrate’

cv2.namedWindow(name)

# create trackbars for color change

cv2.createTrackbar(‘Hue’, name, 0, 255, nothing)

cv2.createTrackbar(‘Sat’, name, 0, 255, nothing)

cv2.createTrackbar(‘Val’, name, 0, 255, nothing)

# create switch for ON/OFF functionality

switch = ‘0 : OFF 1 : ON’

cv2.createTrackbar(switch, name,0,1,nothing)

while(1):

cv2.imshow(name,kernel)

k = cv2.waitKey(1) & 0xFF

if k == 27:

break

# get current positions of four trackbars

hue = cv2.getTrackbarPos(‘Hue’, name)

sat = cv2.getTrackbarPos(‘Sat’, name)

val = cv2.getTrackbarPos(‘Val’, name)

s = cv2.getTrackbarPos(switch,name)

if s == 0:

kernel[:] = 0

else:

kernel[:] = [hue,sat,val]

cv2.destroyAllWindows()

第5步:刪除噪音&在視頻源中定義函數

取決于校準,只使用 cv2.inRange()功能逐一從視頻中提取三個指尖。為了消除視頻輸入中的噪聲,我們應用兩步態射,即侵蝕和擴張。 然后發送程序中稱為掩碼的噪聲濾波圖像以定位中心。

# cv2.inRange function is used to filter out a particular color from the frame

# The result then undergoes morphosis i.e. erosion and dilation

# Resultant frame is returned as mask

def makeMask(hsv_frame, color_Range):

mask = cv2.inRange( hsv_frame, color_Range[0], color_Range[1])

# Morphosis next 。..

eroded = cv2.erode( mask, kernel, iterations=1)

dilated = cv2.dilate( eroded, kernel, iterations=1)

return dilated

三個中心的位置包括:

在與該顏色范圍相關的遮罩中查找輪廓。

使用區域過濾器丟棄不相關區域的輪廓。

在剩余的輪廓中找到最大的輪廓,并應用力矩的方法找到它的中心。

然后是定義光標在屏幕上的位置的步驟。黃色的拇指負責光標的位置。為此目的使用了以下技術:

?通常我們使用的網絡攝像頭以640x480像素的分辨率捕獲視頻。假設此幀線性映射到1920x1080像素顯示屏幕。如果我們有一個慣用右手的用戶,他會發現與右邊緣相比,訪問屏幕的左邊緣會感覺不舒服。訪問屏幕的底部也會在手腕處產生壓力。

我們意識到,不是將整個視頻幀映射到屏幕,我們寧愿考慮更偏向右側的矩形子部分(考慮右手用戶)和幀的上部以便改進安慰。測量480x270像素的子部分然后以比例因子4線性映射到屏幕。

# Contours on the mask are detected.。 Only those lying in the previously set area

# range are filtered out and the centroid of the largest of these is drawn and returned

def drawCentroid(vid, color_area, mask, showCentroid):

contour, _ = cv2.findContours( mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

l=len(contour)

area = np.zeros(l)

# filtering contours on the basis of area rane specified globally

for i in range(l):

if cv2.contourArea(contour[i])》color_area[0] and cv2.contourArea(contour[i])

# bringing contours with largest valid area to the top

for i in range(l):

for j in range(1):

if area[i] == a[j]:

swap( contour, i, j)

if l 》 0 :

# finding centroid using method of ‘moments’

M = cv2.moments(contour[0])

if M[‘m00’] != 0:

cx = int(M[‘m10’]/M[‘m00’])

cy = int(M[‘m01’]/M[‘m00’])

center = (cx,cy)

if showCentroid:

cv2.circle( vid, center, 5, (0,0,255), -1)

return center

else:

# return error handling values

return (-1,-1)

?由于網絡攝像頭捕獲的噪聲和手中的振動,中心保持不變圍繞一個平均位置振動。在按比例放大時,這些振動會對光標位置的準確性產生很多問題。為了減少光標中的抖動,我們使用光標的差分位置分配。我們將新中心與光標的先前位置進行比較。如果差異小于5個像素,則通常是由于噪聲。因此,新光標位置更傾向于前一個。但是,先前位置和新中心的較大差異被視為自愿移動,新光標位置設置為接近新中心。有關詳細信息,請通過代碼中的setCursorPosition()函數。

‘’‘

This function takes as input the center of yellow region (yc) and

the previous cursor position (pyp)。 The new cursor position is calculated

in such a way that the mean deviation for desired steady state is reduced.

’‘’

def setCursorPos( yc, pyp):

yp = np.zeros(2)

if abs(yc[0]-pyp[0])《5 and abs(yc[1]-pyp[1])《5:

yp[0] = yc[0] + .7*(pyp[0]-yc[0])

yp[1] = yc[1] + .7*(pyp[1]-yc[1])

else:

yp[0] = yc[0] + .1*(pyp[0]-yc[0])

yp[1] = yc[1] + .1*(pyp[1]-yc[1])

return yp

現在發送三個中心,根據

的相對位置決定需要執行哪些操作。這是在代碼中的chooseAction()函數中完成的。根據其輸出,performAction()函數使用PyAutoGUI庫執行以下任一操作:

自由光標移動

左鍵單擊

右鍵單擊

拖動/選擇

向上滾動

向下滾動

# Depending upon the relative positions of the three centroids, this function chooses whether

# the user desires free movement of cursor, left click, right click or dragging

def chooseAction(yp, rc, bc):

out = np.array([‘move’, ‘false’])

if rc[0]!=-1 and bc[0]!=-1:

if distance(yp,rc)《50 and distance(yp,bc)《50 and distance(rc,bc)《50 :

out[0] = ‘drag’

out[1] = ‘true’

return out

elif distance(rc,bc)《40:

out[0] = ‘right’

return out

elif distance(yp,rc)《40:

out[0] = ‘left’

return out

elif distance(yp,rc)》40 and rc[1]-bc[1]》120:

out[0] = ‘down’

return out

elif bc[1]-rc[1]》110:

out[0] = ‘up’

return out

else:

return out

else:

out[0] = -1

return out def performAction( yp, rc, bc, action, drag, perform):

if perform:

cursor[0] = 4*(yp[0]-110)

cursor[1] = 4*(yp[1]-120)

if action == ‘move’:

if yp[0]》110 and yp[0]《590 and yp[1]》120 and yp[1]《390:

pyautogui.moveTo(cursor[0],cursor[1])

elif yp[0]《110 and yp[1]》120 and yp[1]《390:

pyautogui.moveTo( 8 , cursor[1])

elif yp[0]》590 and yp[1]》120 and yp[1]《390:

pyautogui.moveTo(1912, cursor[1])

elif yp[0]》110 and yp[0]《590 and yp[1]《120:

pyautogui.moveTo(cursor[0] , 8)

elif yp[0]》110 and yp[0]《590 and yp[1]》390:

pyautogui.moveTo(cursor[0] , 1072)

elif yp[0]《110 and yp[1]《120:

pyautogui.moveTo(8, 8)

elif yp[0]《110 and yp[1]》390:

pyautogui.moveTo(8, 1072)

elif yp[0]》590 and yp[1]》390:

pyautogui.moveTo(1912, 1072)

else:

pyautogui.moveTo(1912, 8)

elif action == ‘left’:

pyautogui.click(button = ‘left’)

elif action == ‘right’:

pyautogui.click(button = ‘right’)

time.sleep(0.3)

elif action == ‘up’:

pyautogui.scroll(5)

# time.sleep(0.3)

elif action == ‘down’:

pyautogui.scroll(-5)

# time.sleep(0.3)

elif action == ‘drag’ and drag == ‘true’:

global y_pos

drag = ‘false’

pyautogui.mouseDown()

while(1):

k = cv2.waitKey(10) & 0xFF

changeStatus(k)

_, frameinv = cap.read()

# flip horizontaly to get mirror image in camera

frame = cv2.flip( frameinv, 1)

hsv = cv2.cvtColor( frame, cv2.COLOR_BGR2HSV)

b_mask = makeMask( hsv, blue_range)

r_mask = makeMask( hsv, red_range)

y_mask = makeMask( hsv, yellow_range)

py_pos = y_pos

b_cen = drawCentroid( frame, b_area, b_mask, showCentroid)

r_cen = drawCentroid( frame, r_area, r_mask, showCentroid)

y_cen = drawCentroid( frame, y_area, y_mask, showCentroid)

if py_pos[0]!=-1 and y_cen[0]!=-1:

y_pos = setCursorPos(y_cen, py_pos)

performAction(y_pos, r_cen, b_cen, ‘move’, drag, perform)

cv2.imshow(‘Frame’, frame)

if distance(y_pos,r_cen)》60 or distance(y_pos,b_cen)》60 or distance(r_cen,b_cen)》60:

break

pyautogui.mouseUp()

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鼠標
    +關注

    關注

    6

    文章

    591

    瀏覽量

    39909
  • 手勢控制
    +關注

    關注

    4

    文章

    44

    瀏覽量

    21839
收藏 人收藏

    評論

    相關推薦

    無線鼠標是怎么工作的

    無線鼠標慢慢成了現在辦公電腦的標配,從此再也不用拖著長長的線跑來跑去了。可是,無線鼠標是怎么工作的呢?今天我們一起來學習一下
    的頭像 發表于 11-15 09:52 ?574次閱讀
    無線<b class='flag-5'>鼠標</b>是怎么工作的

    適用于無線鼠標與藍牙鼠標中的晶振FA-238/FA-238V

    隨著現代科技的發展,無線技術在我們的日常生活中扮演著越來越重要的角色,特別是在電腦外設領域,無線鼠標已經成為許多用戶的首選。無線鼠標通過無線信號與電腦通信,擺脫了線纜的束縛,提供了更自由的操作
    的頭像 發表于 09-13 16:35 ?327次閱讀
    適用于無線<b class='flag-5'>鼠標</b>與藍牙<b class='flag-5'>鼠標</b>中的晶振FA-238/FA-238V

    NXP 恩智浦 電競鼠標方案集錦

    基于NXPMCULPC5516、LPC5528、QN9080開發的電競鼠標方案集錦。首先,大家都知道,目前電競鼠標市場上,根據和PC的連接方式上的不同分為有線和無線兩種,而無線連接又分為BLE協議
    的頭像 發表于 08-08 08:27 ?546次閱讀
    NXP 恩智浦 電競<b class='flag-5'>鼠標</b>方案集錦

    請問lsm6dsv16x可以直接讀取觸摸手勢嗎?

    已經讀出來了LSM6DSV16x的QVRmv值,也寫出了單擊的狀態機。但是在寫觸摸滑動手勢時沒有找到好的計算方式。請問是不是有直接讀出這些手勢的函數?
    發表于 07-02 08:14

    鴻蒙ArkTS聲明式開發:跨平臺支持列表 組合手勢

    手勢識別組合,即多種手勢組合為復合手勢,支持連續識別、并行識別和互斥識別。
    的頭像 發表于 06-19 09:33 ?466次閱讀
    鴻蒙ArkTS聲明式開發:跨平臺支持列表 組合<b class='flag-5'>手勢</b>

    鴻蒙ArkTS聲明式開發:跨平臺支持列表【綁定手勢方法】 手勢處理

    為組件綁定不同類型的手勢事件,并設置事件的響應方法。
    的頭像 發表于 06-15 09:17 ?880次閱讀
    鴻蒙ArkTS聲明式開發:跨平臺支持列表【綁定<b class='flag-5'>手勢</b>方法】 <b class='flag-5'>手勢</b>處理

    基于毫米波雷達的手勢識別算法

    新的無線電接入標準,而且是一種潛在的傳感工具。毫米波手勢識別的研究已經取得了許多成果。在實際應用層面,它可以用于汽車行業,以提供 為駕駛員提供安全直觀的控制界面。然而,并不是所有坐在車內的乘客的手勢
    發表于 06-05 19:09

    基于毫米波雷達的手勢識別神經網絡

    了模型的泛化能力,降低了過度擬合的風險??傊?,這種TCN結構有效地從RFDM序列中提取時間特征,同時保持較低的網絡復雜度和訓練負擔。 數據 手勢識別在智能大屏控制中發揮著至關重要的作用,實現了無接觸
    發表于 05-23 12:12

    放下你手中的游戲鼠標 | 小白測功耗

    上一期我們測試了合宙辦公室常用的辦公鼠標,這一期我們測試游戲鼠標!小白對游戲鼠標的刻板印象:發光/狂拽酷炫但這次選的兩款熱門游戲鼠標卻不一樣外表低調,握感很棒(羅技G304是purpl
    的頭像 發表于 05-13 17:09 ?1703次閱讀
    放下你手中的游戲<b class='flag-5'>鼠標</b> | 小白測功耗

    OpenHarmony實戰開發-手勢事件

    手勢表示由單個或多個事件識別的語義動作(例如:點擊、拖動和長按)。一個完整的手勢也可能由多個事件組成,對應手勢的生命周期。支持的事件有:
    的頭像 發表于 04-29 13:57 ?428次閱讀

    基于FPGA技術的手勢識別控制型多功能機械臂系統

    首先通過圖像采集設備來獲取手勢圖像,通過手勢建模將獲取的手勢圖像用數學模型描述出來,最后根據得到的手勢識別所需要的模型參量判別出具體的手勢
    發表于 04-27 11:21 ?1375次閱讀

    HarmonyOS開發實例:【手勢截屏】

    基于手勢處理和截屏能力,介紹了手勢截屏的實現過程。樣例主要包括以下功能
    的頭像 發表于 04-11 22:38 ?607次閱讀
    HarmonyOS開發實例:【<b class='flag-5'>手勢</b>截屏】

    【開源獲獎案例】隔空手勢識別測試系統

    按鍵,只需將手貼近傳感器即可進入菜單系統控制屏幕,實現上、下、左、右、貼近、遠離、左旋轉、右旋轉、揮手9種手勢效果
    的頭像 發表于 03-16 08:12 ?664次閱讀
    【開源獲獎案例】隔空<b class='flag-5'>手勢</b>識別測試系統

    無線鼠標的FCC認證難點有哪些?

    無線鼠標的FCC認證是確保該產品在美國市場合規銷售的重要要求。然而,該認證過程可能面臨一些難點和挑戰。下面將對無線鼠標FCC認證的難點進行分析,并介紹其主要困擾。首先,無線鼠標的FCC認證難點之一
    的頭像 發表于 03-04 17:39 ?463次閱讀
    無線<b class='flag-5'>鼠標</b>的FCC認證難點有哪些?

    Apple Watch或新增動作識別手勢:可感應用戶動作,實現手勢輸入

    此外,美國商標和專利局近日公示的清單顯示,蘋果已獲授《來自可穿戴設備的動作和手勢輸入》的專利,編號 US 11914772 B2,揭示蘋果正在挖掘更多有關 Apple Watch 的手勢可能性。
    的頭像 發表于 02-29 11:24 ?986次閱讀
    百家乐追号| 有百家乐官网的棋牌游戏| 保单百家乐游戏机| 六合彩开奖查询| 线上百家乐官网怎么玩| tt娱乐城备用网址| 百家乐加牌规则| 金濠国际网| 3U百家乐娱乐城| 新和县| ea百家乐打水| 百家乐官网三号的赢法| 机械百家乐技巧| 百家乐官网棋牌游戏源码| 百家乐追号| 新天地百家乐官网的玩法技巧和规则 | 属鸡和属猪做生意好吗| 六合彩开奖历史记录| 澳门百家乐网址| 韶关市| 网络百家乐打揽| 百家乐官网只打一种牌型| 威尼斯人娱乐城--老品牌值得您信赖| 百家乐官网关台| 大发888 打法888游戏| 做生意怎样看风水| 赌百家乐官网赢的奥妙| 百家乐图形的秘密破解| 粤港澳百家乐官网娱乐| 优博开户| 宝马会百家乐的玩法技巧和规则| 真人百家乐官网导航| 大发888游戏平台hgx2dafa888gw| 娱乐网百家乐官网补丁| 明陞M88娱乐城| A8百家乐娱乐场| 试玩百家乐官网1000| 新乐界娱乐城| 新加坡百家乐规则| 百家乐开户代理| 百家乐官网桌子北京|