我正在尝试使用toBuffer()转换openCv矩阵,它可以与我通过var mat = new cv.Matrix()创建的矩阵一起正常工作,但是当我对通过cv.readImage打开的图像执行相同操作时,toBuffer()不返回任何内容,这是我的代码:

var cv =require('opencv');
var output;
var mat = new cv.Matrix(90,90);
cv.readImage("mona0.png", function(err,im){
  if (err) throw err;
  if (im.width() < 1 || im.height() < 1) throw new Error('Image has no size');

  im.bilateralFilter();
  console.log(im);
  output = im.clone();
  });
var buff = mat.toBuffer();// it works and returns something like <buffer ff d8 ff...>
//var buff = output.toBuffer(); // it doesn't work and returns nothing
console.log(buff);

所以,如果可能的话,我想从im获取输出,类似于从mat输出

先感谢您。

我尝试了您建议的代码,并且在调用.toBuffer函数后似乎停止工作,因为console.log('mat'+buff1)的结果未显示output,所以我找到了将某些内容转换为Buffer对象的方法(代码在下面),但是在这样,它会转换字符串'[Matrix 756 * 500]'而不是矩阵的内容,还有另一个技巧可能会有用,如果我尝试执行var buff = new Buffer(output);而不转换为字符串,它说output必须是字符串还是数组,所以现在我尝试将output转换为数组,还有一件事:.toBufferAsync(),但它需要一个参数,而我对哪个参数感到有些困惑。
 var cv =require('opencv');
var fs = require('fs');
var mat = new cv.Matrix(90,90);
cv.readImage("mona0.png", function(err,im){
  if (err) throw err;
  if (im.width() < 1 || im.height() < 1) throw new Error('Image has no size');

  im.bilateralFilter();
  console.log(im);
  var output = new cv.Matrix(im.width(),im.height())
  output = im.clone();
  var buff = new Buffer(output.toString('byte64')); // it should work now
  console.log('this is buff: ');
  console.log(buff);
  });
var buff1 = new Buffer(mat.toString('byte64'));// it works and returns something like <buffer ff d8 ff...>
console.log('this is buff1: ')
console.log(buff1)

最佳答案

我相信这是因为cv.readImage()是一个异步过程。
output.toBuffer()完成读取图像之前,应先评估cv.readImage
尝试移动var buff = output.toBuffer(); ,看看是否可以看到输出...即:

var cv =require('opencv');
var output;
var mat = new cv.Matrix(90,90);
cv.readImage("mona0.png", function(err,im){
  if (err) throw err;
  if (im.width() < 1 || im.height() < 1) throw new Error('Image has no size');

  im.bilateralFilter();
  console.log(im);
  output = im.clone();
  var buff = output.toBuffer(); // it should work now
  console.log('output'+buff)
  });
var buff1 = mat.toBuffer();// it works and returns something like <buffer ff d8 ff...>
console.log('mat'+buff1)
顺便说一句,日志应显示:

由于异步性质。
编辑:小改正

关于javascript - Node.js,OpenCV尝试使用toBuffer()函数将矩阵转换为缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42169937/

10-10 00:48