C++ – OpenCV C++: Convert RGBA to HSL and then split channels

ccolorshslopencv

For some image segmentation work I'd like to use the lightness channel of an image in HSL color space.

To accomplish this I convert a RGBA image to RGB and then so HSL. After the color conversion I split the image into it's color planes using cv::mixChannels, which gives me black output for the saturation / lightness plane.

Code:

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

Maybe I messed something up with cv::mixChannels?

EDIT

This is the cv::split code I used and the error Xcode gives me:

Code:

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

Error:

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)

EDIT 2

Got it, this works:

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

Now the hue plane is completely black, but saturation and lightness plane are looking okay …

Best Answer

The error is that you're passing to cvSplit a vector of CVMat. Try to look here : http://docs.opencv.org/modules/core/doc/operations_on_arrays.html?highlight=cvsplit