【问题标题】:why should I use (y,x) instead of (x,y) to access a pixel in opencv?为什么我应该使用(y,x)而不是(x,y)来访问opencv中的像素?
【发布时间】:2019-02-06 08:28:53
【问题描述】:

我必须使用 openCV 将像素访问到图像中,但起初我无法访问,因为 python 告诉我我想要访问的值超出了范围。

然后我搜索了这个错误,发现我应该使用image[y, x]而不是image[x, y]来访问一个像素。

我在这个页面的cmets中找到了这条信息,但是没有解释: 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]

那么,问题是......为什么我要在尝试访问像素时反转坐标?

【问题讨论】:

  • 除 Fortran 外,大多数语言以行优先顺序存储矩阵,因此索引为 row, column,又名 y, x
  • OpenCV 对图像使用矩阵表示法(在 C++ 中甚至调用 cv::Mat),这意味着 (row,column)... 但是对于点,它们使用笛卡尔坐标,即 (x,y)。一开始有点混乱
  • @PaulR 感谢您为问题命名!
  • 我认为是因为矩阵表示,因为在opencv中,图像被表示为矩阵:stackoverflow.com/questions/25642532/…
  • 非常简短的回答是,您只需要忍受他们是如何做到的......以及 BGR 而不是 RGB 通道排序。我想这是你为所有性能付出的代价:-)

标签: python-3.x numpy opencv


【解决方案1】:

在 cmets 中找到答案。它与语言存储矩阵的方式有关:

除了 Fortran,大多数语言以行优先顺序存储矩阵, 所以索引是行,列,又名y,x。 – Paul R 2 月 6 日 8:30

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2019-05-13
    • 2015-12-02
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多