$search
00001 #include "EdgeDetection/MicroEdgeMap.h" 00002 00003 #include "EdgeDetection/EdgeImage.h" 00004 #include "EdgeDetection/Image.h" 00005 00006 namespace EdgeDetection 00007 { 00008 Edge MicroEdgeMap::FindRealEdge(Edge measuredEdge) 00009 { 00010 Edge bestEdge = Edge(0, 0); 00011 Edge bestEdgeMeasured = MeasureEdge(bestEdge); 00012 00013 for (size_t index = 0; index < entries.size(); index++) 00014 { 00015 Edge sampleEdge = entries[index].GetRealEdge(); 00016 Edge sampleEdgeMeasured = entries[index].GetMeasuredEdge(); 00017 00018 if (Edge::GetDistance(measuredEdge, sampleEdgeMeasured) <= Edge::GetDistance(measuredEdge, bestEdgeMeasured)) 00019 { 00020 bestEdge = sampleEdge; 00021 bestEdgeMeasured = sampleEdgeMeasured; 00022 } 00023 } 00024 00025 return bestEdge; 00026 } 00027 00028 void MicroEdgeMap::PopulateTable(Rectangle area, int offsetCount, int angleCount) 00029 { 00030 if (area.GetLeft() < -1 || area.GetRight() > +1 || area.GetTop() < -M_PI || area.GetBottom() > +M_PI) throw "The parameter 'area' was out of range."; 00031 if (offsetCount <= 0) throw "The parameter 'offsetCount' was out of range."; 00032 if (angleCount <= 0) throw "The parameter 'angleCount' was out of range."; 00033 00034 for (int offsetIndex = 0; offsetIndex < offsetCount; offsetIndex++) 00035 for (int angleIndex = 0; angleIndex < angleCount; angleIndex++) 00036 { 00037 double offset = area.GetLeft() + offsetIndex * (area.GetWidth() / (offsetCount - 1)); 00038 double angle = area.GetTop() + angleIndex * (area.GetHeight() / (angleCount - 1)); 00039 00040 Edge realEdge = Edge(offset, angle); 00041 Edge measuredEdge = MeasureEdge(realEdge); 00042 00043 entries.push_back(Entry(realEdge, measuredEdge)); 00044 } 00045 } 00046 Edge MicroEdgeMap::MeasureEdge(Edge realEdge) 00047 { 00048 EdgeImage* realEdgeImage = new EdgeImage(Line::FromEdge(realEdge), Rectangle(-1, +1, -1, +1)); 00049 Image* image = rasterizer->Rasterize(realEdgeImage, microEdgeDetector->GetSize(), microEdgeDetector->GetSize()); 00050 Edge measuredEdge = microEdgeDetector->DetectEdge(image); 00051 00052 delete realEdgeImage; 00053 delete image; 00054 00055 return measuredEdge; 00056 } 00057 };