2014-09-18 2 views
0

Я пытаюсь загрузить много изображений, которые перечислены в файле 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: проблема заключается в том, что изображения загружаются асинхронно. Поэтому проблема заключается в отсутствии опыта в асинхронном программировании. Как я могу сделать эту работу?

+0

Вы пробовали эту библиотеку для узла? https://github.com/caolan/async – gabereal

+0

@gabereal: как это должно мне помочь? –

+0

вы можете задержать итерацию каждого цикла до тех пор, пока readImage (который я принимаю из вашего второго редактирования - это асинхронная часть) завершает выполнение обратного вызова. есть ли веская причина использовать ленивый? я не понимаю, почему вы не просто используете модули узлов «fs» и «readline» ... – gabereal

ответ

0

вот решение с использованием трубопровода и csv2 и through2 библиотеки для узла, который вы можете найти здесь https://github.com/rvagg/csv2, а вот https://github.com/rvagg/through2

я проверил это с имитацией асинхронной функции с использованием SetTimeout, и она работала. однако, поскольку у меня нет файла данных, я не могу его точно проверить. сообщите мне, если есть проблема.

УКАЗАНИЕ Я создал массив объектов. каждый объект имеет изображение и его метку. я думаю, что это лучшее решение, чем попытка сохранить два массива с этими ассоциациями. в общем, если вам нужно иметь отношения с вашими данными, объект будет лучше, чем два массива :)

var fs = require('fs'); 
var files = []; 
var file = fs.createReadStream('test.txt'); 
var csv2 = require('csv2'); 
var th2 = require('through2'); 
var cv = require('opencv'); 

file 
.pipe(csv2({'separator': ';'})).pipe(th2({objectMode: true},function(parsedLine, enc, callback){ 
    var me = this; 
    cv.readImage(parsedLine[0], function(e, img) { 
     files.push({image: img, label: parsedLine[1]}); 
     me.push(parsedLine); 
     callback(); 
    }); 
})) 
.on('data', function(data){/*do something with data if you want to*/}) 
.on('end', function(){console.log(files);}); 
Смежные вопросы