простой пример c ++ (найден после поиска на нескольких сайтах)
#include <bits/stdc++.h>
#include <cassert>
#include <exception>
#include <iostream>
int main (const int argc, const char **argv) {
try {
assert (argc == 2);
const std::string filename = (const std::string) argv [1];
const std::string begin = "g++-7 " + filename;
const std::string end = " -Wall -Werror -Wfatal-errors -O3 -std=c++14 -o a.elf -L/usr/lib/x86_64-linux-gnu";
const std::string command = begin + end;
std::cout << "Compiling file using " << command << '\n';
assert (std::system ((const char *) command.c_str ()) == 0);
std::cout << "Running file a.elf" << '\n';
assert (std::system ((const char *) "./a.elf") == 0);
return 0; }
catch (std::exception const& e) { std::cerr << e.what () << '\n'; std::terminate (); }
catch (...) { std::cerr << "Found an unknown exception." << '\n'; std::terminate (); } }
Типичная цепочка инструментов Python будет выглядеть следующим образом:
Что касается различения форм , я бы получил его силуэт, глядя на форму фона. Затем я бы определил количество углов, используя алгоритм определения углов (например, Харрис). У треугольника 3 угла, у квадрата 4, а у смайлика нет. Вот реализация python определения угла Харриса с помощью Scipy .
Изменить:
Как вы упомянули в комментариях, сообщение в блоге не представляло функцию, которая производит гауссовское ядро, необходимое в алгоритм. Вот пример такой функции из Scipy Cookbook (отличный ресурс, кстати):
def gauss_kern(size, sizey=None):
""" Returns a normalized 2D gauss kernel array for convolutions """
size = int(size)
if not sizey:
sizey = size
else:
sizey = int(sizey)
x, y = mgrid[-size:size+1, -sizey:sizey+1]
g = exp(-(x**2/float(size)+y**2/float(sizey)))
return g / g.sum()
OpenCV имеет инструменты анализа blob, это предоставит вам показатели формы, которые вы можете использовать для своего любимого алгоритма распознавания образов :) Например. прямоугольник имеет отношение площади к площади / (высоте * ширины) 1,0, тогда как отношение круга составляет около 0,78.
Если вы знаете пространство состояний ваших данных, вы можете использовать анализ основных компонентов. В PCA все объекты должны быть размещены (в центре экрана). PCA не выполняет обнаружение, но разделяет объекты на уникальные слои, в которых вы можете идентифицировать их как треугольник и т. Д. Также обратите внимание: это не инвариантный масштаб или вращение.
[Я не могу вспомнить, как называется эта техника, но она похожа на то, как почтовое отделение делает рукописный ввод] Если вы можете обрабатывать только неизогнутые криволинейные поверхности, вы можете выполнить обнаружение краев, а затем выполнить выборку на пересечениях, чтобы получить приблизительное сходство.
Вы указываете геометрическую фигуру 50x50 пикселей. Если размер и ориентация геометрических фигур фиксированы , у вас есть классическая задача сопоставления шаблонов , подходящая для метода корреляции . Вы можете применить сопоставление с шаблоном к исходному изображению или к выходному сигналу обнаружения границ.
В противном случае, если размер (масштаб) и / или ориентация являются произвольными, могут применяться дескрипторы Фурье . Эти дескрипторы являются инвариантами вращения и масштабирования.
Все эти методы могут быть закодированы с использованием OpenCV, NumPy или SciPy.