2014-09-18 33 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 ],其中HW代表的高度和图像的宽度。

编辑:另外,你可以想到一个更好的方式比2分离数组保持每个图像与其标签相关联?

编辑:问题似乎是图像加载异步。所以问题在于我缺乏异步编程的经验。我该如何做这项工作?

+0

你尝试过这个库的节点? https://github.com/caolan/async – gabereal 2014-09-18 19:04:22

+0

@gabereal:应该怎样帮助我? – 2014-09-18 19:09:25

+0

你可以延迟每个循环的迭代,直到readImage(我从你的第二次编辑中假定是异步部分)回调完成执行。有什么好的理由使用懒惰?我不明白你为什么不使用'fs'和'readline'节点模块... – gabereal 2014-09-18 20:09:37

回答

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);});