2016-03-02 32 views
1

我有這樣的Matlab代碼以找到像素的掩模(skin)與範圍爲我的HSV圖像hsv_im的H和S通道內的值: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圖像,這是一個稍有不同:

  • 如果imageHSVCV_8UC3類型的,則該範圍是:在H [0180],SV在[0,255]。
  • 如果imageHSVCV_32FC3類型,OpenCV的有效範圍是:在H [0360],SV在[0,1]。

可以使用inRange做到這一點。只需定義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