<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于OpenCV的手掌檢測和手指計數(shù)

          共 3039字,需瀏覽 7分鐘

           ·

          2020-09-18 05:01


          點擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時間送達(dá)

          利用余弦定理使用OpenCV-Python實現(xiàn)手指計數(shù)與手掌檢測。

          手檢測和手指計數(shù)

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

          OpenCV

          OpenCV(開源計算機視覺庫)是一個開源計算機視覺和機器學(xué)習(xí)軟件庫。OpenCV的構(gòu)建旨在為計算機視覺應(yīng)用程序提供通用的基礎(chǔ)結(jié)構(gòu),并加速在商業(yè)產(chǎn)品中使用機器感知。

          導(dǎo)入庫

          ? cv2:?opencv [pip install opencv]

          ? numpy:用于處理數(shù)組和數(shù)學(xué)[pip install numpy]

          import cv2 as cv
          import numpy as np

          導(dǎo)入圖像

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


          手掌圖像

          皮膚Mask

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

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

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

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

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

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

          ? 脫粒:脫粒。

          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)

          處理結(jié)果

          輪廓線繪制

          現(xiàn)在讓我們在圖像上找到輪廓。

          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)

          檢測結(jié)果

          凸缺陷檢測

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

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

          凸缺陷示例

          余弦定理

          現(xiàn)在,這是數(shù)學(xué)時間!讓我們了解余弦定理。

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

          圖1

          式:

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

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

          使用余弦定理識別手指

          圖2

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

          手指個數(shù)計算

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

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

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

          ? 起點

          ? 終點

          ? 最遠(yuǎn)點

          ? 到最遠(yuǎn)點的大概距離

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

          if defects is not None:cnt = 0for i in range(defects.shape[0]): # calculate the angles, 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 theoremif angle <= np.pi / 2: # angle less than 90 degree, treat as fingerscnt += 1cv.circle(img, far, 4, [0, 0, 255], -1)if cnt > 0:cnt = cnt+1cv.putText(img, str(cnt), (0, 50), cv.FONT_HERSHEY_SIMPLEX,1, (255, 0, 0) , 2, cv.LINE_AA)


          讓我們看看最終結(jié)果

          cv.imshow('final_result',img)


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

          流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 100
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www18禁 | 无码毛片在线观看 | 午夜无码免费视频 | 免费v在线观看 | 天天射中文网 |