使用opencv将图像从BGR转换为ARGB

时间:2016-04-22 07:13:34

标签: c++ opencv image-processing

  • 我想将BGR图像转换为ABGR / ARGB。在opencv中有转换BGR2RGBA但不是BGR2ABGR或BGR2ARGB。
  • 可以使用opencv或使用任何其他方法吗?

2 个答案:

答案 0 :(得分:4)

可以通过使用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数组是映射函数,它指定将来自源的哪些通道复制到目标图像的哪些通道。这些对表示输入的频道号0将被复制到输出的频道号3112到{{1并且,频道号2将被复制到输出的频道号3

或者,我们可以拆分图像通道,交换所需的通道并再次合并。它可以按如下方式完成:

0

答案 1 :(得分:2)

OpenCV不支持ARGB或ABGR格式,因此您将无法显示它或使用其中的某些功能......但是,可以使用split和{{{{}}创建它们。 3}} 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); 

使用函数merge可以更快地完成(也许它会更短),但我会说这个更容易混淆。