2016-03-02 1 views
1

У меня есть этот Matlab код, чтобы найти маску (skin) пикселя со значениями внутри диапазонов для Н и S каналов моего HSV изображения hsv_im:Matlab для OpenCV: маска пикселей со значением внутри диапазона

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)); 

Мне нужно перенести это на OpenCV. Пока у меня есть это:

float h_range[2] = {0.02, 0.085}; 
    float s_range[2] = {0.18, 0.754}; 

    vector<Mat> channels; 
    split(imageHSV, channels); 
    Mat H = channels[0]; 
    Mat S = channels[1]; 

но я не смог сделать все остальное.

ответ

1

Я предполагаю, что ваш imageHSV имеет значения в диапазоне [0,1], иначе вам просто нужно изменить значения диапазона. Это связано с тем, что в Matlab изображения обычно находятся в диапазоне [0,1], а в OpenCV в диапазоне [0,255].

На самом деле для HSV изображений это немного отличается:

  • Если imageHSV имеет тип CV_8UC3, то диапазоны: H в [0,180], S и V в [0,255].
  • Если imageHSV имеет тип CV_32FC3, допустимые диапазоны для OpenCV являются: H в [0,360], S и V в [0,1].

Вы можете сделать это с помощью inRange. Просто определите нижний и верхний диапазоны для 3-х каналов. Позаботьтесь о корректировке диапазона Matlab для OpenCV:

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 
Смежные вопросы