如何访问OpenCV匹配器上的点位置
How to Access Points location on OpenCV Matcher?
我正在使用此Flann Matcher算法与2个图片中的兴趣点匹配代码在下面显示)。
有一个时刻,代码找到匹配点的列表:
std::vector<DMatch> good_matches;
我想在这两个图片中获取点本地化(x,y)。创建位移图。我如何访问这些点本地化?
欢呼,
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
void readme();
/** @function main */
int main(int argc, char** argv) {
if (argc != 3) {
readme();
return -1;
}
// Transform in GrayScale
Mat img_1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
Mat img_2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
// Checks if the image could be loaded
if (!img_1.data || !img_2.data) {
std::cout << " --(!) Error reading images " << std::endl;
return -1;
}
//-- Step 1: Detect the keypoints using SURF Detector
int minHessian = 400;
SurfFeatureDetector detector(minHessian);
std::vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect(img_1, keypoints_1);
detector.detect(img_2, keypoints_2);
//-- Step 2: Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor;
Mat descriptors_1, descriptors_2;
extractor.compute(img_1, keypoints_1, descriptors_1);
extractor.compute(img_2, keypoints_2, descriptors_2);
//-- Step 3: Matching descriptor vectors using FLANN matcher
FlannBasedMatcher matcher;
std::vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
double max_dist = 0;
double min_dist = 100;
//-- Quick calculation of max and min distances between keypoints
for (int i = 0; i < descriptors_1.rows; i++) {
double dist = matches[i].distance;
// printf("-- DISTANCE = [%f]n", dist);
if (dist < min_dist)
min_dist = dist;
if (dist > max_dist)
max_dist = dist;
}
printf("-- Max dist : %f n", max_dist);
printf("-- Min dist : %f n", min_dist);
//-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist )
//-- PS.- radiusMatch can also be used here.
std::vector<DMatch> good_matches;
for (int i = 0; i < descriptors_1.rows; i++) {
if (matches[i].distance < 2 * min_dist) {
good_matches.push_back(matches[i]);
}
}
//-- Draw only "good" matches
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, good_matches,
img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(),
DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
//-- Show detected matches
imshow("Good Matches", img_matches);
for (int i = 0; i < good_matches.size(); i++) {
printf("-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d n", i,
good_matches[i].queryIdx, good_matches[i].trainIdx);
}
waitKey(0);
return 0;
}
/** @function readme */
void readme() {
std::cout << " Usage: ./SURF_FlannMatcher <img1> <img2>" << std::endl;
}
匹配的_points1和2将是左图和右图像中的相应点。然后,您可以使用idx1 = good_matches [i] .trainidx找到good_matches的索引,左图和idx2 = good_matches [i] .queryIdx用于正确的图像。然后只需将相应的点添加到您的匹配_points向量即可获得匹配的x,y点向量。
long num_matches = good_matches.size();
vector<Point2f> matched_points1;
vector<Point2f> matched_points2;
for (int i=0;i<num_matches;i++)
{
int idx1=good_matches[i].trainIdx;
int idx2=good_matches[i].queryIdx;
matched_points1.push_back(points1[idx1]);
matched_points2.push_back(points2[idx2]);
}
现在您有两个匹配点的向量。我认为这就是您要问的?
相关文章:
- 无法在 Opencv 中显示图像导致内存位置
- OPENCV.3.0错误:0xc0000005:访问违规读取位置0x00000000
- cv:内存位置的异常 - 运行 openCV 代码 Visual Studio 2013 & Visual Studio 2017 - Windows 7
- 访问违规写作位置在OpenCV中
- 从OpenCV MLP响应中获取最高值(概率)位置
- 当我在Xcode上访问矩阵(openCV垫子)的位置时,为什么我会得到未定义的行为(exc_bad_access(代码=
- OPENCV(C ) - 从已知的3D对象和相机位置计算图像的2D坐标
- 我如何使用opencv从相机的所有位置检测android的人脸
- OpenCV 计算相机位置和旋转
- 将OpenCV旋转和平移矢量转换为XYZ旋转和XYZ位置
- YCBCR 帧的最大值和最小值在 openCV 中的位置
- OpenCV 使用具有不对应点的求解查找对象的位置
- 如何访问OpenCV匹配器上的点位置
- 访问违规读取位置-opencv/VC++
- 使用c++在opencv中检测图像中任何文本的位置
- OpenCV:内存位置问题
- 如何在 OpenCV 应用程序中更改跟踪栏的位置
- 在opencv中查找方块:访问违规读取位置
- OpenCV 从矩阵中获取条件基最大元素位置
- opencv:使用旋转和平移向量设置模型位置