为什么在OpenCV中访问像素时应该使用(y,x)而不是(x,y)?

3
我需要使用openCV访问图像中的像素,但是一开始无法实现,因为Python告诉我要访问的值超出了范围。后来我搜索了这个错误,发现我应该使用`image[y, x]`而不是`image[x, y]`来访问像素。
我在这个页面的注释中找到了这条信息,但没有解释:https://www.pyimagesearch.com/2016/02/01/opencv-center-of-contour/ Adrian Rosebrock于2016年2月12日下午3:19写道:
当在OpenCV + NumPy中访问像素值时,实际上应该按(y,x)顺序而不是(x,y)顺序指定它们。 因此,您需要使用:`image[cY,cX]`。
那么问题是...为什么访问像素时应该反转坐标轴?

3
除了Fortran之外,大多数编程语言以行优先的方式存储矩阵,因此索引为“行,列”,也就是“y,x”。 - Paul R
5
OpenCV使用矩阵符号表示图像(在C++中甚至称之为cv::Mat),这意味着(行,列)。然而,对于点,它们使用笛卡尔坐标系,即(x,y)。在开始时可能有些混淆。 - api55
1
@PaulR 谢谢您为这个问题命名! - gabt
我认为这是由于矩阵表示的原因,因为在OpenCV中,图像被表示为矩阵:https://dev59.com/D18e5IYBdhLWcg3wja1I#25644503 - Micka
@Micka,感谢你所提供的解释。我会去研究一下! - gabt
显示剩余2条评论
1个回答

1
在评论中找到答案。它与语言如何存储矩阵有关:
除了Fortran外,大多数语言按行主顺序存储矩阵,因此索引为行、列,也就是y、x。- Paul R 2月6日8:30

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接