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;
}
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;
}