<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
OpenCV 徹底改變了整個影象處理領域。從影象分類到物件檢測,我們不僅可以使用 OpenCV 庫做一些很酷的事情,而且還可以構建一流的應用程式。
今天我們要實現一個有趣的東西,它是手機或電腦中的一種功能,即影象縮放。但在這裡,它將是實時對幀上所需的影象進行虛擬縮放。
對於這個專案,我們將使用 OpenCV 庫和另一個名為 Cvzone 的庫來使用虛擬縮放。
CVZone
它是一個建立在 OpenCV 和 MediaPipe 之上的庫。它使事情變得容易得多。
CVZone 具有一些非常有用的內建功能,例如手部跟蹤、面部標誌檢測、姿勢估計等等。這些都可以通過幾行程式碼來完成。
讓我們編寫一段程式碼來看看使用 CVZone 的手部檢測器的演示。首先,安裝 requirements 。你可以使用以下命令安裝它,也可以逐個安裝。
– pip install -r requirements.txt
或
– pip install opencv-python==3.4.11.43
– pip install cvzone==1.5.3
現在讓我們檢測手。
import cv2 from cvzone.HandTrackingModule import HandDetector
# Input from webcam frame = cv2.VideoCapture(0) frame.set(3, 1280) frame.set(4, 720) # initialize hand detector module with some confidence handDetector = HandDetector(detectionCon=0.8) # loop while True: # Read the frames from webcam res, img = frame.read() # detect the hands, by default it will detect two hands hands = handDetector.findHands(img) # show the output cv2.imshow(「Sample CVZone output」, img) cv2.waitKey(1)
首先,讓我們匯入所需的模組,cv2,以及從 cvzone.HandTrackingModule 匯入HandDetector*。*
然後我們將使用 OpenCV 的 Videocapture 功能從網路攝像頭獲取輸入。設定視窗的高度和寬度,並以一定的檢測置信度初始化手部檢測器模組。
然後在迴圈內部從網路攝像頭讀取輸入幀並將其傳遞給手部檢測器模組內部的方法,即 findHands。顯示影象。
與此類似,我們可以使用 CVZone 實現面部地標檢測、姿勢估計等。
我們的目標是構建一個螢幕上有影象的專案,使用 OpenCV 進行虛擬縮放,並使用我們的手勢,即如果雙手的食指和拇指向上並且兩根手指彼此遠離,就放大,如果雙手的食指和拇指向上並且兩根手指彼此靠近,則縮小該影象或物件。牢記這一點,我們將制定一些步驟。
步驟
初始化來自網路攝像頭的輸入。
設定輸出視窗的高度和寬度。
初始化手部檢測器模組。
分別宣告計算距離、縮放範圍、中心X和中心Y的4個變數。
讀取輸入幀。
檢測雙手。
讀取用於縮放操作的影象。
檢查是否檢測到兩隻手。
檢查食指和拇指是否向上。
計算兩隻手之間的距離,並將影象調整到兩隻手的中心。
計算新的高度和寬度,然後調整影象大小。
顯示輸出。
如上一節所述安裝所需的庫。現在讓我們開始吧。
首先,匯入所需的模組。這裡我們只需要 cv2 和 cvzone 的手部檢測器模組。
匯入庫後,使用 cv2.VideoCapture(0) 從網路攝像頭獲取輸入,其中 0 是網路攝像頭 ID。
然後設定輸出視窗的寬度和高度。這裡是 1280 x 720。
import cv2 from cvzone.HandTrackingModule import HandDetector
# Input from webcam frame = cv2.VideoCapture(0) frame.set(3, 1280) frame.set(4, 720)
現在,我們將初始化手檢測模組(handDetector),檢測置信度為 0.8,並將在 while 迴圈中用於檢測手。
宣告 4 個變數,一個是初始儲存距離,它是None,一個是縮放範圍,初始是0,另外 2 個用於捕捉縮放物件的中心 X 和中心 Y,並設定一些隨機值。
這裡程式碼中的變數分別是 distStart、zoom_range、cx、cy。
# initialize hand detector module handDetector = HandDetector(detectionCon=0.8) distStart = None zoom_range = 0 cx, cy = 500, 500
開始一個while迴圈,從現在開始,一切操作都應該在這個迴圈中。
從網路攝像頭讀取輸入,並使用上面初始化的手部檢測器模組,我們可以呼叫方法 findHands 將幀作為輸入傳遞。此方法會在框架中找到手,預設它可以檢測框架中的兩隻手並返回手的列表。
我們可以從中存取每隻檢測到的手(這裡:一隻手為hands[0],另一隻手為hands[1]),並且它還返回影象。然後我們將使用 OpenCV 的 imread() 函數讀取螢幕上要縮放的影象。最好影象大小應低於 (250, 250),否則你可以使用 cv2.resize(img, (250,250)) 調整其大小。這裡影象大小為 (225, 225)。
while True: # Read the input frame res, img = frame.read() # Detect the hands hands, img = handDetector.findHands(img) # Image to be zoomed new_img = cv2.imread('resized_test.jpg')
現在,我們需要檢查框架中是否有兩隻手,然後我們將檢查食指和拇指是否向上,這可以使用手檢測模組中的 FingerUp() 方法輕鬆完成。
在下面的第一個 if 語句之後的程式碼中,我們將使用兩個列印語句 print(handDetector.fingersUp(hands[0])) ,如果食指和拇指向上,則這將列印一個包含 5 個元素的列表,結果列表顯示一隻手將是 [1, 1, 0, 0, 0],另一隻手類似地執行 print(handDetector.fingersUp(hands[1]))。
請參考下圖。
# if two hands are detected if len(hands) == 2: print("Start Zoom...") print(handDetector.fingersUp(hands[0])) print(handDetector.fingersUp(hands[1]))
然後是重要的部分,現在我們需要檢查雙手的食指和拇指是否向上。我們將再次使用 if 語句(在第一個 if 語句中:if handDetector.fingersUp(hands[0]) == [1, 1, 0, 0, 0] 和 handDetector.fingersUp(hands[1]) == [ 1, 1, 0, 0, 0]:) 然後求兩隻手之間的距離,具體來說就是食指兩點之間的距離。
在下面的程式碼中,findDistance() 方法將找到距離,這裡我們將兩隻手的中心作為引數與框架一起傳遞。findDistance() 方法將返回三個專案距離,一個包含位置 4 和 5 的中心 X 和中心 Y 的元組以及影象。
如果僅當 distStart 為 None 時才執行條件,則將獲得的距離分配給我們之前宣告的第三個變數 distStart。然後,計算新距離並從舊距離 distStart 中減去它,並執行除以 2 (向下取整)以獲得縮放範圍。然後將中心座標分配給變數cx,cy。然後,如果框架中沒有兩隻手,則將 distStart 變數重置為 None。
if handDetector.fingersUp(hands[0]) == [1, 1, 0, 0, 0] and handDetector.fingersUp(hands[1]) == [1, 1, 0, 0, 0]: # print("Start Zoom...") lmList1 = hands[0]['lmList'] lmList2 = hands[1]['lmList'] # point 8 is tip of the index finger if distStart is None: # length, info, img = handDetector.findDistance(lmList1[8], lmList2[8], img) # draw the connection points between right hand index and thum finger to left hand length, info, img = handDetector.findDistance(hands[0]['center'], hands[1]['center'], img) # print(length) distStart = length
# length, info, img = handDetector.findDistance(lmList1[8], lmList2[8], img) length, info, img = handDetector.findDistance(hands[0][‘center'], hands[1][‘center'], img) # info gives center x and center y # calculate the zoom range zoom_range = int((length – distStart) // 2) # calculate the center point so that we can place the zooming image at the center cx, cy = info[4:] print(zoom_range) else: distStart = None
然後獲取要放大的影象的高度和寬度,並計算影象的新高度和寬度。這有點棘手,要獲得新的高度和寬度,我們需要將影象之前的高度和寬度新增到縮放範圍並執行向下取整除法,然後乘以 2。
然後我們可以動態找到放置縮放的位置影象(這裡:img[cy – newH // 2:cy + newH // 2, cx – newW // 2:cx + newW // 2])。
但是還有一個問題,如果縮放後的影象低於視窗邊距,則會出錯,為了解決這個問題,我們將使用 try 和 except。然後顯示輸出。
try: h, w, _ = new_img.shape
# new height and new width newH, newW = ((h + zoom_range) // 2) * 2, ((w + zoom_range) // 2) * 2 new_img = cv2.resize(new_img, (newW, newH)) # we want the zooming image to be center and place it approx at the center img[cy – newH // 2:cy + newH // 2, cx – newW // 2:cx + newW // 2] = new_img except: pass # display output cv2.imshow(‘output', img) cv2.waitKey(1)
完整的程式碼也可以在這個 GitHub 中找到
這就是這篇關於使用 OpenCV 進行虛擬縮放的部落格的內容。如果你想即興發揮,讓它更有趣,你可以在螢幕上保留一些影象,每次選擇一個並放大它,或者你可以建立不同的形狀,使用不同的手勢來讓它變大或變小。這就是我們如何使用 OpenCV 實現虛擬縮放。
到此這篇關於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