[Procesamiento de imagen OpenCV] Caso de implementación de código de casco convexo (Convex Hull)

¿Qué es un casco convexo?

La línea que conecta dos puntos cualquiera se incluye en el límite del polígono y existe otra condición de restricción, es decir, el polígono es el más pequeño.

Aplicaciones de casco convexo

La detección de casco convexo de objetos se usa a menudo en el reconocimiento de objetos, el reconocimiento de gestos y la detección de límites.
La detección de casco convexo se usa a menudo después del análisis de contorno. Después del análisis de contorno de la imagen binaria, se puede construir el casco convexo de cada contorno, y el conjunto de puntos contenido en el casco convexo se devolverá después de que se complete la construcción. De acuerdo con el conjunto de puntos de casco convexo devuelto, se puede dibujar el casco convexo correspondiente del contorno. En general, una curva convexa siempre es convexa, o al menos plana. Si hay un lugar que es cóncavo, se llama defecto de convexidad.

Explicación de la función convexHull

Forma de llamada de la función convexHull

    void convexHull(InputArray points,OutputArray hull,bool clockwise =  false,

                                 bool returnPoints = true)

Explicación detallada del parámetro:

  • Puntos InputArray: el conjunto de puntos obtenido, generalmente los puntos de contorno obtenidos por la función de contorno de imagen

  • Casco OutputArray: la salida es el valor de coordenadas del punto xy bidimensional del casco convexo, que se forma para cada contorno

  • booleano en sentido horario = falso: Indica la dirección del casco convexo, en sentido horario o antihorario

  • bool returnPoint = true: Indica si devolver el punto o el índice de la dirección del punto

código de ejemplo

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

static void help(char** argv)
{
    
    
    cout << "\nThis sample program demonstrates the use of the convexHull() function\n"
         << "Call:\n"
         << argv[0] << endl;
}

int main( int argc, char** argv )
{
    
    
    CommandLineParser parser(argc, argv, "{help h||}");
    if (parser.has("help"))
    {
    
    
        help(argv);
        return 0;
    }
    Mat img(500, 500, CV_8UC3);
    RNG& rng = theRNG();

    for(;;)
    {
    
    
        int i, count = (unsigned)rng%100 + 1;

        vector<Point> points;

        for( i = 0; i < count; i++ )
        {
    
    
            Point pt;
            pt.x = rng.uniform(img.cols/4, img.cols*3/4);
            pt.y = rng.uniform(img.rows/4, img.rows*3/4);

            points.push_back(pt);
        }

        vector<Point> hull;
        convexHull(points, hull, true);

        img = Scalar::all(0);
        for( i = 0; i < count; i++ )
            circle(img, points[i], 3, Scalar(0, 0, 255), FILLED, LINE_AA);

        polylines(img, hull, true, Scalar(0, 255, 0), 1, LINE_AA);
        imshow("hull", img);

        char key = (char)waitKey();
        if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC'
            break;
    }

    return 0;
}

Explicación del código:

 int i, count = (unsigned)rng%100 + 1;

        vector<Point> points;

        for( i = 0; i < count; i++ )
        {
    
    
            Point pt;
            pt.x = rng.uniform(img.cols/4, img.cols*3/4);
            pt.y = rng.uniform(img.rows/4, img.rows*3/4);

            points.push_back(pt);
        }

Genere aleatoriamente puntos de conteo, el rango de puntos generados aleatoriamente es x(img.cols/4, img.cols 3/4), y(img.rows/4, img.rows 3/4) para que los generados aleatoriamente los puntos están en el área específica de img.


convexHull(points, hull, true);

Llame a convexHull con puntos de ajuste de puntos generados aleatoriamente como entrada y casco como salida.


 for( i = 0; i < count; i++ )
            circle(img, points[i], 3, Scalar(0, 0, 255), FILLED, LINE_AA);

        polylines(img, hull, true, Scalar(0, 255, 0), 1, LINE_AA);
        imshow("hull", img);

Dibuja todos los puntos generados aleatoriamente en img. Al polylines()dibujar todas las colecciones de golpes en img. El resultado final muestra:

resultado de la operación

Por favor agregue una descripción de la imagen

Por favor agregue una descripción de la imagen

Por favor agregue una descripción de la imagen

Acho que você gosta

Origin blog.csdn.net/m0_49302377/article/details/130426640
Recomendado
Clasificación