【问题标题】:OpenCV Assertion failed type mismatchOpenCV 断言失败类型不匹配
【发布时间】:2018-03-11 14:36:23
【问题描述】:

我正在使用 node-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 行

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

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

我也尝试过 second.convertTo(second,16) 但得到了

libpng 警告:iCCP:已知不正确的 sRGB 配置文件

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

有没有办法将 any 类型的 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()) 规范,文件 /build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp, 第 1978 行终止在抛出一个实例后调用 'cv::异常'什么(): /build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp:1978: 错误:(-215) src1.size == src2.size && src1.type() == src2.type() 在 功能规范

中止(核心转储)

我认为 libpng 警告没有任何改变。

附: 我试图在 GIMP 中将两个图像都转换为灰度,两个图像的类型和通道都变为 0/1,并且 norm 按预期工作,我不明白为什么 opencv 不能这样做。

【问题讨论】:

  • 如果您的 convertTo 对应于基础 OpenCV 中的 cv::Mat::convertTo,那么这不是您想要的功能。这只会在类型之间转换(即 uint8、float 等)。您正在寻找的是转换色彩空间,这意味着您需要cvtColor。 |看起来您的输入图像之一包含透明度,另一个现在包含透明度,因此通道数不同。 |不幸的是,这些绑定似乎与原始 API 不太匹配,所以恐怕我无法提供更具体的内容。
  • convertTo 的调用会产生 libpng 错误也有点奇怪 - 在 OpenCV 本身中,该功能与 libpng 完全无关。
  • 是的,我也对这个绑定不满意,所以决定换一个。

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


【解决方案1】:

最后我从 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);

如您所见,这段代码现在可以同步运行,因此看起来更简洁。

【讨论】: