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);
正如你所看到的,现在这个代码同步工作,所以看起来更干净。