Node.js,OpenCV尝试使用toBuffer()函数将矩阵转换为缓冲区

时间:2017-02-10 22:52:15

标签: javascript node.js opencv

我正在尝试使用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,所以现在我正在尝试将 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) 转换为数组,还有一件事:。 toBufferAsync(),但它需要一个参数,我有点困惑哪一个。

    <script>
    var seconds_left = 2;
    var interval = setInterval(function() {
        document.getElementById('timer_div').innerHTML = --seconds_left;

        if (seconds_left <= 0)
        {
           document.getElementById('timer_div').innerHTML = "<div class='g-recaptcha' data-sitekey='mykey' style='transform:scale(0.77);-webkit-transform:scale(0.77);transform-origin:0 0;-webkit-transform-origin:0 0;'></div>";
           clearInterval(interval);
        }
        }, 1000);
    </script>
<div id="timer_div"></div>

1 个答案:

答案 0 :(得分:0)

我相信它是因为cv.readImage()是一个asych过程。

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)

顺便说一下,日志应显示:

  

垫BUFF1

     

输出BUFF

由于异步性质。

编辑:小修正