OpenCV声明失败types不匹配

我正在使用节点opencv,我想获得两个PNG图像的标准,但我有这个:

OpenCV错误:声明失败(src1.size == src2.size && src1.type()== src2.type())在标准,文件/build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core /src/stat.cpp,第1978行

大小是相等的,types是不同的。 第一个Mat返回16和3以及第二个24和4的type()和channels()方法。

我试图做convertGrayscale与两个图像,并得到“错误:图像是没有3通道”(好,第二有4个通道,但首先?)

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

libpng警告:iCCP:已知错误的sRGBconfiguration文件

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

有什么方法可以将任何types的Mat转换为某种灰度? 我打算处理很多不同types的图像,我需要把它们与灰度作比较。

这是我的脚本:

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:首先已知错误的sRGBconfiguration[963,1848] 16 3秒[963,1848] 24 4 OpenCV错误:断言失败(src1.size == src2.size && src1.type()== src2.type ())在规范中,文件/build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp,1978年抛出一个“cv :: Exception”实例后终止调用什么() :/build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp:1978:error:(-215)src1.size == src2.size && src1.type()==函数规范中的src2.type()

中止(核心倾弃)

我认为libpng警告不会改变。

PS我试图将两个图像转换为GIMP灰度,两个图像的types和渠道成为0/1和规范工作如期,我不明白为什么opencv不能做到这一点。

最后,我从node-opencv (与OpenCV v2.3.1 bit not 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); 

正如你所看到的,现在这个代码同步工作,所以看起来更干净。