2017-09-29 12 views
1

に失敗した私は、ノードのOpenCVを使用していますが、私は2枚のPNG画像のための規範を取得したいが、私は代わりに、これを持っている:OpenCVのアサーションは、型の不一致

OpenCV Error: Assertion failed (src1.size == src2.size && src1.type() == src2.type()) in norm, file /build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp, line 1978

サイズが同じで、種類が異なっています。最初のMat return 16と3と2番目の24と4については、type()メソッドとchannels()メソッドを使用します。

両方のイメージでconvertGrayscaleを実行しようとしましたが、 "Error:Image is no 3-channel"最初の4つのチャンネルが、を持っている?)私も(第2、16)second.convertToを実行しようとしましたが、

libpng warning: iCCP: known incorrect sRGB profile

を持って、何の効果、second.typeありませんでした

()まだ返さ24

のマットを変換する方法はありますかはある種のグレースケールにタイプするのですか? 私はさまざまな種類の画像をたくさん処理するつもりです。それらをグレースケールとして標準と比較する必要があります。

は、ここに私のスクリプトです:

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の警告は何も変わらないと思います

libpng warning: iCCP: known incorrect sRGB profile first [ 963, 1848 ] 16 3 second [ 963, 1848 ] 24 4 OpenCV Error: Assertion failed (src1.size == src2.size && src1.type() == src2.type()) in norm, file /build/opencv-RI6cfE/opencv-2.4.9.1+dfsg1/modules/core/src/stat.cpp, line 1978 terminate called after throwing an instance of 'cv::Exception' what(): /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() in function norm

Aborted (core dumped)

P.S. 両方の画像をGIMPのグレースケールに変換しようとしましたが、両方の画像のタイプとチャンネルが0/1になり、ノーマルが期待どおりに動作します。なぜopencvができないのか分かりません。

+1

あなたの 'convertTo'がベースのOpenCVからの' cv :: Mat :: convertTo'に対応するならば、それはあなたが望む機能ではありません。これにより、タイプ間で変換されます(uint8、floatなど)。あなたが探しているのは、**色空間**を変換することです。つまり、 'cvtColor'が必要です。 |あなたの入力画像の1つに透明度が含まれているように見えますが、もう1つは現在のチャンネルの数に違いがあります。 |残念ながら、それらのバインディングは元のAPIと非常によく似ているようには見えないので、私はもっと具体的なものを提供することはできません。 –

+1

また、 'convertTo 'を呼び出すとlibpngエラーが発生することはちょっと奇妙です.OpenCV自体では、その機能はlibpngとまったく関係ありません。 –

+0

ええ、私もこのバインディングに不満を持ち、別のものに切り替えることにしました。 –

答えて

2

は最後に、私はopencv4nodejsに(3.xのないOpenCVのv2.3.1ビットで動作します)node-opencvから切り替え(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); 

ように、このコードは同期的に動作し、それはきれいに見えます。