2

一部の画像セグメンテーション作業では、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);

これで、色相平面は完全に黒くなりましたが、彩度と明度平面は問題ないように見えます…</p>

4

2 に答える 2

2

エラーは、CVMat のベクトルを cvSplit に渡していることです。ここを見てみてください: http://docs.opencv.org/modules/core/doc/operations_on_arrays.html?highlight=cvsplit

于 2012-11-29T14:11:20.557 に答える
1

それでも行列を格納するためにベクトルを使用したい場合は、それらを事前に割り当てる必要があります (たとえば、vector< Mat > hslChannels(3) は Mat 型のベクトルに 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);
于 2015-03-24T02:07:56.473 に答える