9

肌のHSV色空間の範囲に関するSOに関するすべての質問を見てきまし
たが、これしか理解できません

コード-

CvScalar  hsv_min = cvScalar(0, 30, 60, 0);
CvScalar  hsv_max = cvScalar(20, 150, 255, 0);
//range I am using is { 0,30,60,0 & 20,150,255,0 }
cvCvtColor(src, hsv_image, CV_BGR2HSV);
cvInRangeS (hsv_image, hsv_min, hsv_max, hsv_mask);
cvDilate(hsv_mask,hsv_mask,0,1);
cvErode(hsv_mask,hsv_mask,0,1);
cvSmooth( hsv_mask, hsv_mask, CV_MEDIAN);

この範囲 {0,30,60,0&20,150,255,0} )の問題は、赤い色も検出し、赤い背景に手を置いたときに肌を追跡しないことです...助けて
ください!!!

4

9 に答える 9

9

これによると:http://matmidia.org/sibgrapi2009/media/posters/59928.pdf

チャネルHの皮膚は、0〜50の値で特徴付けられ、チャネルSでは、アジア人および白人の民族の場合、0.23〜0.68の値です。

Vの値が小さいと、HSV変換のノイズが非常に大きくなるため、画像の非常に暗い部分には特に注意を払い、おそらくそれらを完全に破棄する必要があります。

制約に応じて、色付きの手袋(シーンに通常は表示されない色)を使用するか、肌の色(マゼンタ、緑、なんでもいい)。

于 2012-01-06T11:22:55.277 に答える
7

基本的に、肌の色の範囲を1つに固定することは困難です。自分の肌だけを検出したい場合でも、実際には照明条件によって色が大きく変化するためです。

したがって、2011年のこの素晴らしい科学論文のアイデアを使用できるかもしれません。

http://www.robots.ox.ac.uk/~vgg/research/hands/

基本的に、顔を検出します(oepncvを使用すると簡単です)。次に、顔の肌の色を抽出します(これは画像上の人物に非常に固有です)。次に、この色を使用して肌を検出します。色は非常に特殊であるため、固定の色範囲よりも誤検出がはるかに少ないはずです。

于 2012-01-06T10:55:41.463 に答える
7

試してみ
lower = np.array([0, 10, 60], dtype = "uint8") upper = np.array([20, 150, 255], dtype = "uint8") ましたが、ほぼ良い結果が得られます。

于 2017-03-19T09:56:59.967 に答える
5

これに返信するには遅すぎることを私は知っています。しかし、私は同じことをしています。Kは、肌の色を取得するためにクラスタリングを意味します。つまり、最初にHaarカスケード分類器を使用して顔を検出する必要があります。次に、顔の座標に基づいて顔をトリミングし、それをソースとして使用して色をクラスター化します。最も多くの要素を持ち、それがあなたの肌の色になるクラスターを見つけてください。または、特定の値を1つ指定せずに、クラスターの中心点を取得し、特定の値を差し引いて加算することにより、それを範囲として使用できます。これは役に立ちますhttp://answers.opencv.org/question/23196/k-mean-clustering-of-hsv-histogram-of-frames-of-a-video/

于 2015-12-03T04:57:34.160 に答える
3

適応型皮膚検出器はOpenCvに存在します。samples/c/adaptiveskindetector_sample.cppを参照してください。

于 2012-01-22T20:42:42.780 に答える
3

コードでこの前処理関数を試してください。

def preprocess(action_frame):

    blur = cv2.GaussianBlur(action_frame, (3,3), 0)
    hsv = cv2.cvtColor(blur, cv2.COLOR_RGB2HSV)

    lower_color = np.array([108, 23, 82])
    upper_color = np.array([179, 255, 255])

    mask = cv2.inRange(hsv, lower_color, upper_color)
    blur = cv2.medianBlur(mask, 5)

    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (8, 8))
    hsv_d = cv2.dilate(blur, kernel)

return hsv_d

私はこれを何ヶ月も使っています。それはあなたの問題を永遠に解決するかもしれません。

于 2019-01-21T12:47:05.177 に答える
1

また、ビデオキャプションを使用している場合は、ほとんどの場合、カメラが自動コントラスト調整を行うことに注意する必要があります。これは、トーンに大きな違いがあるため、画像に影響を与えます。また、シャドウと皮膚に影響を与える光源

于 2015-04-13T15:55:39.390 に答える
1

Deepgazeは、他の機能に加えて皮膚を検出するライブラリです。

DeepGaze Github

彼は使う:

[0, 58, 50] lower bound skin HSV
[30, 255, 255] upper bound skin HSV

彼はGithubで非常に反応が良いので、彼に連絡して、どのようにしてそれらの番号を思いついたのかを尋ねるオプションがあります。

于 2019-08-25T04:20:06.713 に答える
1

これは、皮膚の検出に理想的なソリューションの1つです。

上記の回答のほとんどは、濃い赤、明るい黄色、明るいオレンジなどのさまざまな肌の色で機能します。ただし、これらの色は、画像ではほとんど見られないため、肌の色ではありません。

この写真でわかるように、赤い範囲は350から20の間のどこかにあります。 ここに画像の説明を入力してください

したがって、スキンの色相には2つの可能な範囲があります。

HSV範囲

#1st range of Hue
lower -> [0, 30, 53]
upper -> [20, 150, 255]

#2nd range of Hue (OpenCV converts 360 to 180)
lower2 -> [172, 30, 53]
upper2 -> [180, 180, 210]

完全なコード:

import os, cv2
import numpy as np

image = cv2.imread(os.path.join('skin.png'))

# Covers both range
lower = np.array([0, 30, 53], dtype = "uint8")
upper = np.array([20, 180, 255], dtype = "uint8")

lower2 = np.array([172, 30, 53], dtype = "uint8")
upper2 = np.array([180, 180, 210], dtype = "uint8")

converted = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

skinMask = cv2.inRange(converted, lower, upper)
skinMask2 = cv2.inRange(converted, lower2, upper2)

#Gaussian Blur
skinMask = cv2.GaussianBlur(skinMask, (3, 3), 0)
skinMask2 = cv2.GaussianBlur(skinMask2, (3, 3), 0)

skin1 = cv2.bitwise_and(image, image, mask = skinMask)
skin2 = cv2.bitwise_and(image, image, mask = skinMask2)
skin = cv2.bitwise_or(skin1,skin2) #adding both ranges

# show the skin in the image along with the mask
cv2.imshow("images", np.hstack([frame, skin]))
cv2.waitKey(0)
于 2021-10-06T08:41:15.070 に答える