早前 windows 下,不管是摄像头制造者,还是软件开发者,当时流行的都是 BGR 格式的数据结构,后面 RBG 格式才逐渐开始流行,所以当时的 opencv 选择了使用 BGR 格式,这个是 opencv 在发展过程中的历史遗留问题。
而 Caffe 作为最早流行的代表,它又基于 opencv,所以也跟着使用了 BGR。
其实自己训练的时候完全可以使用 RGB,新库也不存在是 RGB 还是 GBR 这个问题。但如果使用的是别人训练好的模型,就要注意一下使用的是 RGB 还是 GBR。
示例:第 1 行第 1 列上的像素 R = 1,G = 2,B = 3,转换后 R = 3,G = 2,B = 1。
import numpy as np
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]])
print(str(a.shape))
print(str(a))
a = a[:,:,::-1]
# a = a.transpose((2,0,1))
print(str(a.shape))
print(str(a))
# 转换前
(3,2,3)
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]
[[13 14 15]
[16 17 18]]]
# 转换后
(3,2,3)
[[[ 3 2 1]
[ 6 5 4]]
[[ 9 8 7]
[12 11 10]]
[[15 14 13]
[18 17 16]]]
总结:RGB 和 BGR 的转换可以直接使用cvt = org[:,:,::-1]来实现,前两个:表示第一第二维不变,::-1表示将第三维倒序排列。