C++ Matlab到OpenCV:值在某个范围内的像素掩码

C++ Matlab到OpenCV:值在某个范围内的像素掩码,c++,matlab,opencv,computer-vision,C++,Matlab,Opencv,Computer Vision,我用这段Matlab代码找到像素的遮罩(skin),其值在我的HSV图像的H和S通道的范围内HSV_im: h_range = [0.02 0.085]; s_range = [0.18 .754]; H = hsv_im(:,:,1); S = hsv_im(:,:,2); %targets skin by only selecting values within the rectangle skin range skin = (S>s_range(1) & S<s_

我用这段Matlab代码找到像素的遮罩(
skin
),其值在我的HSV图像的H和S通道的范围内
HSV_im

h_range = [0.02 0.085]; 
s_range = [0.18 .754];

H = hsv_im(:,:,1);
S = hsv_im(:,:,2);

%targets skin by only selecting values within the rectangle skin range
skin = (S>s_range(1) & S<s_range(2) & H>h_range(1) & H<h_range(2));
h_范围=[0.02 0.085];
s_范围=[0.18.754];
H=hsv_im(:,:,1);
S=hsv_im(:,:,2);
%仅通过选择矩形蒙皮范围内的值作为蒙皮的目标

skin=(S>S\u range(1)&Sh\u range(1)&H我假设您的
imageHSV
的值在范围
[0,1]
中,否则您只需要更改范围值。这是因为在Matlab中,图像通常在范围[0,1]中,而在OpenCV中则在范围[0255]中

实际上,对于HSV图像,这有点不同:

  • 如果
    imageHSV
    属于
    CV_8UC3
    类型,则范围为[0180]中的
    H
    ,[0255]中的
    S
    V
  • 如果
    imageHSV
    的类型为
    cv32fc3
    ,则OpenCV的有效范围为:
    H
    in[0360]、
    S
    V
    in[0,1]

您可以使用。只需定义3个通道的下限和上限范围。注意更正OpenCV的Matlab范围:

Mat imgHSV = ... type should CV_32FC3

Mat skin;
inRange(imgHSV, Scalar(0.02, 0.18, 0), Scalar(0.085, 0.754, 1), skin);
//                      h     s    v            h      s    v
//                      lower range              upper range

// skin will be a binary mask of type CV_8UC1, with values either 0 or 255
Mat imgHSV = ... type should CV_32FC3

Mat skin;
inRange(imgHSV, Scalar(0.02, 0.18, 0), Scalar(0.085, 0.754, 1), skin);
//                      h     s    v            h      s    v
//                      lower range              upper range

// skin will be a binary mask of type CV_8UC1, with values either 0 or 255