Opencv 2.4.10。
以下のコードの最後で、マトリックス Img2 上の 9 幅のディスク構造要素を使用して膨張が呼び出されます。もともと、Img2 は単純なヘッダー コピー (Img2=Img1) によって Img1 から作成されました。Img1 が Img0 の最初と最後の 3 行を持たないように、範囲を介して Img0 からデータをコピーせずに Img1 が作成されたことに注意してください。拡張の結果が正しくありませんでした。
ただし、クローン Img2=Img1.clone() を介して Img2 の完全なコピーを使用すると、拡張は正しく機能しました。
以下のコードには示されていませんが、Img2 での imwrite の使用は、使用したコピー方法に関係なく同じであることに注意してください。では、モルフォロジー演算子も同じように機能するべきではないでしょうか?
Mat Tmp;
Mat Img1=Img0(Range(3-1, Img0.rows - 3+1),Range::all());
Img1(Range(0,1), Range::all()) = 0;
Img1(Range(Img1.rows-1,Img1.rows), Range::all()) = 0;
// bad
//Mat Img2 = Img1; // header only copy: the dilation results are wrong on the top and bottom
// good
Mat Img2 = Img1.clone(); // full copy, dilation works right.
Mat Disk4;
// exact replacement for mmatlab strel('disk',4,0), somewhat difference than opencv's ellipse structuring element.
MakeFilledEllipse( 4, 4, Disk4);
// If I use Img2 from clone, this is the same as matlab's.
// If I just do a header copy some areas the top and bottom are different
dilate(Img2, Tmp,Disk4, Point(-1,-1),1,BORDER_CONSTANT, Scalar(0));
編集- その後、Img2 が img1 を置き換え、img1 がないようにコードを単純化して、Mat ヘッダーの間接化の 1 レベルのみで問題を繰り返すことができ、同じように失敗しました (間違っていました)。
Mat Tmp;
Mat Img2=Img0(Range(3-1, Img0.rows - 3+1),Range::all());
Img2(Range(0,1), Range::all()) = 0;
Img2(Range(Img2.rows-1,Img2.rows), Range::all()) = 0;
Mat Disk4;
// exact replacement for mmatlab strel('disk',4,0), somewhat difference than opencv's ellipse structuring element.
MakeFilledEllipse( 4, 4, Disk4);
// bad result
dilate(Img2, Tmp,Disk4, Point(-1,-1),1,BORDER_CONSTANT, Scalar(0));