1

Hello!
I would like to understand precisely how Kinovea defines the origin point (0,0) when the coordinate system is set to the center of the image, especially in videos with even resolutions such as 1920x1080 pixels.

By looking at the camera calibration parameters (cx = 960.0, cy = 540.0), it appears that the Cartesian origin (0,0) is placed exactly between pixels 959/960 (X axis) and 539/540 (Y axis). This suggests that Kinovea uses a continuous (subpixel) coordinate system, where (0,0) does not lie on a single specific pixel but in an intermediate position.

My question is: What is the exact value that Kinovea uses internally to represent the (0,0) point in image coordinates?

2

Hi, sorry for the late response.

In general users don't see or use the image based coordinates. The pixel coordinates (when there is no calibration) is aligned to the bottom-left of the pixels, not to their centers.
There are several confounding factors, in particular the way the image is painted on screen with pixel offset and bilinear interpolation. But arithmetic between pixel locations should work the same. Several functions return fractional pixel positions (zooming in, tracking, calibration).

It's hard to describe without making things even more confusing, so I'll post an image. This is a 4x4 image magnified, with the 4 center pixels colored in. I disabled pixel offset and bilinear interpolation (this could be an option if you need this for research). In yellow is Kinovea default coordinate system.

https://www.kinovea.org/screencaps/2024.1/pixel-grid-coordinates.png

So if your image coordinates start at the top-left of the top-left pixel, then the center is at 2, 2. This is what the KVA file will store in the calibration node. If your image coordinates start at the center of the top-left pixel, then the center is at 1.5, 1.5, which is maybe what you expected.

But as mentioned this is confounded by the rendering options, pixel offset mode will make it so everything is pre-offset by half a pixel, this is relevant when the user selects locations in the image. I'm not saying this is bug-free, but the tracking work done last autumn makes me think there is no issue that would be as large as a half pixel, let me know if you find something problematic.

I think the only moment where this would be relevant is if you have an external system giving you pixel-based coordinates.

3

Hi, thank you in advance for your attention!

I'm currently using Kinovea for a biomechanics research project and would like to clarify some specific technical details.

To better illustrate my question, I created and attached an image with three examples labeled A, B, and C:

https://prnt.sc/G_U8UNLCB57E

    Image 1 (Point A): A black dot is placed exactly at integer coordinate (1, 1).
    My question is: when I click exactly on this position, does Kinovea return the value (1.0, 1.0)? Or is there some internal offset (like 0.5) being applied that alters the reported value?

    Image 2 (Point B): A white dot is placed near (-1, -1).
    In this case, what is the actual coordinate that Kinovea returns when I click this position? Is it truly (-1.0, -1.0), or a slightly shifted value due to interpolation or pixel offset logic?

    Image 3 (Point C): A point is selected near (0.15, 0.5) in the zoomed-in view.
    Does Kinovea actually support and store subpixel values like this (e.g., 0.15), ?

Based on these examples, I would greatly appreciate if you could help me understand:


    How does Kinovea handle subpixel precision?
    If I click somewhere between pixels, does the software interpolate and return floating point coordinates (e.g., 0.33, 1.72)? If so, how is this value determined — visually, through bilinear interpolation, ?

    Are the options “pixel offset” and “bilinear interpolation” configurable in the interface or settings?
    I'd like to experiment with turning them on and off, but I wasn't able to locate a toggle. Are these options exposed to the user?

    What differences should I expect in the returned coordinates for points A, B, and C with these options enabled or disabled?

Thank you again for developing such a powerful and user-friendly tool. I'm trying to ensure the greatest possible precision in my workflow, and these clarifications would be incredibly helpful