国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        使用OpenCV進行虛擬縮放

        2022-03-01 15:30
        磐創AI
        關注

        介紹

        OpenCV 徹底改變了整個圖像處理領域。從圖像分類到對象檢測,我們不僅可以使用 OpenCV 庫做一些很酷的事情,而且還可以構建一流的應用程序。

        今天我們要實現一個有趣的東西,它是手機或電腦中的一種功能,即圖像縮放。但在這里,它將是實時對幀上所需的圖像進行虛擬縮放。

        目錄

        1.要求

        2.目的

        3.構建

        4.結論

        要求

        對于這個項目,我們將使用 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。顯示圖像。

        使用 OpenCV 進行虛擬縮放

        與此類似,我們可以使用 CVZone 實現面部地標檢測、姿勢估計等。

        目標

        我們的目標是構建一個屏幕上有圖像的項目,使用 OpenCV 進行虛擬縮放,并使用我們的手勢,即如果雙手的食指和拇指向上并且兩根手指彼此遠離,就放大,如果雙手的食指和拇指向上并且兩根手指彼此靠近,則縮小該圖像或對象。牢記這一點,我們將制定一些步驟。

        步驟

        初始化來自網絡攝像頭的輸入。

        設置輸出窗口的高度和寬度。

        初始化手部檢測器模塊。

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

        讀取輸入幀。

        檢測雙手。

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

        檢查是否檢測到兩只手。

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

        計算兩只手之間的距離,并將圖像調整到兩只手的中心。

        計算新的高度和寬度,然后調整圖像大小。

        顯示輸出。

        使用 OpenCV 進行虛擬縮放

        構建

        如上一節所述安裝所需的庫。現在讓我們開始吧。

        首先,導入所需的模塊。這里我們只需要 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]))

        使用 OpenCV 進行虛擬縮放

        然后是重要的部分,現在我們需要檢查雙手的食指和拇指是否向上。我們將再次使用 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。

        使用 OpenCV 進行虛擬縮放

        if handDetector.fingersUp(hands[0]) == [1, 1, 0, 0, 0] andhandDetector.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)

        結論

        這就是這篇關于使用 OpenCV 進行虛擬縮放的博客的內容。如果你想即興發揮,讓它更有趣,你可以在屏幕上保留一些圖像,每次選擇一個并放大它,或者你可以創建不同的形狀,使用不同的手勢來讓它變大或變小。這就是我們如何使用 OpenCV 實現虛擬縮放。

        參考:

        image.png


               原文標題 : 使用OpenCV進行虛擬縮放

        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 日韩AV一区二区三区| 日日日操| 新密市| 吴堡县| 中国女人做爰A片| 综合av| 亚洲video| 琼中| 日本精品视频| 雅安市| 免费jizz| 伊人福利导航| www.97色伦| 亚洲v在线| 萨嘎县| 亚洲网友自拍| 午夜精品偷拍| 波多野结衣av88综合| jizzjizz韩国| 成人黄电影| 沈丘县| 亚洲老熟女@TubeumTV| 绯色AV毛片一级| 国内A片| 尉犁县| 国产???做受视频| 全球熟女AV最大导航| 亚洲v欧美| 国产富婆一区二区三区| 1024你懂的日韩人妻学生| 即墨市| 丁香五月激情综合| 国产区h| AV一二三| 正镶白旗| 亚洲性受| 丝袜a片| 人人操网| 甘南县| 97国产视频| 色哟哟91|