2014-10-21 5 views
2

Чтобы отделить оттенок канала от HSV изображения, here это код, используя mixChannels функцию:OpenCV сплит против mixChannels

/// Transform it to HSV 
cvtColor(src, hsv, CV_BGR2HSV); 

/// Use only the Hue value 
hue.create(hsv.size(), hsv.depth()); 
int ch[] = { 0, 0 }; 
mixChannels(&hsv, 1, &hue, 1, ch, 1); 

Но я знаю split функция может также сделать это:

vector<Mat> chs; 
split(hsv, chs); 
Mat hue = chs[0]; 

Это ОК? Если это то же самое, я думаю, что метод разделения более чист. Я прав?

+1

Вы довольно правы, 'split()' используется для разделения всех каналов многоканальной матрицы на одноканальные матрицы. С другой стороны, если вас интересует только один канал, вы можете использовать 'mixChannels()'. Таким образом, вам не нужно выделять память для других каналов, как в случае с 'split()'. – bikz05

+0

Хороший ответ! Вы можете ответить на него, чтобы я мог принять его. – tidy

ответ

6

Вы в значительной степени правы, split() используется для разделения всех каналов многоканальной матрицы на одноканальные матрицы. С другой стороны, если вас интересует только один канал, вы можете использовать mixChannels(). Таким образом, вы не должны выделять память для других каналов, как и в случае с split().

4

Держите вещи простыми и используйте extractChannel, которые обертывают mixChannels для вас.

cv::Mat hue; 
int cn = 0; // hue 
cv::extractChannel(hsv, hue, cn);