blob: 8eade2b5c9813decacfb2b79d4540e440218f1c3 [file] [log] [blame]
Parker Schuhf2a34932019-02-16 20:39:19 -08001#include "aos/vision/image/image_dataset.h"
2
Stephan Pleinescc500b92024-05-30 10:58:40 -07003#include <stdlib.h>
4
5#include <cstdio>
Parker Schuhf2a34932019-02-16 20:39:19 -08006#include <fstream>
7
8#include "aos/vision/image/image_types.h"
9
Stephan Pleinesf63bde82024-01-13 15:59:33 -080010namespace aos::vision {
Parker Schuhf2a34932019-02-16 20:39:19 -080011
12namespace {
13std::string GetFileContents(const std::string &filename) {
14 std::ifstream in(filename, std::ios::in | std::ios::binary);
15 if (in) {
16 std::string contents;
17 in.seekg(0, std::ios::end);
18 contents.resize(in.tellg());
19 in.seekg(0, std::ios::beg);
20 in.read(&contents[0], contents.size());
21 in.close();
22 return (contents);
23 }
24 fprintf(stderr, "Could not read file: %s\n", filename.c_str());
25 exit(-1);
26}
27
28std::vector<std::string> Split(DataRef inp, char delim) {
29 size_t i = 0;
30 std::vector<size_t> pos;
31 while (i < inp.size()) {
32 i = inp.find(delim, i);
33 if (i == std::string::npos) break;
34 // fprintf(stderr, "k=%d, i=%d\n", k, (int)i);
35 pos.emplace_back(i);
36 i = i + 1;
37 }
38 std::vector<std::string> res;
39 res.reserve(pos.size() + 1);
40 i = 0;
41 for (auto p : pos) {
James Kuszmaul3ae42262019-11-08 12:33:41 -080042 res.emplace_back(inp.substr(i, p - i));
Parker Schuhf2a34932019-02-16 20:39:19 -080043 i = p + 1;
44 }
James Kuszmaul3ae42262019-11-08 12:33:41 -080045 res.emplace_back(inp.substr(i));
Parker Schuhf2a34932019-02-16 20:39:19 -080046 return res;
47}
48} // namespace
49
Parker Schuh9e1d1692019-02-24 14:34:04 -080050DatasetFrame LoadFile(const std::string &jpeg_filename) {
51 bool is_jpeg = true;
52 size_t l = jpeg_filename.size();
53 if (l > 4 && jpeg_filename[l - 1] == 'v') {
54 is_jpeg = false;
55 }
56 return DatasetFrame{is_jpeg, GetFileContents(jpeg_filename)};
57}
58
Parker Schuhf2a34932019-02-16 20:39:19 -080059std::vector<DatasetFrame> LoadDataset(const std::string &jpeg_list_filename) {
60 std::vector<DatasetFrame> images;
61 auto contents = GetFileContents(jpeg_list_filename);
62
63 std::string basename;
64 auto it = jpeg_list_filename.find_last_of('/');
65 if (it != std::string::npos) {
66 basename = jpeg_list_filename.substr(0, it + 1);
67 }
68
69 for (const auto &jpeg_filename : Split(contents, '\n')) {
70 [&]() {
71 if (jpeg_filename.empty()) return;
72 for (std::size_t i = 0; i < jpeg_filename.size(); ++i) {
73 if (jpeg_filename[i] == '#') return;
74 if (jpeg_filename[i] != ' ') break;
75 }
Parker Schuhf2a34932019-02-16 20:39:19 -080076 if (jpeg_filename[0] == '/') {
Parker Schuh9e1d1692019-02-24 14:34:04 -080077 images.emplace_back(LoadFile(jpeg_filename));
Parker Schuhf2a34932019-02-16 20:39:19 -080078 } else {
Parker Schuh9e1d1692019-02-24 14:34:04 -080079 images.emplace_back(LoadFile(basename + jpeg_filename));
Parker Schuhf2a34932019-02-16 20:39:19 -080080 }
81 }();
82 }
83
84 return images;
85}
86
Stephan Pleinesf63bde82024-01-13 15:59:33 -080087} // namespace aos::vision