blob: c78a44ab2d712e6e6d76f35299826abfa820159a [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
11def main():
12 image4_cleaned_path = sys.argv[1]
13 output_path = sys.argv[2]
14
15 image4_cleaned = cv2.imread(image4_cleaned_path)
16
17 image = cv2.cvtColor(image4_cleaned, cv2.COLOR_BGR2GRAY)
18 image = cv2.resize(image, (640, 480))
19 sift = cv2.xfeatures2d.SIFT_create()
20 keypoints, descriptors = sift.detectAndCompute(image, None)
21
22 fbb = flatbuffers.Builder(0)
23
24 features_vector = []
25
26 for keypoint, descriptor in zip(keypoints, descriptors):
27 Feature.FeatureStartDescriptorVector(fbb, len(descriptor))
28 for n in reversed(descriptor):
Brian Silvermanf64b9bd2020-02-29 12:51:33 -080029 assert n == round(n)
30 fbb.PrependUint8(int(round(n)))
Brian Silverman967e5df2020-02-09 16:43:34 -080031 descriptor_vector = fbb.EndVector(len(descriptor))
32
33 Feature.FeatureStart(fbb)
34
35 Feature.FeatureAddDescriptor(fbb, descriptor_vector)
36 Feature.FeatureAddX(fbb, keypoint.pt[0])
37 Feature.FeatureAddY(fbb, keypoint.pt[1])
38 Feature.FeatureAddSize(fbb, keypoint.size)
39 Feature.FeatureAddAngle(fbb, keypoint.angle)
40 Feature.FeatureAddResponse(fbb, keypoint.response)
41 Feature.FeatureAddOctave(fbb, keypoint.octave)
42
43 features_vector.append(Feature.FeatureEnd(fbb))
44
45 TrainingImage.TrainingImageStartFeaturesVector(fbb, len(features_vector))
46 for feature in reversed(features_vector):
47 fbb.PrependUOffsetTRelative(feature)
48 features_vector_table = fbb.EndVector(len(features_vector))
49
50 TrainingImage.TrainingImageStart(fbb)
51 TrainingImage.TrainingImageAddFeatures(fbb, features_vector_table)
52 # TODO(Brian): Fill out the transformation matrices.
Jim Ostrowskiad5d8a72020-02-28 00:15:26 -080053 training_image_offset = TrainingImage.TrainingImageEnd(fbb)
Brian Silverman967e5df2020-02-09 16:43:34 -080054
55 TrainingData.TrainingDataStartImagesVector(fbb, 1)
Jim Ostrowskiad5d8a72020-02-28 00:15:26 -080056 fbb.PrependUOffsetTRelative(training_image_offset)
57 images_offset = fbb.EndVector(1)
Brian Silverman967e5df2020-02-09 16:43:34 -080058
59 TrainingData.TrainingDataStart(fbb)
Jim Ostrowskiad5d8a72020-02-28 00:15:26 -080060 TrainingData.TrainingDataAddImages(fbb, images_offset)
Brian Silverman967e5df2020-02-09 16:43:34 -080061 fbb.Finish(TrainingData.TrainingDataEnd(fbb))
62
63 bfbs = fbb.Output()
64
65 output_prefix = [
66 b'#ifndef Y2020_VISION_SIFT_DEMO_SIFT_H_',
67 b'#define Y2020_VISION_SIFT_DEMO_SIFT_H_',
68 b'#include <string_view>',
69 b'namespace frc971 {',
70 b'namespace vision {',
71 b'inline std::string_view DemoSiftData() {',
72 ]
73 output_suffix = [
74 b' return std::string_view(kData, sizeof(kData));',
75 b'}',
76 b'} // namespace vision',
77 b'} // namespace frc971',
78 b'#endif // Y2020_VISION_SIFT_DEMO_SIFT_H_',
79 ]
80
81 with open(output_path, 'wb') as output:
82 for line in output_prefix:
83 output.write(line)
84 output.write(b'\n')
85 output.write(b'alignas(64) static constexpr char kData[] = "')
86 for byte in fbb.Output():
87 output.write(b'\\x' + (b'%x' % byte).zfill(2))
88 output.write(b'";\n')
89 for line in output_suffix:
90 output.write(line)
91 output.write(b'\n')
92
93if __name__ == '__main__':
94 main()