2

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()。しかし、理想的には、クローン作成のオーバーヘッドは必要ありません。これを回避する方法はありますか?

4

1 に答える 1

1

これは、OpenCVの既知のバグのようです。修正されるまでは、複製が最善の回避策かもしれません。

于 2013-08-23T19:18:08.760 に答える