In the game Elite Dangerous, which is an online spaceflight-based sandbox game set in a procedurally-generated galaxy, one of the most profitable in-game occupations is mining commodities from asteroids in the rings of certain planets. Because mining can be so profitable, it is widely used to gather in-game currency to fund other activities. Many players do not actually enjoy mining, but engage in it solely to fund their preferred gameplay, so Credits per Hour are very important to them.
The content of the ring asteroids is constant, as is their position in 3-dimensional space over time, however many rotate in-place at a constant rate around a constant axis. Rings are effectively circles with no centre thousands of kilometers wide, and are around ten kilometers thick.
I believe that the pattern of asteroids in the rings may repeat, though the mineable content of the asteroids may not repeat, or may repeat over multiple repeats of the basic 'tile(s)'... Determining that is part of the point of this project.
Elite Dangerous logs many things that are encountered in-game, but ring mining activities are not logged, nor is there any coordinate system accessible to the players.
The mining process involves dropping out of supercruise (a rapid travel mechanism) near a ring, flying to that ring, and identifying suitable asteroids to mine, either by randomly prospecting nearby asteroids until suitable asteroids are found, or by pre-mapping high-yield asteroids by the expedient of screenshots, and using them in conjunction with fixed points of reference to orient oneself and find and mine each successive high-yield asteroid. There are a limited number of asteroid shapes, and all asteroids in a ring are similarly coloured, except when a pulse-wave scanner is used, which turns certain asteroids different colours according to their content.
Once mapped, a player could drop into a mapped area, and the companion software would highlight each asteroid according to its status, and point the player to the next most profitable asteroid.
So, that being the background, this is the problem that I wish to solve: I would like to write a companion application to Elite Dangerous that uses image processing techniques and optical character recognition to screen-scrape the relevant ring metadata. Whenever a player running this companion app drops into a ring, it should use photogrammetry to locate the player within an existing map or begin constructing a new map. Whenever an asteroid is prospected, the app should be able to log the asteroid's content and associate it with the relevant asteroid.
In order to write this application, (using C#.NET), I need to know the best approach to using photogrammetry to map a ring in as close to realtime as possible. Are there any algorithms or APIs that would be particularly suitable for this task? Do any of them lend themselves to GPU processing? I would prefer free open source solutions, given that this will most likely be freeware.
I don't need to discuss OCR... just photogrammetry of the ring asteroids.
The algorithm need not map the shape of each asteroid in any great detail, it need only place each asteroid reasonably accurately within 3d space. The shape and position of asteroids is constant,with the exception of rotation, and the content of asteroids can be identified by position alone. As some asteroids rotate very slowly, and are highly irregular in shape, attempting to identify the shape of the asteroids would be unnecessary work.
Additionally, since edge detection was mentioned, Elite Dangerous has a "night vision" mode which functionally highlights the edges of objects. It is entirely acceptable to require players using the proposed application to activate that feature, since much mining is done with it activated anyway.