Ответ 1
Мы можем определить "признание" как способность обнаруживать признаки/характеристики в элементах и сравнивать их с особенностями известных элементов, наблюдаемых в нашем опыте. Объекты с похожими функциями, вероятно, похожи на объекты. Чем выше количество и сложность функций, тем больше наша способность различать похожие объекты.
В случае фигур мы можем использовать их геометрические свойства, такие как количество углов, значения углов, количество сторон, размеры сторон и т.д. Поэтому для выполнения вашей задачи вы должны использовать алгоритмы обработки изображений для извлечения таких объектов из чертежей.
Ниже я представляю очень простой подход, который демонстрирует эту концепцию на практике. Мы узнаем разные формы, используя число углов. Как я сказал: "Чем выше количество и сложность функций, тем больше наша способность различать похожие объекты". Поскольку мы используем только одну функцию, количество углов, мы можем различать несколько различных видов фигур. Формы с одинаковым числом углов не будут дискриминироваться. Поэтому, чтобы улучшить подход, вы можете добавить новые функции.
<ч/" > UPDATE:
Чтобы выполнить эту задачу в реальном времени, вы можете извлечь функции в режиме реального времени. Если объект, который нужно нарисовать, является треугольником, а пользователь рисует четвертую сторону любой другой фигуры, вы знаете, что он или она не рисует треугольник. О уровне правильности вы можете рассчитать расстояние между вектор-функцией желаемого объекта и нарисованным.
Ввод:
Алгоритм
- Уменьшите входное изображение, так как требуемые функции могут быть обнаружены в более низком разрешении.
- Сегмент каждого объекта, который будет обрабатываться независимо.
- Для каждого объекта извлекайте его функции, в этом случае просто количество углов.
- Используя функции, классифицируйте форму объекта.
Программное обеспечение:
Программное обеспечение, представленное ниже, было разработано на Java и с помощью Marvin Image Processing Framework. Однако вы можете использовать любой язык и инструменты программирования.
import static marvin.MarvinPluginCollection.floodfillSegmentation;
import static marvin.MarvinPluginCollection.moravec;
import static marvin.MarvinPluginCollection.scale;
public class ShapesExample {
public ShapesExample(){
// Scale down the image since the desired features can be extracted
// in a lower resolution.
MarvinImage image = MarvinImageIO.loadImage("./res/shapes.png");
scale(image.clone(), image, 269);
// segment each object
MarvinSegment[] objs = floodfillSegmentation(image);
MarvinSegment seg;
// For each object...
// Skip position 0 which is just the background
for(int i=1; i<objs.length; i++){
seg = objs[i];
MarvinImage imgSeg = image.subimage(seg.x1-5, seg.y1-5, seg.width+10, seg.height+10);
MarvinAttributes output = new MarvinAttributes();
output = moravec(imgSeg, null, 18, 1000000);
System.out.println("figure "+(i-1)+":" + getShapeName(getNumberOfCorners(output)));
}
}
public String getShapeName(int corners){
switch(corners){
case 3: return "Triangle";
case 4: return "Rectangle";
case 5: return "Pentagon";
}
return null;
}
private static int getNumberOfCorners(MarvinAttributes attr){
int[][] cornernessMap = (int[][]) attr.get("cornernessMap");
int corners=0;
List<Point> points = new ArrayList<Point>();
for(int x=0; x<cornernessMap.length; x++){
for(int y=0; y<cornernessMap[0].length; y++){
// Is it a corner?
if(cornernessMap[x][y] > 0){
// This part of the algorithm avoid inexistent corners
// detected almost in the same position due to noise.
Point newPoint = new Point(x,y);
if(points.size() == 0){
points.add(newPoint); corners++;
}else {
boolean valid=true;
for(Point p:points){
if(newPoint.distance(p) < 10){
valid=false;
}
}
if(valid){
points.add(newPoint); corners++;
}
}
}
}
}
return corners;
}
public static void main(String[] args) {
new ShapesExample();
}
}
Выход программного обеспечения:
figure 0:Rectangle
figure 1:Triangle
figure 2:Pentagon