OpenCV 関数dilate()を、実際には大きな画像内の ROI であるオブジェクトerode()に適用する必要があります。 元の画像内に ROI のヘッダーを作成することによって生成されます。MatMat roiImgimg
Mat img = imread(...);
Mat roiImg = img (Rect(...));
これは の引数のリストですerode():
void erode(InputArray src, OutputArray dst, InputArray kernel, Pointanchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
問題は、関数 erode/dilate への入力画像が ROI のヘッダーであるためBORDER_CONSTANT、境界値と等しい境界線タイプとして選択しmorphologyDefaultBorderValue()ても影響がなく、境界値が元から取得されるように見えることです。画像。
次に、のドキュメントでこれを見つけましたcopyMakeBorder():
ソース画像がより大きな画像の一部 (ROI) である場合、関数は ROI の外側のピクセルを使用して境界線を形成しようとします。この機能を無効にして
src、ROI ではないかのように常に外挿を行うには、borderType | を使用します。BORDER_ISOLATED.
ただし、cv::borderInterpolate()関数内から呼び出される関数は、有効な境界線の種類としてerode()受け入れられません!BORDER_ISOLATED
今のところ、この問題を回避するには、 を複製roiImgしてから を呼び出す必要がありますerode()。しかし、理想的には、クローン作成のオーバーヘッドは必要ありません。これを回避する方法はありますか?