<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
學校宿舍今天搬家,累麻了,突然發現展示處理的也很粗糙,就這樣吧嘿嘿~~~
1、openCV讀取視訊流、在每一幀圖片上畫一個矩形。
2、使用mediapipe獲取手指關鍵點座標。
3、根據手指座標位置和矩形的座標位置,判斷手指點是否在矩形上,如果在則矩形跟隨手指移動。
環境準備:
python: 3.8.8
opencv: 4.2.0.32
mediapipe: 0.8.10.1
注:
1、opencv版本過高或過低可能出現一些如攝像頭打不開、閃退等問題,python版本影響opencv可選擇的版本。
2、pip install mediapipe 後可能導致openCV無法正常使用,卸了重新下載,習慣了就好。
import cv2 import time import numpy as np # 呼叫攝像頭 0 預設攝像頭 cap = cv2.VideoCapture(0) # 初始方塊資料 x = 100 y = 100 w = 100 h = 100 # 讀取一幀幀照片 while True: # 返回frame圖片 rec,frame = cap.read() # 映象 frame = cv2.flip(frame,1) # 畫矩形 cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 255), -1) # 顯示畫面 cv2.imshow('frame',frame) # 退出條件 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
這是很基礎的一步操作,此時我們執行這段程式碼,攝像頭開啟,我們會驚訝地看到自己英俊的臉龐,且左上角有個100*100的紫色矩形。
pip install mediapipe
此時可能出現一些問題,比如openCV突然用不了了,沒關係,解除安裝了重新下。
mediapipe詳細資訊:Hands - mediapipe (google.github.io)
簡單來說,它會返回給我們21個手指關鍵點的座標,即它在視訊畫面的位置比例( 0~1 ),我們乘以對應畫面的寬高,就能得到手指對應的座標了。
本次用到食指和中指指尖,也就是8號和12號。
2.1 設定一些基礎資訊
import cv2 import time import numpy as np import mediapipe as mp mp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solutions.drawing_styles mp_hands = mp.solutions.hands hands = mp_hands.Hands( static_image_mode=True, max_num_hands=2, min_detection_confidence=0.5)
2.2 在處理每一幀影象時,加入
frame.flags.writeable = False frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 返回結果 results = hands.process(frame) frame.flags.writeable = True frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
當我們在視訊流中讀取每一幀圖片時,將其從BGR轉為RGB供給mediapipe生成的hands物件讀取,它會返回這張圖片中手指關鍵點的資訊,我們只需要繼續對其作畫,畫在每一幀圖片上。
# 如果結果不為空 if results.multi_hand_landmarks: # 遍歷雙手(根據讀取順序,一隻隻手遍歷、畫畫) for hand_landmarks in results.multi_hand_landmarks: mp_drawing.draw_landmarks( frame, hand_landmarks, mp_hands.HAND_CONNECTIONS, mp_drawing_styles.get_default_hand_landmarks_style(), mp_drawing_styles.get_default_hand_connections_style())
2.3 至此步驟完整程式碼
import cv2 import time import numpy as np import mediapipe as mp mp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solutions.drawing_styles mp_hands = mp.solutions.hands hands = mp_hands.Hands( static_image_mode=True, max_num_hands=2, min_detection_confidence=0.5) # 呼叫攝像頭 0 預設攝像頭 cap = cv2.VideoCapture(0) # 方塊初始陣列 x = 100 y = 100 w = 100 h = 100 # 讀取一幀幀照片 while True: # 返回frame圖片 rec,frame = cap.read() # 映象 frame = cv2.flip(frame,1) frame.flags.writeable = False frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 返回結果 results = hands.process(frame) frame.flags.writeable = True frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) # 如果結果不為空 if results.multi_hand_landmarks: # 遍歷雙手(根據讀取順序,一隻隻手遍歷、畫畫) # results.multi_hand_landmarks n雙手 # hand_landmarks 每隻手上21個點資訊 for hand_landmarks in results.multi_hand_landmarks: mp_drawing.draw_landmarks( frame, hand_landmarks, mp_hands.HAND_CONNECTIONS, mp_drawing_styles.get_default_hand_landmarks_style(), mp_drawing_styles.get_default_hand_connections_style()) # 畫矩形 cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 255), -1) # 顯示畫面 cv2.imshow('frame',frame) # 退出條件 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
此時我們執行看一下還挺有意思的:
我們這個實驗要求拖動方塊,那肯定也有不拖動的時候,因此不妨根據上一步獲取食指(8)和中指(12)指尖的位置,如果這倆離得近,我們就在他與方塊重合的時候,根據手指的位置改變方塊的座標。
import cv2 import time import math import numpy as np import mediapipe as mp # mediapipe設定 mp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solutions.drawing_styles mp_hands = mp.solutions.hands hands = mp_hands.Hands( static_image_mode=True, max_num_hands=2, min_detection_confidence=0.5) # 呼叫攝像頭 0 預設攝像頭 cap = cv2.VideoCapture(0) # cv2.namedWindow("frame", 0) # cv2.resizeWindow("frame", 960, 640) # 獲取畫面寬度、高度 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 方塊初始陣列 x = 100 y = 100 w = 100 h = 100 L1 = 0 L2 = 0 on_square = False square_color = (0, 255, 0) # 讀取一幀幀照片 while True: # 返回frame圖片 rec,frame = cap.read() # 映象 frame = cv2.flip(frame,1) frame.flags.writeable = False frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 返回結果 results = hands.process(frame) frame.flags.writeable = True frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) # 如果結果不為空 if results.multi_hand_landmarks: # 遍歷雙手(根據讀取順序,一隻隻手遍歷、畫畫) # results.multi_hand_landmarks n雙手 # hand_landmarks 每隻手上21個點資訊 for hand_landmarks in results.multi_hand_landmarks: mp_drawing.draw_landmarks( frame, hand_landmarks, mp_hands.HAND_CONNECTIONS, mp_drawing_styles.get_default_hand_landmarks_style(), mp_drawing_styles.get_default_hand_connections_style()) # 記錄手指每個點的x y 座標 x_list = [] y_list = [] for landmark in hand_landmarks.landmark: x_list.append(landmark.x) y_list.append(landmark.y) # 獲取食指指尖 index_finger_x, index_finger_y = int(x_list[8] * width),int(y_list[8] * height) # 獲取中指 middle_finger_x,middle_finger_y = int(x_list[12] * width), int(y_list[12] * height) # 計算兩指尖距離 finger_distance = math.hypot((middle_finger_x - index_finger_x), (middle_finger_y - index_finger_y)) # 如果雙指合併(兩之間距離近) if finger_distance < 60: # X座標範圍 Y座標範圍 if (index_finger_x > x and index_finger_x < (x + w)) and ( index_finger_y > y and index_finger_y < (y + h)): if on_square == False: L1 = index_finger_x - x L2 = index_finger_y - y square_color = (255, 0, 255) on_square = True else: # 雙指不合並/分開 on_square = False square_color = (0, 255, 0) # 更新座標 if on_square: x = index_finger_x - L1 y = index_finger_y - L2 # 影象融合 使方塊不遮擋視訊圖片 overlay = frame.copy() cv2.rectangle(frame, (x, y), (x + w, y + h), square_color, -1) frame = cv2.addWeighted(overlay, 0.5, frame, 1 - 0.5, 0) # 顯示畫面 cv2.imshow('frame',frame) # 退出條件 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
到此這篇關於Python+OpenCV實戰之拖拽虛擬方塊的實現的文章就介紹到這了,更多相關Python OpenCV拖拽虛擬方塊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45