OpenCV假定通道顺序为BGR(或BGRA)。
你可以使用cv::cvtColor
将输入更改为BGRA。
第三个参数 code
应该是cv::ColorConversionCodes
中的值之一,例如: cv::COLOR_RGBA2BGRA
(似乎是您所需要的)。
更新:
根据OP在下面的评论中指出他的输入实际上是ARGB (而不是RGBA):
cv::cvtColor
不支持从ARGB到BGRA的转换。
但是你可以使用cv:mixChannels
来进行任意的通道重新排序(fromTo
参数指定重新排序)。
请看下面如何将ARGB转换为BGRA:
#include <vector>
cv::Mat argb; // initialized from your input data
cv::Mat bgra(argb.size(), argb.type());
std::vector<int> fromTo{ 0,3, 1,2, 2,1, 3,0 }; // ARGB->BGRA: 0->3, 1->2, 2->1, 3->0
cv::mixChannels(argb, bgra, fromTo);
如果您的OpenCV版本不支持这种带有std::vector
等参数的cv::mixChannels
函数,那么您可以尝试以下方法:
cv::Mat argb; // initialized from your input data
cv::Mat bgra(argb.size(), argb.type());
int fromTo[] = { 0,3, 1,2, 2,1, 3,0 }; // ARGB->BGRA: 0->3, 1->2, 2->1, 3->0
cv::mixChannels(&argb, 1, &bgra, 1, fromTo, 4);
更新2:
为了将 ARGB 转换为没有 alpha 通道的 BGR,您可以使用以下方式的 cv::mixChannels
:
#include <vector>
cv::Mat argb; // initialized from your input data
cv::Mat bgr(argb.size(), CV_8UC3); // NOTE: the type is CV_8UC3, not argb.type()
std::vector<int> fromTo{ 1,2, 2,1, 3,0 }; // ARGB->BGR: 1->2, 2->1, 3->0
cv::mixChannels(argb, bgr, fromTo);
cvtColor
-- 你的处理可能不在意,但 你 在调用imshow
/imread
来查看图片时会关心。只需按照自己的方式进行处理并保持通道顺序即可。在 AE 中它不会是蓝色的。 - Christoph Rackwitz