日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【CV】基于OpenCV的手掌检测和手指计数

發布時間:2025/3/12 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CV】基于OpenCV的手掌检测和手指计数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用余弦定理使用OpenCV-Python實現手指計數與手掌檢測。

手檢測和手指計數

接下來讓我們一起探索以下這個功能是如何實現的。


OpenCV

OpenCV(開源計算機視覺庫)是一個開源計算機視覺和機器學習軟件庫。OpenCV的構建旨在為計算機視覺應用程序提供通用的基礎結構,并加速在商業產品中使用機器感知。


導入庫

? cv2:?opencv [pip install opencv]

? numpy:用于處理數組和數學[pip install numpy]

import cv2 as cv
import numpy as np

導入圖像

img_path = "data/palm.jpg"
img = cv.imread(img_path)
cv.imshow('palm image',img)


手掌圖像


皮膚Mask

? 用于突出顯示圖像上的特定顏色。

? hsvim:將BGR(藍色,綠色,紅色)圖像更改為HSV(色相,飽和度,值)。

? 較低:HSV中的膚色范圍較小。

? upper:HSV中皮膚顏色的上限。

? skinRegionHSV:在HSV色彩空間的上下像素值范圍內檢測皮膚。

? 模糊:使圖像模糊以改善遮罩。

? 脫粒:脫粒。

hsvim = cv.cvtColor(img, cv.COLOR_BGR2HSV) lower = np.array([0, 48, 80], dtype = "uint8") upper = np.array([20, 255, 255], dtype = "uint8") skinRegionHSV = cv.inRange(hsvim, lower, upper) blurred = cv.blur(skinRegionHSV, (2,2)) ret,thresh = cv.threshold(blurred,0,255,cv.THRESH_BINARY) cv.imshow("thresh", thresh)

處理結果

輪廓線繪制

現在讓我們在圖像上找到輪廓。

contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) contours = max(contours, key=lambda x: cv.contourArea(x)) cv.drawContours(img, [contours], -1, (255,255,0), 2) cv.imshow("contours", img)

手掌輪廓線

凸包檢測

hull = cv.convexHull(contours) cv.drawContours(img, [hull], -1, (0, 255, 255), 2) cv.imshow("hull", img)

檢測結果

凸缺陷檢測

手掌與凸包檢測輪廓線的任何偏離的地方都可以視為凸度缺陷。

hull = cv.convexHull(contours, returnPoints=False) defects = cv.convexityDefects(contours, hull)

凸缺陷示例

余弦定理

現在,這是數學時間!讓我們了解余弦定理。

在三角學中,余弦定律將三角形邊的長度與其角度之一的余弦相關。使用如圖1所示的符號表示,余弦定律表明,其中γ表示長度a和b的邊之間的長度以及與長度c的邊相對的角度。

圖1

式:

通過現在看這個公式,我們知道如果有的話;a,b和gama然后我們也找到c以及是否有c?;?a,b,c然后我們也找到伽瑪(反之亦然)

為了找到伽瑪,使用以下公式:

使用余弦定理識別手指

圖2

在圖2中,我畫了一個Side:a,b,c和angle:gamma。現在,該伽馬始終小于90度,因此可以說:如果伽馬小于90度或pi / 2,則將其視為手指。


手指個數計算

注意:如果您不熟悉凸出缺陷,可以閱讀以下文章。

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_contours/py_contours_more_functions/py_contours_more_functions.html

凸缺陷返回一個數組,其中每一行都包含以下值:

? 起點

? 終點

? 最遠點

? 到最遠點的大概距離

通過這一點,我們可以輕松得出Sides:a,b,c(請參見CODE),并且根據余弦定理,我們還可以得出兩根手指之間的伽馬或角度。如前所述,如果伽瑪小于90度,我們會將其視為手指。知道伽瑪后,我們只需畫一個半徑為4的圓,到最遠點的近似距離即可。在將文本簡單地放入圖像中之后,我們就表示手指數(cnt)。

if defects is not None: cnt = 0 for i in range(defects.shape[0]): # calculate the angle s, e, f, d = defects[i][0] start = tuple(contours[s][0]) end = tuple(contours[e][0]) far = tuple(contours[f][0]) a = np.sqrt((end[0] - start[0]) ** 2 + (end[1] - start[1]) ** 2) b = np.sqrt((far[0] - start[0]) ** 2 + (far[1] - start[1]) ** 2) c = np.sqrt((end[0] - far[0]) ** 2 + (end[1] - far[1]) ** 2) angle = np.arccos((b ** 2 + c ** 2 - a ** 2) / (2 * b * c)) # cosine theorem if angle <= np.pi / 2: # angle less than 90 degree, treat as fingers cnt += 1 cv.circle(img, far, 4, [0, 0, 255], -1) if cnt > 0: cnt = cnt+1 cv.putText(img, str(cnt), (0, 50), cv.FONT_HERSHEY_SIMPLEX,1, (255, 0, 0) , 2, cv.LINE_AA)

讓我們看看最終結果

cv.imshow('final_result',img)

我們也可以通過調用“ cv.VideoCapture()”來對視頻執行此操作。代碼鏈接如下https://github.com/madhav727/medium/blob/master/finger_counting_video.py

往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【CV】基于OpenCV的手掌检测和手指计数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。