2016-04-22 19 views
3
  • BGR画像をABGR/ARGBに変換したいです。BGR2ABGRやBGR2ARGBではなく、BGR2RGBAが変換されます。
  • opencvでも他の方法でも可能ですか?
+1

をミックスチャンネル)を使用してチャンネルを並べ替えます。 – sgarizvi

+0

もしチャンネルを並べ替えるとうまくいくでしょうか? – Sagar

+0

正常に動作するはずです。それを試して、何が起こるかを見てください。それがうまくいかない場合は、いつでもチャンネルを分割して並べ替えることができます。 – sgarizvi

答えて

3

次のように必要な操作はcv::mixChannelsを用いて画像チャネルを交換することによって達成することができる。

cv::Mat bgr, bgra; 

//bgr initialization code here... 
//. 
//. 
//. 
cv::cvtColor(bgr, bgra, cv::COLOR_BGR2BGRA); 
cv::Mat abgr(bgra.size(), bgra.type()); 
int from_to[] = { 0,3, 1,1, 2,2, 3,0 }; 
cv::mixChannels(&bgra,1,&abgr,1,from_to,4); 

from_toアレイは、宛先画像のチャンネルにコピーされるソースからのチャネルを指定するマッピング関数です。ペアは、入力のチャンネル番号02への出力の数31から12をチャンネルにコピーされ、チャンネル番号3出力の数0をチャンネルにコピーされることを示します。

また、イメージチャネルを分割し、必要なチャネルを交換して再度マージすることもできます。それは以下のように行うことができます。

あなたは `[` mixChannels`](http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#続いBGR2BGRA`変換を使用することができます
cv::cvtColor(bgr, bgra, cv::COLOR_BGR2BGRA); 

std::vector<cv::Mat> channels_bgra; 
cv::split(bgra, channels_bgra); 

std::vector<cv::Mat> channels_abgr = { channels_bgra[3], channels_bgra[1], channels_bgra[2], channels_bgra[0] }; 
cv::merge(channels_abgr, abgr); 
2

OpenCVのはARGBまたはABGRフォーマットをサポートしていないので、あなたはそれを表示したり、その上の機能の一部を使用することはできません...しかし、のsplitmerge機能でそれらを作成することが可能ですOpenCV。私が何を意味しているかを説明するコードがあります。

cv::Mat src, final_image; 
// fill src as you prefer 
std::vector<cv::Mat> channels; 
cv::split(src, channels); // this will put each channel in a mat in the vector 

// swap or add channels in the vector 
cv::Mat alpha(src.rows, src.cols, CV_8U, cv::Scalar(255)); 
channels.push_back(alpha); 
std::reverse(channels.begin(), channels.end()); //needs <algorithm> 

// merge the channels in one new image 
cv::merge(channels, final_image); 

これは、関数mixChannelsで(多分それだけ短くなります)速く行うことができますが、私はこの1つは少し混乱していることを言うだろう。

関連する問題