Esta no es una respuesta a su pregunta, solo es una sugerencia.
En mi opinión, el detector de esquina es una mala forma de detectar rectángulos; llevará mucho tiempo calcular todas las distancias de puntos como mathematician1975 sugerido. Debe utilizar otra técnica en esta situación:
- Ese sello es de color violeta, por lo que lo primero que debe hacer es segmentar el color.
- Después de que haya terminado con paso 1 puede usar Houhg transform para detectar líneas en la imagen binaria. O encuentre todos los contornos en la imagen.
- Y el último paso es detectar el rectángulo.
Actualización:
Aquí hay otra solución que debería funcionar también en imágenes en gris.
- Haz un umbral para convertir una imagen de 1 bit (utilicé de 255 como umbral).
- Encuentra todos los contornos en la nueva imagen que tienen un área más grande que alguna constante (tomé).
- Encuentra rectángulo que bordea para cada contorno y hacer una verificación:
ContourArea/BoundingReactangleArea> constante
Aprovecho esta constant
como 0,9.
Y este algoritmo me dio resultado siguiente:
Aquí es código de OpenCV:
Mat src = imread("input.jpg"), gray, result;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
result = Mat(src.size(), CV_8UC1);
cvtColor(src, src, CV_BGR2GRAY);
threshold(src, gray, 200, 255, THRESH_BINARY_INV);
findContours(gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
result = Scalar::all(0);
for (size_t i=0; i<contours.size(); i++)
{
Rect rect = boundingRect(contours[i]);
if (rect.area() > 1000)
{
double area = contourArea(contours[i]);
if (area/rect.area() > 0.9)
{
drawContours(result, contours, i, Scalar(255), -1);
}
}
}
Sí, como señaló el cálculo de todas las distancias consume mucho tiempo, incluso para _small_ imagen de entrada. Ya he comprobado esa solución. Segmentación del color no sería útil con las imágenes en escala de grises (los ejemplos son un poco confusos, lo siento) pero lo usé para los RGB. En cuanto a la transformada de Hough Hice algunas pruebas y funciona bastante bien, pero las líneas detectadas ** ** hacerlo no se cruza con otra como se muestra aquí: [Hough] (http://i.imgur.com/NP8HT .jpg). – sowizz
@sowizz mira la actualización. – ArtemStorozhuk
Esto funciona bastante bien en la mayoría de los casos, así que lo voy a marcar como respuesta. Sin embargo, en algunas situaciones falla porque no hay un área cerrada. Las operaciones morfológicas son útiles entonces, pero para casi cada caso necesitan diferentes parámetros, lo que los hace no tan útiles. ¿Alguna idea de cómo resolver ese problema? Aquí hay un ejemplo de tal situación: [click] (http://i.imgur.com/mY27w.jpg) – sowizz