You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Assuming that all shapes in the image have the same color, it is possible to
recognize an annulus of a circle or of an ellipse, when the color of the center
of the Blob is different from the color of the shape.
Recovering the edges through the functions:
blobCounter.GetBlobsLeftAndRightEdges and blobCounter.GetBlobsTopAndBottomEdges
then you can do this:
____________
| / \ | Assuming that the shape is Blue
| / /\ \ | if it was a circle the center should be also Blue
| | | | | | but in this case is "White"
| \ \/ / |
|___\____/___|
sample code:
BlobCounter blobCounter = new BlobCounter();
blobCounter.ProcessImage(bmpTemp);
Blob[] blobs = blobCounter.GetObjectsInformation();
GrahamConvexHull grahamScan = new GrahamConvexHull();
SimpleShapeChecker shapeChecker = new SimpleShapeChecker();
foreach (Blob blob in blobs)
{
List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blob);
List<IntPoint> hull = grahamScan.FindHull(edgePoints);
shapeChecker.MinAcceptableDistortion = 0; //For circles
List<IntPoint> corners;
AForge.Point center;
float radius;
if (shapeChecker.IsCircle(edgePoints, out center, out radius))
{
//check if is an annulus
}
else if (shapeChecker.IsQuadrilateral(edgePoints, out corners))
{
...
}
else
{
// For ellipses
shapeChecker.MinAcceptableDistortion = blob.Rectangle.Width / 2;
if (shapeChecker.IsCircle(edgePoints, out center, out radius))
{
//check if is an annulus
List<IntPoint> leftEdge, rightEdge, topEdge, bottomEdge;
blobCounter.GetBlobsLeftAndRightEdges(blob, out leftEdge, out rightEdge);
blobCounter.GetBlobsTopAndBottomEdges(blob, out topEdge, out bottomEdge);
Bitmap bmpRect = new Bitmap(originalImage.Width, originalImage.Height, PixelFormat.Format24bppRgb);
Graphics gRect = Graphics.FromImage(bmpRect);
gRect.DrawImage(originalImage, blob.Rectangle, blob.Rectangle, GraphicsUnit.Pixel);
GraphicsPath path = new GraphicsPath();
leftEdge.Insert(0, new IntPoint(0, 0));
leftEdge.Add(new IntPoint(0, originalImage.Height));
path.AddPolygon(PointsListToArray(leftEdge));
rightEdge.Insert(0, new IntPoint(originalImage.Width, 0));
rightEdge.Add(new IntPoint(bmpTemp.Width, originalImage.Height));
path.AddPolygon(PointsListToArray(rightEdge));
gRect.FillPath(brush, path);
path = new GraphicsPath();
topEdge.Insert(0, new IntPoint(0, 0));
topEdge.Add(new IntPoint(originalImage.Width, 0));
path.AddPolygon(PointsListToArray(topEdge));
bottomEdge.Insert(0, new IntPoint(0, originalImage.Height));
bottomEdge.Add(new IntPoint(originalImage.Width, originalImage.Height));
path.AddPolygon(PointsListToArray(bottomEdge));
gRect.FillPath(brush, path);
gRect.Dispose();
//recall blobCounter to find the inner circle or ellipse on bmpRect
}
}
}
Original issue reported on code.google.com by marco.di...@gmail.com on 24 Jan 2013 at 12:50
The text was updated successfully, but these errors were encountered:
Could you please clarify what is this ticket about? Do you ask for detection of
other shapes or do you suggest a way to detect ellipses? If you suggest, then I
would say it does not look right to detect ellipses using circle detection
routine with large distortion limit. Ellipse has well defined equation, which
needs to be used to find how well is the points’ fit to the shape.
Original comment by andrew.k...@gmail.com on 24 Jan 2013 at 11:11
I know that ellipse has well defined equation, but the shapechecker does not
recognize ellipses but only circle. I suggest a way to detect all type of
shapes inserting also the ellipse equation, I use the method described in the
issue because the shapechecker has only IsCircle method. Once it will detect
also ellipses, you can use my suggestion to detect annulus, or annulus sectors
with start angle, end angle and arcwidth which for circles is: (outer circle
width - inner circle width) / 2, for ellipses i don't know
Original comment by marco.di...@gmail.com on 24 Jan 2013 at 1:33
Original issue reported on code.google.com by
marco.di...@gmail.com
on 24 Jan 2013 at 12:50The text was updated successfully, but these errors were encountered: