为什么OpenCV使用BGR而不是RGB?

Posted MrCharles

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么OpenCV使用BGR而不是RGB?相关的知识,希望对你有一定的参考价值。

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

Satya Mallick

早期的开发者选择了BGR,为啥选择BGR呢?那时候流行的相机制造商和软件商都是用这个模式,例如微软使用的是BGR,微软的软件里面COLORREF的值的格式为0x00bbggrr。所以从那时候起,opencv就一直使用BGR。现在我们也还是使用BGR,这种反人类的设计,只能去习惯它(当然,早期它并不绝对反人类)。

“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?的主要内容,如果未能解决你的问题,请参考以下文章

opencv中为啥图像局矩阵是以BGR而不是RGB显示像素的大小?

OpenCV 中的通道顺序

在 OpenCV 中将 YUV 转换为 BGR 或 RGB

OpenNI RGB 图像到 OpenCV BGR IplImage 的转换?

Python OpenCV - imshow 不需要从 BGR 转换为 RGB

python Python opencv bgr2rgb