OpenCV - 使用凸包和自适应阈值在手指上绘制轮廓

问题描述

我对 OpenCV 还很陌生,正在尝试使用网络摄像头沿着手部轮廓绘制简单的轮廓。我决定使用 cv2.adaptiveThreshold() 来处理相机适应手部移动时不同的光线强度。一切似乎都很好,只是它在寻找手指然后绘制闭合轮廓时遇到了困难。 看这里:

enter image description here

我想尝试检测一个凸包,并以某种方式检测任何偏离它的东西。

我该如何做到最好?首先,我需要设法找到奇怪的封闭轮廓,然后从那里开始?

这是代码,我为您修复了轨迹栏值:)

import cv2
import numpy as np

#####################################
winWidth = 640
winHeight = 840
brightness = 100

cap = cv2.VideoCapture(0)
cap.set(3,winWidth)
cap.set(4,winHeight)
cap.set(10,brightness)

kernel = (7,7)


#######################################################################
def empty(a):
    pass


cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,240)
cv2.createTrackbar("cVal","TrackBars",10,40,empty)
cv2.createTrackbar("bSize",77,154,empty)


def preprocessing(frame,value_BSize,cVal):
    imgGray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    # mask = cv2.inRange(imgHsv,lower,upper)
    imgBlurred = cv2.GaussianBlur(imgGray,kernel,4)
    gaussC = cv2.adaptiveThreshold(imgBlurred,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,cVal)
    imgDial = cv2.dilate(gaussC,iterations=3)
    imgErode = cv2.erode(imgDial,iterations=1)

    return imgDial


def getContours(imPrePro):
    contours,hierarchy = cv2.findContours(imPrePro,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > 60:
            cv2.drawContours(imgCon,cnt,-1,(0,0),2,cv2.FONT_HERSHEY_SIMPLEX)
            peri = cv2.arcLength(cnt,True)
            approx = cv2.approxPolyDP(cnt,0.02 * peri,True)


#######################################################################################################

while cap.isOpened():
    success,frame = cap.read()
    cVal = cv2.getTrackbarPos("cVal","TrackBars")
    bVal = cv2.getTrackbarPos("bVal","TrackBars")
    value_BSize = cv2.getTrackbarPos("bSize","TrackBars")
    value_BSize = max(3,value_BSize)
    if (value_BSize % 2 == 0):
        value_BSize += 1

    if success == True:
        frame = cv2.flip(frame,1)
        imgCon = frame.copy()
        imPrePro = preprocessing(frame,cVal)
        getContours(imPrePro)
        cv2.imshow("Preprocessed",imPrePro)
        cv2.imshow("Original",imgCon)

        if cv2.waitKey(1) & 0xFF == ord("q"):
            cv2.destroyAllWindows()
            break

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)