blob: 4e9c3060cac9eb3438847622c708be845ec0000a [file] [log] [blame]
Brian Silverman967e5df2020-02-09 16:43:34 -08001#!/usr/bin/python3
2
3import cv2
4import sys
5import flatbuffers
6
7import frc971.vision.sift.TrainingImage as TrainingImage
8import frc971.vision.sift.TrainingData as TrainingData
9import frc971.vision.sift.Feature as Feature
10
Ravago Jones5127ccc2022-07-31 16:32:45 -070011
Brian Silverman967e5df2020-02-09 16:43:34 -080012def main():
Ravago Jones5127ccc2022-07-31 16:32:45 -070013 image4_cleaned_path = sys.argv[1]
14 output_path = sys.argv[2]
Brian Silverman967e5df2020-02-09 16:43:34 -080015
Ravago Jones5127ccc2022-07-31 16:32:45 -070016 image4_cleaned = cv2.imread(image4_cleaned_path)
Brian Silverman967e5df2020-02-09 16:43:34 -080017
Ravago Jones5127ccc2022-07-31 16:32:45 -070018 image = cv2.cvtColor(image4_cleaned, cv2.COLOR_BGR2GRAY)
19 image = cv2.resize(image, (640, 480))
20 sift = cv2.SIFT_create()
21 keypoints, descriptors = sift.detectAndCompute(image, None)
Brian Silverman967e5df2020-02-09 16:43:34 -080022
Ravago Jones5127ccc2022-07-31 16:32:45 -070023 fbb = flatbuffers.Builder(0)
Brian Silverman967e5df2020-02-09 16:43:34 -080024
Ravago Jones5127ccc2022-07-31 16:32:45 -070025 features_vector = []
Brian Silverman967e5df2020-02-09 16:43:34 -080026
Ravago Jones5127ccc2022-07-31 16:32:45 -070027 for keypoint, descriptor in zip(keypoints, descriptors):
28 Feature.FeatureStartDescriptorVector(fbb, len(descriptor))
29 for n in reversed(descriptor):
30 assert n == round(n)
31 fbb.PrependUint8(int(round(n)))
32 descriptor_vector = fbb.EndVector()
Brian Silverman967e5df2020-02-09 16:43:34 -080033
Ravago Jones5127ccc2022-07-31 16:32:45 -070034 Feature.FeatureStart(fbb)
Brian Silverman967e5df2020-02-09 16:43:34 -080035
Ravago Jones5127ccc2022-07-31 16:32:45 -070036 Feature.FeatureAddDescriptor(fbb, descriptor_vector)
37 Feature.FeatureAddX(fbb, keypoint.pt[0])
38 Feature.FeatureAddY(fbb, keypoint.pt[1])
39 Feature.FeatureAddSize(fbb, keypoint.size)
40 Feature.FeatureAddAngle(fbb, keypoint.angle)
41 Feature.FeatureAddResponse(fbb, keypoint.response)
42 Feature.FeatureAddOctave(fbb, keypoint.octave)
Brian Silverman967e5df2020-02-09 16:43:34 -080043
Ravago Jones5127ccc2022-07-31 16:32:45 -070044 features_vector.append(Feature.FeatureEnd(fbb))
Brian Silverman967e5df2020-02-09 16:43:34 -080045
Ravago Jones5127ccc2022-07-31 16:32:45 -070046 TrainingImage.TrainingImageStartFeaturesVector(fbb, len(features_vector))
47 for feature in reversed(features_vector):
48 fbb.PrependUOffsetTRelative(feature)
49 features_vector_table = fbb.EndVector()
Brian Silverman967e5df2020-02-09 16:43:34 -080050
Ravago Jones5127ccc2022-07-31 16:32:45 -070051 TrainingImage.TrainingImageStart(fbb)
52 TrainingImage.TrainingImageAddFeatures(fbb, features_vector_table)
53 # TODO(Brian): Fill out the transformation matrices.
54 training_image_offset = TrainingImage.TrainingImageEnd(fbb)
Brian Silverman967e5df2020-02-09 16:43:34 -080055
Ravago Jones5127ccc2022-07-31 16:32:45 -070056 TrainingData.TrainingDataStartImagesVector(fbb, 1)
57 fbb.PrependUOffsetTRelative(training_image_offset)
58 images_offset = fbb.EndVector()
Brian Silverman967e5df2020-02-09 16:43:34 -080059
Ravago Jones5127ccc2022-07-31 16:32:45 -070060 TrainingData.TrainingDataStart(fbb)
61 TrainingData.TrainingDataAddImages(fbb, images_offset)
62 fbb.Finish(TrainingData.TrainingDataEnd(fbb))
Brian Silverman967e5df2020-02-09 16:43:34 -080063
Ravago Jones5127ccc2022-07-31 16:32:45 -070064 bfbs = fbb.Output()
Brian Silverman967e5df2020-02-09 16:43:34 -080065
Ravago Jones5127ccc2022-07-31 16:32:45 -070066 output_prefix = [
67 b'#ifndef Y2020_VISION_SIFT_DEMO_SIFT_H_',
68 b'#define Y2020_VISION_SIFT_DEMO_SIFT_H_',
69 b'#include <string_view>',
70 b'namespace frc971 {',
71 b'namespace vision {',
72 b'inline std::string_view DemoSiftData() {',
73 ]
74 output_suffix = [
75 b' return std::string_view(kData, sizeof(kData));',
76 b'}',
77 b'} // namespace vision',
78 b'} // namespace frc971',
79 b'#endif // Y2020_VISION_SIFT_DEMO_SIFT_H_',
80 ]
Brian Silverman967e5df2020-02-09 16:43:34 -080081
Ravago Jones5127ccc2022-07-31 16:32:45 -070082 with open(output_path, 'wb') as output:
83 for line in output_prefix:
84 output.write(line)
85 output.write(b'\n')
86 output.write(b'alignas(64) static constexpr char kData[] = "')
87 for byte in fbb.Output():
88 output.write(b'\\x' + (b'%x' % byte).zfill(2))
89 output.write(b'";\n')
90 for line in output_suffix:
91 output.write(line)
92 output.write(b'\n')
93
Brian Silverman967e5df2020-02-09 16:43:34 -080094
95if __name__ == '__main__':
Ravago Jones5127ccc2022-07-31 16:32:45 -070096 main()