最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用OpenCV實(shí)現(xiàn)虛擬縮放效果

 更新時(shí)間:2022年02月28日 11:21:22   作者:woshicver  
OpenCV?徹底改變了整個(gè)圖像處理領(lǐng)域。從圖像分類到對(duì)象檢測(cè),我們不僅可以使用?OpenCV?庫(kù)做一些很酷的事情,而且還可以構(gòu)建一流的應(yīng)用程序。本文將用OpenCV實(shí)現(xiàn)虛擬縮放,需要的可以參考一下

介紹

OpenCV 徹底改變了整個(gè)圖像處理領(lǐng)域。從圖像分類到對(duì)象檢測(cè),我們不僅可以使用 OpenCV 庫(kù)做一些很酷的事情,而且還可以構(gòu)建一流的應(yīng)用程序。

今天我們要實(shí)現(xiàn)一個(gè)有趣的東西,它是手機(jī)或電腦中的一種功能,即圖像縮放。但在這里,它將是實(shí)時(shí)對(duì)幀上所需的圖像進(jìn)行虛擬縮放。

要求

對(duì)于這個(gè)項(xiàng)目,我們將使用 OpenCV 庫(kù)和另一個(gè)名為 Cvzone 的庫(kù)來(lái)使用虛擬縮放。

CVZone

它是一個(gè)建立在 OpenCV 和 MediaPipe 之上的庫(kù)。它使事情變得容易得多。

CVZone 具有一些非常有用的內(nèi)置功能,例如手部跟蹤、面部標(biāo)志檢測(cè)、姿勢(shì)估計(jì)等等。這些都可以通過幾行代碼來(lái)完成。

讓我們編寫一段代碼來(lái)看看使用 CVZone 的手部檢測(cè)器的演示。首先,安裝 requirements 。你可以使用以下命令安裝它,也可以逐個(gè)安裝。

– pip install -r requirements.txt

– pip install opencv-python==3.4.11.43

– pip install cvzone==1.5.3

現(xiàn)在讓我們檢測(cè)手。

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)

首先,讓我們導(dǎo)入所需的模塊,cv2,以及從 cvzone.HandTrackingModule 導(dǎo)入HandDetector*。*

然后我們將使用 OpenCV 的 Videocapture 功能從網(wǎng)絡(luò)攝像頭獲取輸入。設(shè)置窗口的高度和寬度,并以一定的檢測(cè)置信度初始化手部檢測(cè)器模塊。

然后在循環(huán)內(nèi)部從網(wǎng)絡(luò)攝像頭讀取輸入幀并將其傳遞給手部檢測(cè)器模塊內(nèi)部的方法,即 findHands。顯示圖像。

與此類似,我們可以使用 CVZone 實(shí)現(xiàn)面部地標(biāo)檢測(cè)、姿勢(shì)估計(jì)等。

目標(biāo)

我們的目標(biāo)是構(gòu)建一個(gè)屏幕上有圖像的項(xiàng)目,使用 OpenCV 進(jìn)行虛擬縮放,并使用我們的手勢(shì),即如果雙手的食指和拇指向上并且兩根手指彼此遠(yuǎn)離,就放大,如果雙手的食指和拇指向上并且兩根手指彼此靠近,則縮小該圖像或?qū)ο蟆@斡涍@一點(diǎn),我們將制定一些步驟。

步驟

初始化來(lái)自網(wǎng)絡(luò)攝像頭的輸入。

設(shè)置輸出窗口的高度和寬度。

初始化手部檢測(cè)器模塊。

分別聲明計(jì)算距離、縮放范圍、中心X和中心Y的4個(gè)變量。

讀取輸入幀。

檢測(cè)雙手。

讀取用于縮放操作的圖像。

檢查是否檢測(cè)到兩只手。

檢查食指和拇指是否向上。

計(jì)算兩只手之間的距離,并將圖像調(diào)整到兩只手的中心。

計(jì)算新的高度和寬度,然后調(diào)整圖像大小。

顯示輸出。

構(gòu)建

如上一節(jié)所述安裝所需的庫(kù)。現(xiàn)在讓我們開始吧。

首先,導(dǎo)入所需的模塊。這里我們只需要 cv2 和 cvzone 的手部檢測(cè)器模塊。

導(dǎo)入庫(kù)后,使用 cv2.VideoCapture(0) 從網(wǎng)絡(luò)攝像頭獲取輸入,其中 0 是網(wǎng)絡(luò)攝像頭 ID。

然后設(shè)置輸出窗口的寬度和高度。這里是 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)

現(xiàn)在,我們將初始化手檢測(cè)模塊(handDetector),檢測(cè)置信度為 0.8,并將在 while 循環(huán)中用于檢測(cè)手。

聲明 4 個(gè)變量,一個(gè)是初始存儲(chǔ)距離,它是None,一個(gè)是縮放范圍,初始是0,另外 2 個(gè)用于捕捉縮放對(duì)象的中心 X 和中心 Y,并設(shè)置一些隨機(jī)值。

這里代碼中的變量分別是 distStart、zoom_range、cx、cy。

# initialize hand detector module
handDetector = HandDetector(detectionCon=0.8)
distStart = None
zoom_range = 0
cx, cy = 500, 500

開始一個(gè)while循環(huán),從現(xiàn)在開始,一切操作都應(yīng)該在這個(gè)循環(huán)中。

從網(wǎng)絡(luò)攝像頭讀取輸入,并使用上面初始化的手部檢測(cè)器模塊,我們可以調(diào)用方法 findHands 將幀作為輸入傳遞。此方法會(huì)在框架中找到手,默認(rèn)它可以檢測(cè)框架中的兩只手并返回手的列表。

我們可以從中訪問每只檢測(cè)到的手(這里:一只手為hands[0],另一只手為hands[1]),并且它還返回圖像。然后我們將使用 OpenCV 的 imread() 函數(shù)讀取屏幕上要縮放的圖像。最好圖像大小應(yīng)低于 (250, 250),否則你可以使用 cv2.resize(img, (250,250)) 調(diào)整其大小。這里圖像大小為 (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')

現(xiàn)在,我們需要檢查框架中是否有兩只手,然后我們將檢查食指和拇指是否向上,這可以使用手檢測(cè)模塊中的 FingerUp() 方法輕松完成。

在下面的第一個(gè) if 語(yǔ)句之后的代碼中,我們將使用兩個(gè)打印語(yǔ)句 print(handDetector.fingersUp(hands[0])) ,如果食指和拇指向上,則這將打印一個(gè)包含 5 個(gè)元素的列表,結(jié)果列表顯示一只手將是 [1, 1, 0, 0, 0],另一只手類似地執(zhí)行 print(handDetector.fingersUp(hands[1]))。

請(qǐng)參考下圖。

# if two hands are detected
if len(hands) == 2:
    print("Start Zoom...")
    print(handDetector.fingersUp(hands[0]))
    print(handDetector.fingersUp(hands[1]))

然后是重要的部分,現(xiàn)在我們需要檢查雙手的食指和拇指是否向上。我們將再次使用 if 語(yǔ)句(在第一個(gè) if 語(yǔ)句中:if handDetector.fingersUp(hands[0]) == [1, 1, 0, 0, 0] 和 handDetector.fingersUp(hands[1]) == [ 1, 1, 0, 0, 0]:) 然后求兩只手之間的距離,具體來(lái)說就是食指兩點(diǎn)之間的距離。

在下面的代碼中,findDistance() 方法將找到距離,這里我們將兩只手的中心作為參數(shù)與框架一起傳遞。findDistance() 方法將返回三個(gè)項(xiàng)目距離,一個(gè)包含位置 4 和 5 的中心 X 和中心 Y 的元組以及圖像。

如果僅當(dāng) distStart 為 None 時(shí)才執(zhí)行條件,則將獲得的距離分配給我們之前聲明的第三個(gè)變量 distStart。然后,計(jì)算新距離并從舊距離 distStart 中減去它,并執(zhí)行除以 2 (向下取整)以獲得縮放范圍。然后將中心坐標(biāo)分配給變量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

然后獲取要放大的圖像的高度和寬度,并計(jì)算圖像的新高度和寬度。這有點(diǎn)棘手,要獲得新的高度和寬度,我們需要將圖像之前的高度和寬度添加到縮放范圍并執(zhí)行向下取整除法,然后乘以 2。

然后我們可以動(dòng)態(tài)找到放置縮放的位置圖像(這里:img[cy – newH // 2:cy + newH // 2, cx – newW // 2:cx + newW // 2])。

但是還有一個(gè)問題,如果縮放后的圖像低于窗口邊距,則會(huì)出錯(cuò),為了解決這個(gè)問題,我們將使用 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)

完整的代碼也可以在這個(gè) GitHub 中找到

結(jié)論

這就是這篇關(guān)于使用 OpenCV 進(jìn)行虛擬縮放的博客的內(nèi)容。如果你想即興發(fā)揮,讓它更有趣,你可以在屏幕上保留一些圖像,每次選擇一個(gè)并放大它,或者你可以創(chuàng)建不同的形狀,使用不同的手勢(shì)來(lái)讓它變大或變小。這就是我們?nèi)绾问褂?OpenCV 實(shí)現(xiàn)虛擬縮放。

到此這篇關(guān)于Python使用OpenCV實(shí)現(xiàn)虛擬縮放效果的文章就介紹到這了,更多相關(guān)Python OpenCV虛擬縮放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python單向循環(huán)鏈表實(shí)例詳解

    python單向循環(huán)鏈表實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了python單向循環(huán)鏈表實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Python?NumPy科學(xué)計(jì)算庫(kù)的高級(jí)應(yīng)用

    Python?NumPy科學(xué)計(jì)算庫(kù)的高級(jí)應(yīng)用

    這篇文章主要為大家介紹了Python?NumPy科學(xué)計(jì)算庫(kù)的高級(jí)應(yīng)用深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • python中split()函數(shù)的用法詳解

    python中split()函數(shù)的用法詳解

    Python join() 方法用于將序列中的元素以指定的字符連接生成一個(gè)新的字符串,這篇文章主要介紹了python中split()函數(shù)的用法詳解,需要的朋友可以參考下
    2023-01-01
  • 關(guān)于python中inspect模塊用法詳解

    關(guān)于python中inspect模塊用法詳解

    這篇文章主要介紹了關(guān)于python中inspect模塊用法詳解,獲取函數(shù)簽名對(duì)象。函數(shù)簽名包含了一個(gè)函數(shù)的信息,包括函數(shù)名、它的參數(shù)類型、它所在的類和名稱空間及其他信息,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于Python中異常(Exception)的匯總

    關(guān)于Python中異常(Exception)的匯總

    異常是指程序中的例外,違例情況。異常機(jī)制是指程序出現(xiàn)錯(cuò)誤后,程序的處理方法。當(dāng)出現(xiàn)錯(cuò)誤后,程序的執(zhí)行流程發(fā)生改變,程序的控制權(quán)轉(zhuǎn)移到異常處理。下面這篇文章主要匯總了關(guān)于Python中異常(Exception)的相關(guān)資料,需要的朋友可以參考下。
    2017-01-01
  • Flask添加路由的三種方法

    Flask添加路由的三種方法

    Flask 是一個(gè)流行的 Python Web 框架,它提供了多種方法來(lái)添加路由,本文詳細(xì)的介紹了Flask添加路由的三種方法,感興趣的可以了解一下
    2023-11-11
  • Python+pyftpdlib實(shí)現(xiàn)局域網(wǎng)文件互傳

    Python+pyftpdlib實(shí)現(xiàn)局域網(wǎng)文件互傳

    這篇文章主要介紹了Python+pyftpdlib實(shí)現(xiàn)局域網(wǎng)文件互傳,需要的朋友可以參考下
    2020-08-08
  • python?實(shí)現(xiàn)銀行卡號(hào)查詢銀行名稱和簡(jiǎn)稱功能

    python?實(shí)現(xiàn)銀行卡號(hào)查詢銀行名稱和簡(jiǎn)稱功能

    這篇文章主要介紹了python?實(shí)現(xiàn)銀行卡號(hào)查詢銀行名稱和簡(jiǎn)稱功能,本文通過實(shí)例代碼補(bǔ)充介紹了基于PyQT5+OpenCv實(shí)現(xiàn)銀行卡號(hào)識(shí)別功能,感興趣的朋友一起看看吧
    2023-11-11
  • 在python中使用pyspark讀寫Hive數(shù)據(jù)操作

    在python中使用pyspark讀寫Hive數(shù)據(jù)操作

    這篇文章主要介紹了在python中使用pyspark讀寫Hive數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-06-06
  • Tensorflow 1.0之后模型文件、權(quán)重?cái)?shù)值的讀取方式

    Tensorflow 1.0之后模型文件、權(quán)重?cái)?shù)值的讀取方式

    今天小編就為大家分享一篇Tensorflow 1.0之后模型文件、權(quán)重?cái)?shù)值的讀取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-02-02

最新評(píng)論

巴东县| 新平| 虞城县| 邢台市| 福清市| 蒲江县| 马关县| 桃园县| 巍山| 昌宁县| 会理县| 德江县| 册亨县| 西华县| 阿荣旗| 图片| 堆龙德庆县| 芷江| 黔西县| 晋州市| 罗城| 兴文县| 昌宁县| 城固县| 南平市| 炉霍县| 新宾| 长兴县| 卢氏县| 台前县| 贵定县| 扎囊县| 成都市| 柳江县| 大冶市| 芜湖市| 米脂县| 商水县| 嘉荫县| 高平市| 满洲里市|