为什么OpenCV的颜色格式是BGR?
原文:Why does OpenCV use BGR color format?
翻译:视觉小僧 时间:2017年12月13日
设计的一个基本原则是 Least astonishment ( 也叫 Least surprise)。使设计符合直觉可以让用户不用动脑思考。
当你看到门上的一个把手时,你有去拉的冲动。这是门的使用者的期望,这也是门的设计者应该遵从的期望,用户开关门不需要去动脑。
OpenCV是一个很实用的库,但用Least Surprise 原则去考量这个库的时候,OpenCV是一个很失败的产品。当我用MATLAB写计算机视觉代码的时候,我几乎不看官方技术文档。但我用OpenCV干活时,我不得不打开收藏满基础教程的浏览器以供参考。
看起来OpenCV是以Maximum surprise(反人类)原则设计的库!它使用的是BGR像素格式。例如,你读完OpenCV中 imread 的用法之后,想用matplotlib来显示一张图片,你可能会吐槽:明明所有人(甚至他们的大姨)都用RGB,为毛OpenCV不用RGB?!!
这个问题我问过OpenCV的创始人Gary Bradski博士。几个月之前我在一个会议上见到他,我说所有人都在用RGB格式,他用另一个问题回答的我:为什么美国的铁路标准是4英尺,8.5英寸?
这个问题的答案当然是:罗马帝国的马的屁股!
不知道这个梗的同学看下面的背景资料。
美国的铁路标准宽度是4英尺,8.5英寸。这是个非常奇怪的数字。为什么用这种计量方式?
因为英国就是这么建的,而美国的铁路正好是英国人建的。
为什么英国人这么建铁路?因为第一条铁路线的包工头以前是是铺设电车轨道的。他当时用的就是这种计量方式。
为毛铺电车轨道要这样计量?因为这群人用是以前修建四轮马车用的量具。而马车轮子的间距就是这么大。
好了,为毛马车轮子间距这么奇怪?因为不用这个间距马车轮子就会被干断,因为英国的道路上车辙就是这么大。
那谁铺的这么奇怪的车辙呢?欧洲第一条长距离道路是罗马帝国为了他们的军队建造的。那条路一直被使用。那么车辙怎么出来的?答案是:罗马战车在路上压出来,如果马车轮距与车辙不一致的话,就很有可能导致车毁。于是人们就按照这个间距制造马车。
美国标准间距4英尺,8.5英寸源于罗马帝国战车,这个标准一直流传了下来。罗马战车设置这么宽是为了容纳下两匹马一起拉车。所以,问题解决了~
总结下,世界上最先进的交通系统的主要设计参数竟然起源于两千多年以前的马的屁股!
为什么OpenCV选择BGR颜色空间呢?
早期的OpenCV开发者选择BGR颜色格式的原因在于主流的摄像头制造商和软件供应商都普遍使用这种格式,比如说Windows在用COLORREF描述颜色值的时候用的就是BGR格式: 0x00bbggrr
BGR是历史的选择,我们现在必须适应它。换句话说,BGR是OpenCV马的屁股!