- 我想将BGR图像转换为ABGR/ARGB。在opencv中有BGR2RGBA的转换,但没有BGR2ABGR或BGR2ARGB。
- 使用opencv或其他方法都可以实现吗?
通过使用 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
到2
,通道号3
将被复制到输出的通道号0
。
另外,我们还可以将图片通道分离、交换所需的通道和合并。下面是操作步骤:
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);
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);
BGR2BGRA
转换,然后使用mixChannels
来重新排列通道。 - sgarizvi