答案 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
将被复制到输出的频道号3
,1
到1
,2
到{{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可以更快地完成(也许它会更短),但我会说这个更容易混淆。