3

私はopenCVで作業しており、2つの3チャンネルRGB画像を1つの6チャンネル画像に結合する必要があります。それらをどのように組み合わせていくのか正確にはわかりません。何か案は?

4

2 に答える 2

2

まず、宛先マトリックスを作成する必要があります。最大(512) チャンネル
cv::Matの画像を作成できます。 たとえば、6 つの 8 ビット チャネルを持つ 640x480 の画像です。より一般的には、 入力が与えられると、適応する宛先マトリックスを取得できます。CV_CN_MAX
cv::Mat(cv::Size(640,480),CV_8UC(6))s

cv::Mat(s.size(), CV_MAKETYPE(s.depth(), 6))

データ型cv::Matコンストラクターを参照してください。

Mat::convertTo両方の入力画像が同じ形式であることを確認するために使用したい場合があります。その後、 mixChannelsを使用します。

mixChannels(const Mat *     src,
    size_t      nsrcs,
    Mat *   dst,
    size_t      ndsts,
    const int *     fromTo,
    size_t      npairs 
)   

2 つのソース イメージをコンテナーに配置する必要があります (マトリックスを割り当てると、明示的に要求されない限り、イメージ バッファーをコピーすることなく、新しいヘッダーが作成されることに注意してください)。

最後from_toに、チャネル マッピングを使用してベクトルを作成します。s0 と s1 の入力画像が与えられ、次のマッピングを目指します。

s0 red   -> 1st output channel
s0 green -> 2nd
s0 blue  -> 3rd
s1 red   -> 4th
s1 green -> 5th
s1 blue  -> 6th

最終的なコードは次のようになります。

std::vector<cv::Mat> s;
s.resize(2); //Or `push_back` your 2 input images
s[0] = ...   //1st input image
s[1] = ...   //2nd input image
auto d = cv::Mat(s[0].size(), CV_MAKETYPE(s[0].depth(), 6));

int from_to[] = { 0,0, 1,1, 2,2, 3,3, 4,4, 5,5 };
cv::mixChannels(s.data(), s.size(), &d, 1, from_to, 6);
于 2012-05-14T02:09:00.613 に答える
-1

splitは、画像を単一チャネル画像の配列に分割し、mergeはそれらを任意の順序で元に戻します。より効率的ですが、2つのより複雑な組み合わせであるmixchannels()もあります

理論的には、opencvは任意の数のチャネルで機能しますが、関数の多くは1つまたは3つ(つまり、灰色または「通常の」色)でしか機能しないと思います。

于 2012-05-13T23:28:38.647 に答える