OpenCV Assertion失败类型不匹配

时间:2017-09-29 16:19:03

标签: node.js opencv image-processing png node-opencv

我正在使用node-opencv,我想获得两个PNG图像的规范,但我有这个:

  

OpenCV错误:断言失败(src1.size == src2.size&& src1.type()   = nrcrc中的= src2.type()),文件/build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp,   1978年

尺寸相同,类型不同。 type()和channels()方法,第一个Mat返回16和3,第二个24和4。

我尝试用两个图像进行convertGrayscale并得到“错误:图像没有3通道”(好吧,第二个有4个通道,但是第一个?)

我也试过做second.convertTo(第二次,第16次),但得到了

  

libpng警告:iCCP:已知错误的sRGB配置文件

并且没有效果,second.type()仍然返回24

有没有办法将任何类型的Mat转换为某种灰度? 我打算处理很多不同类型的图像,我需要将它们与标准作为灰度进行比较。

这是我的剧本:

var Promise = require("bluebird")
  , fs = Promise.promisifyAll(require('fs'))
  , cv = require('./opencv-build/node-opencv/lib/opencv');
var readImage = Promise.promisify(cv.readImage);
var ImageSimilarity = Promise.promisify(cv.ImageSimilarity);;
var imgdir = __dirname+'/img/';
var img_o = imgdir + 'src/walken.png';
var img_d = imgdir + 'dst/walken.png';

readImage(img_o).
then(function(first){
  readImage(img_d)
  .then(second=>{
    second.convertTo(second,16);//no effect and >libpng warning: iCCP: known incorrect sRGB profile
    console.log("first",
      first.size(),
      first.type(),
      first.channels(),
      "second",
      second.size(),
      second.type(),
      second.channels());
    //second.convertGrayscale();//doesn't work Error: Image is no 3-channel
    console.log(first.norm(second, cv.Constants.NORM_L2));
  });
});

这是输出:

  

libpng警告:iCCP:首先知道不正确的sRGB配置文件[963,1848]   16 3秒[963,1848] 24 4 OpenCV错误:断言失败   (src1.size == src2.size&& src1.type()== src2.type())在norm,file   /build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp,   在抛出一个实例后,1978年终止了   'cv :: Exception'what():   /build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp:1978:   错误:(-215)src1.size == src2.size&& src1.type()== src2.type()in   功能规范

     

中止(核心倾销)

我认为libpng警告不会改变任何内容。

P.S。 我试图在GIMP中将两个图像转换为灰度,两个图像的类型和通道都变为0/1,并且规范按预期工作,我无法理解为什么opencv无法做到。

1 个答案:

答案 0 :(得分:2)

最后我从node-opencv(适用于OpenCV v2.3.1位而不是3.x)切换到opencv4nodejs(适用于OpenCV v3 +)

现在规范运作良好。仍有libpng警告,但它可以正常工作。

看起来OpenCV现在自己处理频道不匹配。 这是我的opencv4nodejs代码:

const cv = require('opencv4nodejs');
var imgdir = __dirname+'/img/';
var img_o = imgdir + 'src/walken.png';
var img_d = imgdir + 'dst/walken.png';

var first = cv.imread(img_o);
var second = cv.imread(img_d);
console.log(first.norm(second), cv.NORM_L2);

如您所见,此代码现在可以同步工作,因此它看起来更干净。