Ejemplo de procesamiento de imágenes OpenCV4.x-descriptor de características coincidente y dibujo de puntos coincidentes

Sección 2 Descriptor de características Coincidencia y dibujo de puntos coincidentes

El comparador del descriptor de puntos clave en OpenCV tiene un contenedor con una interfaz pública, que puede cambiar fácilmente entre diferentes algoritmos que resuelven el mismo problema. Esta sección presenta específicamente descriptores coincidentes representados por vectores en un espacio multidimensional. Todos los objetos que implementan el comparador de descriptores vectoriales heredan la interfaz DescriptorMatcher y el punto clave correspondiente y la interfaz de dibujo del punto coincidente.

1 、 cv :: drawKeypoints


Dibujar puntos clave

void cv :: drawKeypoints (imagen InputArray, const std :: vector <KeyPoint> & keypoints, InputOutputArray outImage, const Scalar & color = Scalar :: all (-1), DrawMatchesFlags flags = DrawMatchesFlags :: DEFAULT)

Los parámetros son los siguientes:

nombre del parámetro Descripción de parámetros
imagen Imagen original
puntos clave Puntos clave de la imagen original
outImage Imagen de salida. Su contenido depende del valor de la bandera, que define lo que se dibuja en la imagen de salida. Vea los posibles valores de bit de bandera a continuación.
color El color del punto clave.
banderas Función de gráficos de conjunto de logotipos. Los posibles valores de las banderas están definidos por DrawMatchesFlags. Vea los detalles en drawMatches arriba.

2 、 cv :: drawMatches


Dibuje las coincidencias de puntos clave que se encuentran en las dos imágenes.

void cv :: drawMatches (InputArray img1, const std :: vector <KeyPoint> & keypoints1, InputArray img2, const std :: vector <KeyPoint> & keypoints2, const std :: vector <DMatch> & matches1to2, InputOutputArray outImg, const Scalar & matchColor = Scalar :: all (-1), const Scalar & singlePointColor = Scalar :: all (-1), const std :: vector <char> & matchesMask = std :: vector <char> (), DrawMatchesFlags flags = DrawMatchesFlags :: DEFAULT)

Los parámetros son los siguientes:

nombre del parámetro Descripción de parámetros
img1 Imagen de la primera fuente
puntos clave1 El primer punto clave de la imagen de origen
img2 Imagen de segunda fuente
puntos clave2 El segundo punto clave de la imagen de origen
partidos1a2 Coincide con la primera imagen con la segunda imagen, lo que significa que keypoints1 [i] tiene un punto correspondiente en keypoints2 [coincide con [i]].
salida Imagen de salida. Su contenido depende del valor de la bandera, que define lo que se dibuja en la imagen de salida. Vea los posibles valores de bit de bandera a continuación.
matchColor El color de la coincidencia (el punto clave de la línea y la conexión). Si matchColor == Scalar :: all (-1), el color se genera aleatoriamente.
singlePointColor El color de un solo punto clave (círculo), lo que significa que no hay coincidencia para el punto clave. El color de singlePoint Color == Scalar :: all (-1) se genera aleatoriamente.
partidosMáscara La máscara determina qué coincidencias se dibujan. Si la máscara está vacía, se dibujan todas las coincidencias.
banderas Función de gráficos de conjunto de logotipos. Los posibles valores de las banderas están definidos por DrawMatchesFlags.

3 、 cv :: BFMatcher


Comparador de descriptores de fuerza bruta. Para cada descriptor en el primer grupo, este comparador encuentra el descriptor más cercano en el segundo grupo probando cada descriptor. Este comparador de descriptores admite la coincidencia permitida de conjuntos de descriptores blindados.

La clase BFMatcher hereda la interfaz DescriptorMatcher e implementa los métodos correspondientes La creación del objeto BFMatcher se logra mediante el método de creación estático.

static Ptr cv :: BFMatcher :: create (int normType = NORM_L2, bool crossCheck = false)

Los parámetros son los siguientes:

nombre del parámetro Descripción de parámetros
normType Uno de NORM_L1, NORM_L2, NORM_HAMMING y NORM_HAMMING2. Para los descriptores SIFT y SURF, las normas L1 y L2 son mejores opciones.Cuando WTA_K == 3 o 4, NORM_HAMMING debe usarse con ORB, BRISK y Brief, y NORM_HAMMING2 debe usarse con ORB (ver descripción de la función de construcción ORB :: ORB).
verificar por distintos modos Si es falso, cuando se encuentren k vecinos más cercanos para cada descriptor de consulta, este será el comportamiento predeterminado de BFMatcher. Si crossCheck == true, el método knnMatch () con k = 1 solo devolverá el par (i, j), de modo que para el descriptor de consulta i-ésimo, el descriptor j-ésimo en el conjunto de comparadores es el más cercano, y viceversa Sin embargo, BFMatcher solo devolverá pares consistentes. Cuando hay suficientes coincidencias, esta técnica suele producir los mejores resultados con la menor cantidad de valores atípicos. Esta es una alternativa a la prueba de proporción utilizada por D. Lowe en el documento SIFT.

La interfaz DescriptorMatcher tiene varias interfaces principales:

  • void cv :: DescriptorMatcher :: match (InputArray queryDescriptors, InputArray trainDescriptors, std :: vector <DMatch> & matches, InputArray mask = noArray ())

  • void cv :: DescriptorMatcher :: radiusMatch (InputArray queryDescriptors, InputArray trainDescriptors, std :: vector <std :: vector <DMatch>> & matches, float maxDistance, InputArray mask = noArray (), bool compactResult = false)

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
    // 读取图像
    cv::Mat src1 = cv::imread("images/plane.jpg");
    if(src1.empty()){
        cerr << "cannot read image 1.\n";
        return EXIT_FAILURE;
    }
    cv::Mat src2 = cv::imread("images/plane_part.jpg");
    if(src2.empty()){
        cerr << "cannot read image 2.\n";
        return EXIT_FAILURE;
    }

    // 转换成灰度图像
    cv::Mat gray1,gray2;
    cv::cvtColor(src1,gray1,cv::COLOR_BGR2GRAY);
    cv::cvtColor(src2,gray2,cv::COLOR_BGR2GRAY);

    // 创建SIFT特征提取器
    cv::Ptr<cv::SIFT> sift = cv::SIFT::create(256,3,0.09,220,2.5);

    // 特征点检测
    // 检测特征点
    vector<cv::KeyPoint> keypoints1,keypoints2;
    cv::Mat descriptor1,descriptor2;
    sift->detectAndCompute(gray1,cv::Mat(),keypoints1,descriptor1);
    sift->detectAndCompute(gray2,cv::Mat(),keypoints2,descriptor2);

    // 创建特征点匹配器
    cv::Ptr<cv::BFMatcher> matcher = cv::BFMatcher::create();

    // 执行特征点匹配
    vector<cv::DMatch> dmatch;
    matcher->match(descriptor1,descriptor2,dmatch);

    // 绘制特征点和匹配特征结果
    cv::Mat matchResult;
    cv::drawMatches(src1,keypoints1,src2,keypoints2,dmatch,matchResult);
    cv::imshow("src1",src1);
    cv::imshow("src2",src2);
    cv::imshow("match result",matchResult);
    cv::waitKey();
    return 0;
}

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

4 、 cv :: FlannBasedMatcher


Comparador de descriptores basado en Flann. El comparador entrena cv :: flan :: Index en el conjunto de descriptores de trenes y llama a su método de búsqueda más cercano para encontrar la mejor coincidencia. Por lo tanto, al combinar conjuntos de trenes grandes, este comparador puede ser más rápido que un comparador de fuerza bruta. FlannBasedMatcher no admite la coincidencia permitida de conjuntos de descriptores blindados, porque flann :: Index no admite esta función.

La clase FlannBasedMatcher hereda la interfaz DescriptorMatcher e implementa los métodos correspondientes La creación del objeto BFMatcher se logra mediante el método de creación estático.

static Ptr cv :: FlannBasedMatcher :: create ()

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;

int main()
{
    // 读取图像
    cv::Mat src1 = cv::imread("images/plane.jpg");
    if(src1.empty()){
        cerr << "cannot read image 1.\n";
        return EXIT_FAILURE;
    }
    cv::Mat src2 = cv::imread("images/plane_part.jpg");
    if(src2.empty()){
        cerr << "cannot read image 2.\n";
        return EXIT_FAILURE;
    }

    // 转换成灰度图像
    cv::Mat gray1,gray2;
    cv::cvtColor(src1,gray1,cv::COLOR_BGR2GRAY);
    cv::cvtColor(src2,gray2,cv::COLOR_BGR2GRAY);

    // 创建SIFT特征提取器
    cv::Ptr<cv::SIFT> sift = cv::SIFT::create(256,3,0.09,220,2.5);

    // 特征点检测
    // 检测特征点
    vector<cv::KeyPoint> keypoints1,keypoints2;
    cv::Mat descriptor1,descriptor2;
    sift->detectAndCompute(gray1,cv::Mat(),keypoints1,descriptor1);
    sift->detectAndCompute(gray2,cv::Mat(),keypoints2,descriptor2);

    // 创建特征点匹配器
    cv::Ptr<cv::FlannBasedMatcher> matcher = cv::FlannBasedMatcher::create();

    // 执行特征点匹配
    vector<cv::DMatch> dmatch;
    matcher->match(descriptor1,descriptor2,dmatch);

    // 绘制特征点和匹配特征结果
    cv::Mat matchResult;
    cv::drawMatches(src1,keypoints1,src2,keypoints2,dmatch,matchResult);
    cv::imshow("src1",src1);
    cv::imshow("src2",src2);
    cv::imshow("match result",matchResult);
    cv::waitKey();
    return 0;
}

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/wujuxKkoolerter/article/details/114163008
Recomendado
Clasificación