バイナリ イメージで輪郭を見つけ、小さなものを除外する関数を実装しようとしています。
これが私のコードとサンプル画像です。これは、小さな領域のブロブを削除する非常にシンプルな機能です。しかし、領域の輪郭ではなく、「エッジの輪郭」を取得し続けています。:S
private IplImage RemoveNoise( IplImage image, int minArea )
{
List<CvPoint[]> listOfPoints = new List<CvPoint[]>();
CvSeq<CvPoint> contoursRaw;
List<ContourData> contours = new List<ContourData>();
using( CvMemStorage storage = new CvMemStorage() )
{
//find contoures
//Cv.FindContours( image, storage, out contoursRaw );
Cv.FindContours( image, storage, out contoursRaw, CvContour.SizeOf, ContourRetrieval.Tree, ContourChain.ApproxSimple );
//contoursRaw = Cv.ApproxPoly( contoursRaw, CvContour.SizeOf, storage, ApproxPolyMethod.DP, 3, true );
while( contoursRaw != null )
{
CvSeq<CvPoint> result = contoursRaw;
double area = Cv.ContourArea( result );
//filter out small regions
if( area >= minArea )
{
List<CvPoint> points = new List<CvPoint>();
int i = 0;
while( result[ i ] != null )
{
points.Add( new CvPoint( result[ i ].Value.X, result[ i ].Value.Y ) );
i++;
}
listOfPoints.Add( points.ToArray() );
}
contoursRaw = contoursRaw.HNext;
}
}
// draw large regions
IplImage output = new IplImage( image.Size, image.Depth, 1 );
output.Set( CvColor.Black );
CvPoint[][] ArrayOfPoints = listOfPoints.ToArray();
output.FillPoly( ArrayOfPoints, CvColor.White );
return output;
}
領域の輪郭ではなく、「エッジの輪郭」を取得し続けるのはなぜですか?
結果は次のとおりです。
ここに画像の説明を入力してください