Theta-Limited / OpenAthenaAndroid

OpenAthena allows common drones to spot precise geodetic locations
GNU Affero General Public License v3.0
60 stars 6 forks source link

Fix #74: Correct for Lens Distortion for ray angle calculation #91

Closed mkrupczak3 closed 1 year ago

mkrupczak3 commented 1 year ago

AutoPR Running

Fixes #74

Status

This pull request is being autonomously generated by AutoPR.

📖 Looking at files >
> 💬 Asked for InitialFileSelect > > >
> > Prompt > > > > ~~~ > > Hey, somebody just opened an issue in my repo, could you help me write a pull request? > > > > Given context variables enclosed by +-+: > > > > Issue: > > +-+ > > #74 Correct for Lens Distortion for ray angle calculation > > > > mkrupczak3: Our current calculation for ray angle from a selected image point is entirely based on the idealized [pinhole camera model](https://towardsdatascience.com/camera-intrinsic-matrix-with-example-in-python-d79bf2478c12?gi=8bd7b436d2d3). This makes no consideration of the properties of the actual camera lens, which introduces its own image distortion subtly different than may be expected in the pinhole camera model. These distortions may be especially pronounced with fisheye cameras or zoom lenses at larger focal lengths: > > https://en.wikipedia.org/wiki/Distortion_(optics) > > > > This deviation due to distortion is noticeably more pronounced near the edges of images, causing the marked point to deviate from the desired calculated location. > > > > A different project called PIX4D, which is used for drone mapping and photogrammetry, has published how they account for lens distortion. Proper angle calculation is very important for photogrammetry's technique of stitching together images taken from different angles, so we may assume their model is reasonably accurate: > > > > https://support.pix4d.com/hc/en-us/articles/202559089-How-are-the-Internal-and-External-Camera-Parameters-defined > > > > We need to store R₁, R₂, R₃, T₁, and T₂ for common camera models, and use the equations as defined above to apply a correction for lens distortion which then allows us to use the pinhole camera model appropriately for ray angle calculation > > > > @sethgcanada > > > > > > mkrupczak3: It turns out we don't have to re-work these equations like I thought, all that's needed is code to solve for Xd and Yd and use those for trig angle calculation instead of un-corrected Xh and Yh as is done currently > > > > > > mkrupczak3: One implementation problem is that often drone images are scaled up or down from their original size, while the calibrated distortion parameters are in terms of pixels of the image size that was used for calibration. > > > > We cannot assume the size of the image loaded will be the same as the size that the parameters are calculated for (such as if it is automatically scaled down when sent over a messaging app): Therefore it is necessary to adjust the distortion parameters based on the image scale. > > > > Interestingly, the distortion parameters won't scale linearly with the image scale. I haven't checked the math, but I believe they may be defined however, by mathematical formula(s) involving the original parameter and an arbitrary scale value `n` (see the last entry [here](https://chat.openai.com/share/f35a1b48-461c-4dd6-bd44-f19d0fdbe45c)) > > > > In brief, this suggests that the new distortion coefficients for the scaled resolution image could be: > > > > R1' = R1 / n^2 > > R2' = R2 / n^4 > > R3' = R3 / n^6 > > T1' = T1 / n > > T2' = T2 / n > > > > The [existing code in MetadataExtractor.java](https://github.com/Theta-Limited/OpenAthenaAndroid/blob/8ef35c8b48f308b85bb79c288721e707f59184fd/app/src/main/java/com/openathena/MetadataExtractor.java#L785) calculates `scaleRatio` based on the digital zoom (center crop) ratio, the image width, and the expected full resolution width of the image (the vertical size is not used because these pixels are often cropped automatically to make an image fit 16:9 frame). This scale ratio may likely be used as `n` for the equations listed above. > > > > From there, once the distortion equation is applied, Xd and Yd may be calculated, and then the ray angle may be calculated using each of their tangents with the focal length (in pixels) as normal: > > https://github.com/Theta-Limited/OpenAthenaAndroid/blob/8ef35c8b48f308b85bb79c288721e707f59184fd/app/src/main/java/com/openathena/MetadataExtractor.java#L872 > > > > > > mkrupczak3: Another really good description of the math of image distortion: > > > > https://www.mathworks.com/help/vision/ug/camera-calibration.html#:~:text=The%20intrinsic%20parameters%20represent%20the,plane%20using%20the%20intrinsics%20parameters. > > > > > > mkrupczak3: Oh, @sethgcanada forgot to mention, there are two different distortion models depending on the type of lens: `perspective` or `fisheye`. See [the earlier page from PIX4D](https://support.pix4d.com/hc/en-us/articles/202559089-How-are-the-Internal-and-External-Camera-Parameters-defined) for the relevant equations for each. > > > > While the scale equations for perspective lenses are as described above, you will need to do some linear algebra to determine the appropriate image scale conversions for `c`, `d`, `e`, and `f` if the lensType is a fisheye camera and the image resolution is scaled different from what is expected. > > > > Here's an example of what the JSON entries for a `perspective` and a `fisheye` camera will look like: > > > > `perspective`: > > ```JSON > > { > > "makeModel": "skydio2", > > "isThermal": false, > > "ccdWidthMMPerPixel": "6.14571/4056.0", > > "ccdHeightMMPerPixel": "4.504078/3040.0", > > "widthPixels": 4056, > > "heightPixels": 3040, > > "comment": "Skydio 2 and 2+ Sony IMX577 1/2.3” 12.3MP CMOS", > > "lensType": "perspective", > > "radialR1": 0.134437, > > "radialR2": -0.24607, > > "radialR3": 0.104529, > > "tangentialT1": -0.000175531, > > "tangentialT2": -0.000580392 > > } > > ``` > > > > `fisheye`: > > ```JSON > > { > > "makeModel": "parrotBEBOP 2", > > "isThermal": false, > > "ccdWidthMMPerPixel": "5.7344/4096.0", > > "ccdHeightMMPerPixel": "4.648/3072.0", > > "widthPixels": 4096, > > "heightPixels": 3072, > > "comment": "1/2.3in 14 MP unnamed sensor", > > "lensType": "fisheye", > > "c": 1101.96, > > "d": 0.0, > > "e": 0.0, > > "f": 1101.96 > > } > > ``` > > > > For example: in `MetadataExtractor.java`, to get the `JSONObject` matching the `ExifInterface` `exif` of an image being analyzed you would run the following: > > ``` > > JSONObject matchingDrone = getMatchingDrone(exif); > > ``` > > > > From there, to obtain the `lensType` String you would run: > > ``` > > String lensType = matchingDrone.getString("lensType"); > > ``` > > > > All the necessary remaining quantitative parameters can be gotten with respective: > > ``` > > String key = "xxx"; > > Double value = matchingDrone.getDouble(key); > > ``` > > > > You may also use the `JSONObject` function `.has(String key)` as a safe way to check if a key exists: > > ``` > > if (drone != null && drone.has("focalLength")) { > > doSomething(); > > } > > ``` > > > > > > mkrupczak3: Also if the values for distortion parameters are all 0.0, then this actually means the data is missing. In this case, just use the existing pinhole camera model without correcting for distortion > > > > > > mkrupczak3: My > > > > > One implementation problem is that often drone images are scaled up or down from their original size, while the calibrated distortion parameters are in terms of pixels of the image size that was used for calibration. > > > > > > We cannot assume the size of the image loaded will be the same as the size that the parameters are calculated for (such as if it is automatically scaled down when sent over a messaging app): Therefore it is necessary to adjust the distortion parameters based on the image scale. > > > > > > Interestingly, the distortion parameters won't scale linearly with the image scale. I haven't checked the math, but I believe they may be defined however, by mathematical formula(s) involving the original parameter and an arbitrary scale value `n` (see the last entry [here](https://chat.openai.com/share/f35a1b48-461c-4dd6-bd44-f19d0fdbe45c)) > > > > > > In brief, this suggests that the new distortion coefficients for the scaled resolution image could be: > > > > > > R1' = R1 / n^2 R2' = R2 / n^4 R3' = R3 / n^6 T1' = T1 / n T2' = T2 / n > > > > > > The [existing code in MetadataExtractor.java](https://github.com/Theta-Limited/OpenAthenaAndroid/blob/8ef35c8b48f308b85bb79c288721e707f59184fd/app/src/main/java/com/openathena/MetadataExtractor.java#L785) calculates `scaleRatio` based on the digital zoom (center crop) ratio, the image width, and the expected full resolution width of the image (the vertical size is not used because these pixels are often cropped automatically to make an image fit 16:9 frame). This scale ratio may likely be used as `n` for the equations listed above. > > > > > > From there, once the distortion equation is applied, Xd and Yd may be calculated, and then the ray angle may be calculated using each of their tangents with the focal length (in pixels) as normal: > > > > > > https://github.com/Theta-Limited/OpenAthenaAndroid/blob/8ef35c8b48f308b85bb79c288721e707f59184fd/app/src/main/java/com/openathena/MetadataExtractor.java#L872 > > > > These equations were wrong, there's no need to alter any of the distortion parameters based on the size of the image. The current code which applies the scale correction for fx, fy, cx, and cy is already there and should be all that's needed > > > > > > mkrupczak3: via ChatGPT: > > > > > I apologize for the confusion earlier. Here's a step-by-step process to calculate θx and θy from a pixel in a distorted image: > > > > > > 1. **Undistort the pixel coordinates**: The first step is to correct the distorted pixel coordinates to undistorted pixel coordinates. This is typically done using an iterative process, as the distortion equations are nonlinear and do not have a simple inverse. You might start with an initial guess for the undistorted coordinates (for example, the distorted coordinates), and then repeatedly apply the distortion model and adjust the coordinates until the distorted coordinates match the observed coordinates. The distortion model equations are given by: > > > > > > xdistorted = x(1 + k1*r^2 + k2*r^4 + k3*r^6) + [2 * p1 * x * y + p2 * (r^2 + 2 * x^2)] > > > ydistorted = y(1 + k1*r^2 + k2*r^4 + k3*r^6) + [p1 * (r^2 + 2 *y^2) + 2 * p2 * x * y] > > > > > > Here, (x, y) are the undistorted pixel locations in normalized image coordinates, (xdistorted, ydistorted) are the distorted pixel locations, r^2 = x^2 + y^2, and k1, k2, k3, p1, and p2 are the distortion coefficients. > > > > > > 2. **Normalize the pixel coordinates**: Subtract the principal point coordinates (cx, cy) from the undistorted pixel coordinates, and divide by the focal length (fx, fy) to convert the pixel coordinates to normalized image coordinates. This will give you the coordinates (x, y) of the point in the camera's image plane, in units of the focal length. > > > > > > xnormalized = (xundistorted - cx) / fx > > > ynormalized = (yundistorted - cy) / fy > > > > > > 3. **Convert to angles**: The normalized image coordinates (xnormalized, ynormalized) represent the tangent of the angles from the principal axis. So you can use the arctangent function to convert these coordinates to angles. The horizontal angle θx is given by θx = atan(xnormalized), and the vertical angle θy is given by θy = atan(ynormalized). > > > > > > Please note that these angles are relative to the principal axis of the camera, which is the line from the camera center through the principal point. The angles are positive in the direction of increasing pixel coordinates, and are measured in radians. The horizontal angle is zero for points on the principal axis, positive for points to the right of the principal axis, and negative for points to the left. Similarly, the vertical angle is zero for points on the principal axis, positive for points below the principal axis (since y-coordinates increase downwards in image coordinates), and negative for points above. > > > > > > mkrupczak3: More from ChatGPT on using Newton's method for finding the homogeneous point given the known distorted point in the original image: > > > > > The distortion equations are nonlinear and do not have a simple closed-form inverse, which is why an iterative approach is often used to solve for the undistorted coordinates. However, it is possible to approximate the inverse using a series expansion, or to solve for the undistorted coordinates using a numerical method such as Newton's method. > > > > > > Here is an example of how you might use Newton's method to solve for the undistorted x-coordinate given the distorted x-coordinate: > > > > > > 1. Start with an initial guess for the undistorted x-coordinate. A good initial guess might be the distorted x-coordinate. > > > > > > 2. Calculate the distorted x-coordinate using the distortion model equation: > > > > > > xdistorted = x(1 + k1*r^2 + k2*r^4 + k3*r^6) + [2 * p1 * x * y + p2 * (r^2 + 2 * x^2)] > > > > > > 3. Calculate the difference between the calculated distorted x-coordinate and the given distorted x-coordinate. > > > > > > 4. If the difference is less than a small tolerance, stop and return the current guess for the undistorted x-coordinate. > > > > > > 5. Otherwise, calculate the derivative of the distortion model equation with respect to the undistorted x-coordinate, and use this to update the guess for the undistorted x-coordinate: > > > > > > x = x - (xdistorted - xcalculated) / derivative > > > > > > 6. Repeat steps 2-5 until the difference is less than the tolerance or the maximum number of iterations is reached. > > > > > > This process can be repeated for the y-coordinate. > > > > > > Please note that this method requires calculating the derivative of the distortion model equation, which can be complex due to the nonlinear terms. It also requires choosing a suitable tolerance and maximum number of iterations. If the method does not converge, it may be necessary to try a different initial guess or to use a different numerical method. > > > > > > mkrupczak3: The accuracy issue seems to be most pronounced with fisheye lenses, see an example here: > > > > ![fisheye_fail_optimized](https://github.com/Theta-Limited/OpenAthenaAndroid/assets/25494111/bd20259e-6a86-4a91-b291-e24bb3082340) > > > > This issue may be related to the user reported issue #79 > > > > > > > > > > +-+ > > > > The list of files in the repo is: > > ```.gitignore (240 tokens) > > .gitmodules (55 tokens) > > LICENSE (8075 tokens) > > README.md (2786 tokens) > > build.gradle (92 tokens) > > gradle.properties (333 tokens) > > gradlew (2469 tokens) > > gradlew.bat (975 tokens) > > settings.gradle (138 tokens) > > transifex.yml (95 tokens) > > .idea/.gitignore (16 tokens) > > .idea/OpenAthenaAndroid.iml (337 tokens) > > .idea/compiler.xml (55 tokens) > > .idea/gradle.xml (344 tokens) > > .idea/misc.xml (917 tokens) > > .idea/modules.xml (394 tokens) > > .idea/vcs.xml (66 tokens) > > app/.gitignore (2 tokens) > > app/build.gradle (541 tokens) > > app/proguard-rules.pro (198 tokens) > > .github/workflows/autopr.yml (544 tokens) > > app/debug/output-metadata.json (178 tokens) > > app/mgrs/.gitignore (3 tokens) > > app/mgrs/gradlew (2233 tokens) > > app/mgrs/gradlew.bat (923 tokens) > > gradle/wrapper/gradle-wrapper.properties (85 tokens) > > metadata/en-US/full_description.txt (93 tokens) > > metadata/en-US/short_description.txt (11 tokens) > > metadata/zh-CN/full_description.txt (0 tokens) > > metadata/zh-CN/short_description.txt (0 tokens) > > app/src/main/AndroidManifest.xml (1260 tokens) > > metadata/en-US/changelogs/10.txt (20 tokens) > > metadata/en-US/changelogs/11.txt (5 tokens) > > metadata/en-US/changelogs/12.txt (11 tokens) > > metadata/en-US/changelogs/13.txt (1 tokens) > > metadata/en-US/changelogs/14.txt (7 tokens) > > metadata/en-US/changelogs/15.txt (12 tokens) > > metadata/en-US/changelogs/8.txt (161 tokens) > > metadata/en-US/changelogs/9.txt (86 tokens) > > app/mgrs/gradle/wrapper/gradle-wrapper.properties (84 tokens) > > app/mgrs/src/main/AndroidManifest.xml (47 tokens) > > app/src/main/javadoc/overview.html (639 tokens) > > app/src/main/resources/mgrs.properties (1140 tokens) > > app/src/test/resources/.gitattributes (203 tokens) > > app/src/test/resources/README (370 tokens) > > app/src/test/resources/java.policy (8943 tokens) > > app/src/test/resources/lang-708-input.txt (2693 tokens) > > app/src/test/resources/log4j.properties (130 tokens) > > app/src/main/java/samples/XMPCoreCoverage.java (12891 tokens) > > app/src/main/java/samples/XMPCoreCoverageConst.java (5246 tokens) > > app/src/main/res/drawable-v24/ic_launcher_foreground.xml (1061 tokens) > > app/src/main/res/drawable/ic_launcher_background.xml (2638 tokens) > > app/src/main/res/layout-land/activity_about.xml (991 tokens) > > app/src/main/res/layout-land/activity_main.xml (2280 tokens) > > app/src/main/res/layout-land/activity_prefs.xml (2354 tokens) > > app/src/main/res/layout/activity_about.xml (947 tokens) > > app/src/main/res/layout/activity_log.xml (442 tokens) > > app/src/main/res/layout/activity_main.xml (1989 tokens) > > app/src/main/res/layout/activity_prefs.xml (2078 tokens) > > app/src/main/res/layout/activity_selection.xml (329 tokens) > > app/src/main/res/menu/menu_main.xml (320 tokens) > > app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (98 tokens) > > app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (98 tokens) > > app/src/main/res/values-fr/strings.xml (3981 tokens) > > app/src/main/res/values-ja/strings.xml (4781 tokens) > > app/src/main/res/values-ko/strings.xml (5981 tokens) > > app/src/main/res/values-land/dimens.xml (26 tokens) > > app/src/main/res/values-night/themes.xml (318 tokens) > > app/src/main/res/values-pl/strings.xml (4453 tokens) > > app/src/main/res/values-ru/strings.xml (6457 tokens) > > app/src/main/res/values-uk/strings.xml (6475 tokens) > > app/src/main/res/values-w1240dp/dimens.xml (26 tokens) > > app/src/main/res/values-w600dp/dimens.xml (26 tokens) > > app/src/main/res/values-zh/strings.xml (4727 tokens) > > app/src/main/res/values/colors.xml (161 tokens) > > app/src/main/res/values/dimens.xml (26 tokens) > > app/src/main/res/values/strings.xml (3221 tokens) > > app/src/main/res/values/themes.xml (454 tokens) > > app/src/main/res/xml/backup_rules.xml (160 tokens) > > app/src/main/res/xml/data_extraction_rules.xml (221 tokens) > > app/src/main/resources/META-INF/MANIFEST.MF (205 tokens) > > app/mgrs/src/main/res/values/strings.xml (8 tokens) > > app/src/androidTest/java/com/openathena/ExampleInstrumentedTest.java (248 tokens) > > app/src/main/java/com/openathena/AboutActivity.java (3054 tokens) > > app/src/main/java/com/openathena/ActivityLog.java (2599 tokens) > > app/src/main/java/com/openathena/AthenaActivity.java (6999 tokens) > > app/src/main/java/com/openathena/AthenaApp.java (1627 tokens) > > app/src/main/java/com/openathena/CK42_Gauss_Krüger_Translator.java (2137 tokens) > > app/src/main/java/com/openathena/CoordTranslator.java (778 tokens) > > app/src/main/java/com/openathena/CursorOnTargetSender.java (4168 tokens) > > app/src/main/java/com/openathena/DEMParser.java (13895 tokens) > > app/src/main/java/com/openathena/DTEDParser.java (632 tokens) > > app/src/main/java/com/openathena/DroneParameterProvider.java (67 tokens) > > app/src/main/java/com/openathena/DroneParametersFromJSON.java (951 tokens) > > app/src/main/java/com/openathena/EGM96OffsetAdapter.java (374 tokens) > > app/src/main/java/com/openathena/EGMOffsetProvider.java (44 tokens) > > app/src/main/java/com/openathena/MainActivity.java (19638 tokens) > > app/src/main/java/com/openathena/MarkableImageView.java (5449 tokens) > > app/src/main/java/com/openathena/MetadataExtractor.java (15022 tokens) > > app/src/main/java/com/openathena/MissingDataException.java (249 tokens) > > app/src/main/java/com/openathena/PrefsActivity.java (2144 tokens) > > app/src/main/java/com/openathena/RequestedValueOOBException.java (326 tokens) > > app/src/main/java/com/openathena/SelectionActivity.java (2161 tokens) > > app/src/main/java/com/openathena/TargetGetter.java (6617 tokens) > > app/src/main/java/com/openathena/WGS84_CK42_Geodetic_Translator.java (3211 tokens) > > app/src/main/java/com/openathena/geodataAxisParams.java (110 tokens) > > app/src/main/java/org/slf4j/ILoggerFactory.java (735 tokens) > > app/src/main/java/org/slf4j/IMarkerFactory.java (940 tokens) > > app/src/main/java/org/slf4j/Logger.java (8492 tokens) > > app/src/main/java/org/slf4j/LoggerFactory.java (7159 tokens) > > app/src/main/java/org/slf4j/LoggerFactoryFriend.java (280 tokens) > > app/src/main/java/org/slf4j/MDC.java (3347 tokens) > > app/src/main/java/org/slf4j/Marker.java (1541 tokens) > > app/src/main/java/org/slf4j/MarkerFactory.java (1164 tokens) > > app/src/main/java/org/slf4j/package.html (91 tokens) > > app/src/main/resources/META-INF/proguard/org.threeten.bp.pro (24 tokens) > > app/src/main/resources/META-INF/services/org.threeten.bp.zone.ZoneRulesProvider (17 tokens) > > app/src/test/java/com/openathena/ExampleUnitTest.java (130 tokens) > > app/src/test/java/org/slf4j/BasicMarkerTest.java (2875 tokens) > > app/src/test/java/org/slf4j/Differentiator.java (442 tokens) > > app/src/test/java/org/slf4j/DoubleCheckedInt.java (2150 tokens) > > app/src/test/java/org/slf4j/LoggerAccessingThread.java (845 tokens) > > app/src/test/java/org/slf4j/NoBindingTest.java (684 tokens) > > app/src/main/java/com/adobe/xmp/XMPConst.java (2660 tokens) > > app/src/main/java/com/adobe/xmp/XMPDateTime.java (1171 tokens) > > app/src/main/java/com/adobe/xmp/XMPDateTimeFactory.java (1769 tokens) > > app/src/main/java/com/adobe/xmp/XMPError.java (292 tokens) > > app/src/main/java/com/adobe/xmp/XMPException.java (363 tokens) > > app/src/main/java/com/adobe/xmp/XMPIterator.java (954 tokens) > > app/src/main/java/com/adobe/xmp/XMPMeta.java (15441 tokens) > > app/src/main/java/com/adobe/xmp/XMPMetaFactory.java (3149 tokens) > > app/src/main/java/com/adobe/xmp/XMPPathFactory.java (3761 tokens) > > app/src/main/java/com/adobe/xmp/XMPSchemaRegistry.java (1806 tokens) > > app/src/main/java/com/adobe/xmp/XMPUtils.java (6110 tokens) > > app/src/main/java/com/adobe/xmp/XMPVersionInfo.java (342 tokens) > > app/src/main/java/com/adobe/xmp/package.html (152 tokens) > > app/src/main/java/com/agilesrc/dem4j/BoundingBox.java (1605 tokens)``` > > > > Should we take a look at any files? If so, pick only a few files (max 5000 tokens). > > Respond with a very short rationale, and a list of files. > > If looking at files would be a waste of time with regard to the issue, respond with an empty list. > > ~~~ > > > >
Response ~~~ To solve the issue, we should look at the files that contain the existing code for dealing with lens distortion in images, or any related calculations. Based on the issue description, the file `app/src/main/java/com/openathena/MetadataExtractor.java` seems to be the main file where the current implementation of ray angle calculation and image resolution scaling is happening. Rationale: The provided issue details mention the MetadataExtractor.java file multiple times, indicating that the current implementation of the affected functionality is located there. Files to look at: - `app/src/main/java/com/openathena/MetadataExtractor.java` - `app/src/main/java/com/openathena/AthenaActivity.java` - `app/src/main/java/com/openathena/MarkableImageView.java` - `app/src/main/java/com/openathena/DroneParametersFromJSON.java` We should also check the JSON file which contains the drone parameters to make sure we understand the data structure and values. Unfortunately, the file path is not provided in the repo list, so we may need to ask the user for it. ~~~

🛤 Ran InitialFileSelectResponse on rail >
> Prompt > > ~~~xml > > Given the following document surrounded by `+++++`, answer the following questions. > If the answer doesn't exist in the document, enter `null`. > > +++++ > To solve the issue, we should look at the files that contain the existing code for dealing with lens distortion in images, or any related calculations. Based on the issue description, the file `app/src/main/java/com/openathena/MetadataExtractor.java` seems to be the main file where the current implementation of ray angle calculation and image resolution scaling is happening. > > Rationale: The provided issue details mention the MetadataExtractor.java file multiple times, indicating that the current implementation of the affected functionality is located there. > > Files to look at: > - `app/src/main/java/com/openathena/MetadataExtractor.java` > - `app/src/main/java/com/openathena/AthenaActivity.java` > - `app/src/main/java/com/openathena/MarkableImageView.java` > - `app/src/main/java/com/openathena/DroneParametersFromJSON.java` > > We should also check the JSON file which contains the drone parameters to make sure we understand the data structure and values. Unfortunately, the file path is not provided in the repo list, so we may need to ask the user for it. > +++++ > > Extract information from this document and return a JSON that follows the correct schema. > If looking at files would be a waste of time, please submit an empty list. > > > Given below is XML that describes the information to extract from this document and the tags to extract it into. > > > > > > > > > > ~~~ > >
Raw output ~~~json { "filepaths": [ "app/src/main/java/com/openathena/MetadataExtractor.java", "app/src/main/java/com/openathena/AthenaActivity.java", "app/src/main/java/com/openathena/MarkableImageView.java", "app/src/main/java/com/openathena/DroneParametersFromJSON.java" ] } ~~~
Parsed output ~~~json { "filepaths": [ "app/src/main/java/com/openathena/MetadataExtractor.java", "app/src/main/java/com/openathena/AthenaActivity.java", "app/src/main/java/com/openathena/MarkableImageView.java", "app/src/main/java/com/openathena/DroneParametersFromJSON.java" ] } ~~~
Validated output ~~~json { "filepaths": [ "app/src/main/java/com/openathena/MetadataExtractor.java", "app/src/main/java/com/openathena/AthenaActivity.java", "app/src/main/java/com/openathena/MarkableImageView.java", "app/src/main/java/com/openathena/DroneParametersFromJSON.java" ] } ~~~

CLAassistant commented 1 year ago

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.


AutoPR seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.