Я пытаюсь загрузить много изображений, которые перечислены в файле CVS в следующем формате:Загрузка списка изображений с OpenCV в Node.js
./path/to/img1.ext;label1
./path/to/img2.ext;label2
Это сценарий, я имею написано:
var cv = require("opencv"),
fs = require("fs"),
console = require("console"),
util = require("util"),
lazy = require("lazy.js");
var basePath = '/some/path/';
var csvFile = fs.createReadStream(basePath + 'db.csv', {flags:'r'});
var images = [],
labels = [];
lazy(csvFile)
.lines()
.each(function(l) {
var d = lazy(l).split(';').toArray();
cv.readImage(basePath + d[0], function(e, m) {
images.push(m);
});
labels.push(d[1]);
});
console.log(util.inspect(images));
console.log(util.inspect(labels));
Он печатает две строки, содержащие представление пустого массива []
.
Изображения на самом деле получить загружены OpenCV, потому что если вы пытаетесь напечатать m
, прежде чем нажимать его в массив он правильно печатает [Matrix HxW ]
, где H
и W
стоять на высоте и ширине изображения.
EDIT: вы можете думать о лучшем способе, чем 2 разделенных массива для хранения каждого изображения, связанного с его меткой?
EDIT: проблема заключается в том, что изображения загружаются асинхронно. Поэтому проблема заключается в отсутствии опыта в асинхронном программировании. Как я могу сделать эту работу?
Вы пробовали эту библиотеку для узла? https://github.com/caolan/async – gabereal
@gabereal: как это должно мне помочь? –
вы можете задержать итерацию каждого цикла до тех пор, пока readImage (который я принимаю из вашего второго редактирования - это асинхронная часть) завершает выполнение обратного вызова. есть ли веская причина использовать ленивый? я не понимаю, почему вы не просто используете модули узлов «fs» и «readline» ... – gabereal