2012-11-29 80 views
2

對於某些圖像分割工作,我想在HSL色彩空間中使用圖像的亮度通道。OpenCV C++:將RGBA轉換爲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) 

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

現在色調平面完全是黑色的,但飽和度和亮度平面上尋找好了... ...

回答

1

如果你仍然想使用矢量存儲矩陣,則需要預先分配它們(如矢量<墊> hslChannels(3)將創造型墊的矢量3個元素。 )

所以,你的代碼將是:

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