Javascript 使用Node.js中的OpenCV加载图像列表

Javascript 使用Node.js中的OpenCV加载图像列表,javascript,node.js,list,opencv,Javascript,Node.js,List,Opencv,我正在尝试加载许多图像,这些图像以以下格式列在CVS文件中: ./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 basePat

我正在尝试加载许多图像,这些图像以以下格式列在CVS文件中:

./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代表图像的高度和宽度

编辑:另外,你能想出一个比两个分开的数组更好的方法来保持每个图像与其标签关联吗


编辑:问题似乎是图像是异步加载的。所以问题是我缺乏异步编程的经验。我如何才能做到这一点?

这里有一个解决方案,它使用管道和csv2以及节点的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);});

您是否已为节点尝试此库@gabereal:这对我有什么帮助?您可以延迟每个循环的迭代,直到我在第二次编辑中假设的readImage是异步部分回调完成执行。使用lazy有什么好的理由吗?我不明白为什么您不使用“fs”和“readline”节点模块…请检查答案并接受它是否有效。谢谢