Introduction:
When working with OpenCV, you may have noticed that accessing pixels in an image matrix (cv::Mat) using Point(x,y) coordinates seems counterintuitive, as (x,y) might not refer to row and column as you expect. This article aims to clarify this apparent inconsistency.
Understanding Coordinate Systems:
In mathematics, matrices are commonly accessed using row-major ordering, where the first index represents the row and the second index represents the column. Points, on the other hand, follow the Cartesian coordinate system, where (x,y) typically designates the horizontal (abscissa) and vertical (ordinate) axes, respectively.
OpenCV's Matrix vs. Coordinate System:
cv::Mat, used for both images and matrices in OpenCV, is essentially a matrix. However, when accessing its elements, it follows row-major ordering. Therefore, mat.at
However, the Point class in OpenCV is based on image notation, where (x,y) refers to the column and row, respectively. This means that Point(i,j) in an image context will refer to the pixel in row j and column i.
Why the Difference?
The reason for this inconsistency lies in the different coordinate systems used for matrices and points. Matrices prioritize row-major ordering for mathematical reasons, while points prioritize image notation for easier visualization and comprehension of images.
Conclusion:
While the different coordinate systems in OpenCV can initially be confusing, understanding their underlying logic will ensure you correctly access and manipulate pixel data. Remember that mat.at
The above is the detailed content of OpenCV's Point(x,y): Column-Row or Row-Column?. For more information, please follow other related articles on the PHP Chinese website!