Введение:
Привет всем, у меня есть файл .csv
, который содержит (x, y, z) координаты изображения с разрешением 1280x720 (ширина x высота),В этих точках данных он содержит значение z, которое представляет глубину для данного конкретного пикселя.В файле CSV 1280x720 = 921 600 баллов.
Проблема:
Сначала я хотелскопировать эти 921 600 точек в двумерном массиве в мою собственную программу для обработки.Я написал double Array2D[1280][720];
, но программа потерпела крах, скорее всего из-за переполнения стека.Мой другой новый метод почти работает, но также, похоже, возникла аналогичная проблема, это переполнение буфера?
В моем собственном тестировании кода ниже, запрос (x, y) из точек (0, 0) в(1279, 565) работает, но что-либо после 565 является недействительным.Например, в файле .CSV в точке (1279, 565) фактическое значение равно 1,589, которое удается получить моей программе.В точке (1279, 566) фактическое значение равно 1.579, но моя программа возвращает значение 0.
Это переполнение буфера некоторогоСортировать?Что я могу сделать, чтобы это исправить?
Файл CSV: Ссылка на файл .CSV
Полный упрощенный код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <memory>
template <class T, size_t W, size_t H>
class Array2D {
public:
const int width = W;
const int height = H;
typedef typename T type;
Array2D() {
buffer.resize(width*height);
}
T &operator() (int x, int y) {
return buffer[y*width + x];
}
const T &operator() (int x, int y) const {
return buffer[y*width + x];
}
private:
std::vector<T> buffer;
};
int main() {
char eater; // Charater to remove ',' and '\n' in a .CSV file
int xs, ys; // User queried points, X & Y coordinates
Array2D<double, 1281, 721> a;
// Opening (x, y, z) .CSV file with 921,600 points
std::ifstream coordinatesFile;
coordinatesFile.open("test2.csv_Depth_3068.csv");
std::cout << "COPYING" << std::endl;
// Copying the z(depth) data into a Vector
for (int y = 1; y < 720; y++) { // Iterating through 720 rows
for (int x = 1; x < 1280; x++) { // Iterating through 1280 columns
coordinatesFile >> a(x, y); // Copying the value with X, Y coordinates
coordinatesFile >> eater; // Remove the ',' after each z(depth) value
}
coordinatesFile >> eater; // Removes the '\n' after every row in a .CSV file, should run 720 times since there are 720 rows which means there are 720 '\n's
}
// For user to Query the data stored in vector
while (1) {
std::cout << "Enter X val: ";
std::cin >> xs;
std::cout << "Enter Y val: ";
std::cin >> ys;
std::cout << "Value = " << a(xs, ys) << std::endl;
}
coordinatesFile.close();
std::cin.get();
std::cin.ignore();
}