OpenCV C ++: конвертировать RGBA в HSL, а затем разделять каналы

Для некоторой работы по сегментации изображения я хотел бы использовать канал яркости изображения в цветовом пространстве HSL.

Для этого я конвертирую изображение RGBA в RGB, а затем в HSL. После преобразования цвета я разделил изображение на цветовые плоскости, используя cv::mixChannels, который дает мне черный выход для плоскости насыщенности / яркости.

Код:

cv::Mat src;
cv::Mat hsl;

cv::cvtColor(srcRgba , src , CV_RGBA2RGB);
cv::cvtColor(src, hsl, CV_RGB2HLS);

cv::Mat hue = cv::Mat::Mat(hsl.size(), hsl.depth());
cv::Mat saturation = cv::Mat::Mat(hsl.size(), hsl.depth());
cv::Mat lightness = cv::Mat::Mat(hsl.size(), hsl.depth());

cv::Mat matsOut[] = { hue, saturation, lightness };

// hsv[0] => hue[0], hsv[1] => saturation[0], hsv[2] => lightness[0]
int ch[] = { 0,0, 1,0, 2,0 };

// number of elements in hsl -> 1
// number of elements in matsOut -> 3
// number of pairs in ch -> 3
cv::mixChannels(&hsl, 1, matsOut, 3, ch, 3);

Может я что-то напутал с cv::mixChannels?

РЕДАКТИРОВАТЬ

Это cv::split код, который я использовал, и ошибка Xcode дает мне:

Код:

cv::Mat src;
cv::Mat hsl;

cv::cvtColor(srcRgba , src , CV_RGBA2RGB);
cv::cvtColor(src, hsl, CV_RGB2HLS);

std::vector<cv::Mat> hslChannels;
cv::split(hsl, hslChannels);

Ошибка:

Undefined symbols for architecture x86_64:
"cv::split(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&)", referenced from:
hsvTest(cv::Mat) in test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

РЕДАКТИРОВАТЬ 2

Понял, это работает:

cv::Mat src;
cv::Mat hsl;

cv::cvtColor(srcRgba , src , CV_RGBA2RGB);
cv::cvtColor(src, hsl, CV_RGB2HLS);

cv::Mat hslChannels[3];
cv::split(hsl, hslChannels);

Теперь плоскость оттенка полностью черная, но плоскость насыщенности и легкости выглядит хорошо …

2

Решение

Ошибка в том, что вы передаете в cvSplit вектор CVMat. Попробуйте посмотреть здесь:
http://docs.opencv.org/modules/core/doc/operations_on_arrays.html?highlight=cvsplit

2

Другие решения

Если вы все еще хотите использовать вектор для хранения матриц, вам необходимо предварительно выделить их (например, вектор< Mat> hslChannels (3) создаст 3 элемента в векторе типа Mat.)

Итак, ваш код будет:

cv::Mat src;
cv::Mat hsl;

cv::cvtColor(srcRgba , src , CV_RGBA2RGB);
cv::cvtColor(src, hsl, CV_RGB2HLS);

std::vector<cv::Mat> hslChannels(3);
cv::split(hsl, hslChannels);
1

По вопросам рекламы [email protected]