https://www.learnopencv.com/why-does-opencv-use-bgr-color-format/

原因其实很简单啊,这个解释非常的风趣,“古罗马的马屁股”。

One of the elements of good design is the principle of least astonishment ( a.k.a principle of least surprise). A good intuitive design makes the user not think.
When you see a handle on a door, you want to pull it. When you see a door with a metal plate, you want to push it. Those are the expectations of a user of the door and when the designer of a door respects these expectations, a user can use the door without exerting any mental energy. But if the design is inconsistent with a user’s expectation, a simple act of opening a door can become a mental burden.
OpenCV is a very useful library, but when it comes to the principle of least surprise, it is an unqualified disaster. When I am writing Computer Vision code in MATLAB, I rarely refer to the documentation. While working with OpenCV, I have the docs permanently open in a browser tab.
OpenCV seems to have been built with the principle of maximum surprise in mind! And it all begins with the default BGR pixel format. It does not play well with libraries that use the standard RGB pixel format. E.g. when you try to display an image using matplotlib after reading it using imread in OpenCV, the result looks funny.
“Why not use RGB when everybody else and their aunts use RGB?”
This is the question I asked Dr. Gary Bradski, founder of OpenCV, when I met him at a conference a few months back, although I left out the part about everybody and their aunts using RGB. He answered my question with another question.
“Why is the the US standard railroad gauge 4 feet, 8.5 inches?”
The answer to that question of course is “Because of Roman horse’s ass!”
For people who do not know this not-so-true story, I have copied the following from snopes
The US standard railroad gauge (width between the two rails) is 4 feet, 8.5 inches. That’s an exceedingly odd number. Why was that gauge used?
Because that’s the way they built them in England, and the US railroads were built by English expatriates.
Why did the English build them like that? Because the first rail lines were built by the same people who built the pre-railroad tramways, and that’s the gauge they used.
Why did “they” use that gauge then? Because the people who built the tramways used the same jigs and tools that they used for building wagons which used that wheel spacing.
Okay! Why did the wagons have that particular odd wheel spacing? Well, if they tried to use any other spacing, the wagon wheels would break on some of the old, long distance roads in England, because that’s the spacing of the wheel ruts.
So who built those old rutted roads? The first long distance roads in Europe (and England) were built by Imperial Rome for their legions. The roads have been used ever since. And the ruts in the roads? Roman war chariots first formed the initial ruts, which everyone else had to match for fear of destroying their wagon wheels. Since the chariots were made for (or by) Imperial Rome, they were all alike in the matter of wheel spacing.
The United States standard railroad gauge of 4 feet, 8.5 inches derives from the original specification for an Imperial Roman war chariot. Specifications and bureaucracies live forever. So the next time you are handed a specification and wonder what horse’s ass came up with it, you may be exactly right, because the Imperial Roman war chariots were made just wide enough to accommodate the back ends of two war horses. Thus, we have the answer to the original question.

Now the twist to the story . . .
There’s an interesting extension to the story about railroad gauges and horses’ behinds. When we see a Space Shuttle sitting on its launch pad, there are two big booster rockets attached to the sides of the main fuel tank. These are solid rocket boosters, or SRBs. The SRBs are made by Thiokol at their factory in Utah. The engineers who designed the SRBs might have preferred to make them a bit fatter, but the SRBs had to be shipped by train from the factory to the launch site. The railroad line from the factory had to run through a tunnel in the mountains. The SRBs had to fit through that tunnel. The tunnel is slightly wider than the railroad track, and the railroad track is about as wide as two horses’ behinds.
So, the major design feature of what is arguably the world’s most advanced transportation system was determined over two thousand years ago by the width of a Horse’s Ass!
Why did they choose BGR color space in OpenCV ?
The reason the early developers at OpenCV chose BGR color format is that back then BGR color format was popular among camera manufacturers and software providers. E.g. in Windows, when specifying color value using COLORREF they use the BGR format 0x00bbggrr.
BGR was a choice made for historical reasons and now we have to live with it. In other words, BGR is the horse’s ass in OpenCV.

为什么opencv使用BGR 格式,而不是RGB格式?相关推荐

  1. 使用C++实现YUV格式图像与RGB格式图像之间相互转换

    使用C++实现YUV格式图像与RGB格式图像之间相互转换 一.RGB与YUV转换公式 1.RGB转YUV 1)RGB转换亮度与色差信号公试: 2)归一化为YUV的转化公试为: 2.YUV转RGB 二. ...

  2. YUV格式文件转RGB格式

    网上已知YUV转RGB公式为: R = Y + 1.4075 *(V-128) G = Y – 0.3455 *(U –128) – 0.7169 *(V –128) B = Y + 1.779 *( ...

  3. 【DSP开发】【VS开发】YUV与RGB格式转换

    [视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...

  4. 随机颜色十六进制(#ffffff)或rgb格式

    // 定义一个随机颜色的函数 function getRandomColor(flag = true) { // 如果是true就传递 #ffffff格式,否则传rgb格式 if (flag) { l ...

  5. python使用openCV加载图像、并将BGR格式转换成HSV格式、定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)、并使用mask信息进行颜色分离、BGR格式的图像转化为RGB、并可视化

    python使用openCV加载图像.并将BGR格式转换成HSV格式.定义HSV格式中需要分离颜色的掩码(掩模)区间(mask).并使用mask信息进行颜色分离.将BGR格式的图像转化为RGB.可视化 ...

  6. OpenCV读出来的是按BGR存储的,如何转变成传统的RGB格式

    opencv 视频帧的数据是按按BGR存储的,想转变成传统的RGB格式便于和其他库对接使用 方法1 核心代码 cv2.cvtColor(Frame,cv2.COLOR_BGR2RGB) ,其中 Fra ...

  7. 在Python中使用OpenCV将RGB格式的图像转换为HSV格式的图像

    An HSV is another type of color space in which H stands for Hue, S stands for Saturation and V stand ...

  8. python–颜色英文与RGB格式互转

    python–颜色英文与RGB格式互转 使用pip安装webcolors pip install webcolors 1- 导入webcolors import webcolors 2-英文转RGB ...

  9. YUV / RGB 格式及快速转换

    YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大. YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很 ...

最新文章

  1. 计算机游戏第72关,史上最难的游戏第72关 第72关通关攻略
  2. vs2017编写python_VS2017+VC-LTL编译Python-3.6.4源代码
  3. [大话数据结构-读书笔记] 栈
  4. 自然语言处理之长短时记忆网络(六)
  5. Echarts在手机端y轴数据过大,显示不全
  6. node.js基础:数据存储
  7. JS之Promise
  8. charles 华为手机使用_华为手机EMUI9.0健康使用手机怎么用?如何控制手机使用时长?...
  9. Facebook泄露隐私算什么?国内一次外卖,竟让4万用户全“裸着”
  10. maven中的snapshot来源与注意事项
  11. 【Python】Python3.7.3 - 虚拟环境:pyvenv过时;使用python -m venv命令
  12. java 合并算法思想_Java实现合并两个有序序列算法示例
  13. gcc中的结构体成员位域
  14. 用MySQl创建供应商标_建立一个供应商、零件数据库。其中供应商表S(Sno,Sname,Zip - 问答库...
  15. 算法面试避坑指南,助你轻松应对Java面试
  16. 20139216网络攻防技术第七次作业
  17. java计算机毕业设计易医就医购药交互平台源码+系统+mysql数据库+lw文档
  18. 现金流量表的编制 (by shany shang)
  19. YTU 2577: 小数计算——结构体
  20. 在oled屏幕上显示汉字

热门文章

  1. 关于 The RPC server is unavailable
  2. ESLint : Expected linebreaks to be 'LF' but found 'CRLF' linebreak-style
  3. EPICS calc模块中aCalcout记录介绍
  4. ln火线零线_插座ln哪个是火线零线 插座怎么买
  5. ADS进行射频电路设计和仿真
  6. 基于PaddleHub的虚拟粉圈微博生成
  7. C语言指针数组和数组指针详解
  8. Homebrew更换国内镜像源(中科大、阿里、清华)
  9. 使用Django1.7开发熙鱿记官网
  10. QSettings 类【官翻】