我正在使用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无法做到。
答案 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);
如您所见,此代码现在可以同步工作,因此它看起来更干净。