2017-11-08 6 views
0

Java OpenCV(3.3.1、windows 8 x64)との最初の接触では、ROIを持つ2つの異なるサイズの画像を動的に結合しようとしています。ここで私のコードのビット:ROIで異なるサイズの画像に結合する

Mat _mat = Utils.imageFileToMat(new File("angelina_jolie.jpg")); //Angelina's face 
Mat grayMat = new Mat(); 
Imgproc.cvtColor(_mat, grayMat, Imgproc.COLOR_BGR2GRAY); 
Rect rect = new Rect(new Point(168, 104), new Point(254, 190)); //Angelina's eye ROI 
Mat truncated = _mat.submat(rect); //Angelina's eye mat 

Mat merge = _mat.clone(); 
truncated.copyTo(merge); 

//show _mat 
//show truncated 
//show merge 

私が見たいと思っているのは、グレースケールで彼女の目で、アンジェリーナ・ジョリーです。

私が見ているのはアサーションまたは切り捨てられたイメージ(目だけ)です。

私はcopyTo(mat, mask)setOfで試しましたが、多くのことが常に新しいアサーションになりました。

サイズに合わせてマットのサイズに切り捨てる必要がありますか?どのようにプログラムでそれを行うことができますか?

答えて

1

Mat::copyToドキュメント:

方法コピーマトリクスデータ別の行列です。 データをコピーする前に、この方法は、呼び出し:

m.create(this->size(),this->type()); 

必要であれば、先の行列が を再割り当てされるようになっています。一方、m.copyTo(m);機能は完璧に機能しますが、この機能では、ソースと宛先の間の部分的な重なりのケースを処理しません。

操作マスクが指定されている場合、上の のMat :: create呼び出しで行列が再割り当てされた場合、新しく割り当てられた行列はデータをコピーする前にすべて0で初期化されます。

@param m デスティネーションマトリクス。 操作の前に適切なサイズまたはタイプがない場合は、再割り当てされます。

srcとdstイメージのサイズとチャネルが同じではないため、宛先イメージは再割り当てされ、ゼロで初期化されます。これを回避するには、両方の画像の寸法とチャンネル数が同じであることを確認してください。

Imgproc.cvtColor(grayMat, grayMat, Imgproc.COLOR_GRAY2BGR); 

は今マスクを作成します。私は解決策を見つけたと、私はあなたの答えを見たので

Mat mask = new Mat(_mat.size(), CvType.CV_8UC1, new Scalar(0)); 
Imgproc.rectangle(mask, new Point(168, 104), new Point(254, 190),new Scalar(255)); 
// copy gray to _mat based on mask 
Mat merge = _mat.clone(); 
grayMat.copyTo(merge,mask); 
+0

私は自分の質問に答えるためにここに来ました。ありがとう! (答えはopencvのサイトで私もあなたもそれに答えると同じ質問を投稿した) – jotapdiez

+0

@jotapdiezあなたはそれを取る;)あなたが解決策を見つけたことは素晴らしい。 – zindarod

+0

私はこの問題をImgproc.cvtColor(grayMat、grayMat、Imgproc.COLOR_GRAY2BGR)とtruncated.copyTo(merge.submask ....)だけで解決します。マスク作成はサブマスクよりも優れていますか? – jotapdiez

関連する問題