Pregunta

Dado un objeto sobre un fondo blanco liso, ¿alguien sabe si OpenCV proporciona funcionalidad para detectar fácilmente un objeto de un marco capturado?

Estoy tratando de localizar los puntos de esquina / centro de un objeto (rectángulo). La forma en que lo estoy haciendo actualmente es por fuerza bruta (escaneando la imagen para el objeto) y no es precisa. Me pregunto si hay funcionalidad bajo el capó que no conozco.

Editar detalles : El tamaño es casi igual que una lata de refresco pequeña. La cámara se coloca sobre el objeto, para darle una sensación 2D / Rectángulo. La orientación / ángulo de la cámara es aleatoria, que se calcula a partir de los puntos de las esquinas.

Es solo un fondo blanco, con el objeto (negro). La calidad de la toma depende de lo que esperaría ver de una cámara web Logitech.

Una vez que obtengo los puntos de esquina, calculo el centro. El punto central se convierte a centímetros.

Está refinando "cómo" obtengo esas 4 esquinas en las que estoy tratando de enfocarme. Puede ver mi método de fuerza bruta con esta imagen: Imagen

¿Fue útil?

Solución

Ya hay un ejemplo de cómo hacer detección de rectángulo en OpenCV (mira en samples / squares.c), y es bastante simple, en realidad.

Aquí está el algoritmo aproximado que usan:

0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1  image_canny <- apply canny edge detector to this channel
2.2  for threshold in bunch_of_increasing_thresholds:
2.2.1   image_thresholds[threshold] <- apply threshold to this channel
2.3  for each contour found in {image_canny} U image_thresholds:
2.3.1   Approximate contour with polygons
2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1    rectangles <- rectangles U {contour}

No es una transcripción exacta de lo que están haciendo, pero debería ayudarte.

Otros consejos

Espero que esto ayude, utiliza el método de momento para obtener el centroide de una imagen en blanco y negro.

cv::Point getCentroid(cv::Mat img)
{
    cv::Point Coord;
    cv::Moments mm = cv::moments(img,false);
    double moment10 = mm.m10;
    double moment01 = mm.m01;
    double moment00 = mm.m00;
    Coord.x = int(moment10 / moment00);
    Coord.y = int(moment01 / moment00);
    return Coord;
}

OpenCV tiene un montón de funciones que pueden ayudarlo a lograr esto. Descargue Emgu.CV para un C # .NET envuelto en la biblioteca si está programando en ese lenguaje.

Algunos métodos para obtener lo que desea:

  1. Encuentra las esquinas como antes, p. " CornerHarris " Función OpenCV

  2. Umbralice la imagen y calcule el centro de gravedad: consulte http : //www.roborealm.com/help/Center%20of%20Gravity.php ... este es el método que usaría. Incluso puede realizar el umbral en la rutina COG. es decir, cog_x + = * imagePtr < 128? 255: 0;

  3. Encuentra los momentos de la imagen para dar rotación, centro de gravedad, etc., p. " Momentos " Función OpenCV. (No he usado esto)

  4. (editar) La biblioteca AForge.NET tiene funciones de detección de esquinas, así como un proyecto de ejemplo (MotionDetector) y bibliotecas para conectarse a cámaras web. Creo que este sería el camino más fácil, suponiendo que esté utilizando Windows y .NET.

Generalmente se llama análisis de blobs en otras bibliotecas de visión artificial. No he usado opencv todavía.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top