我通过在 features2d 框架中使用不同的检测器从两个连续的特征点中获得了特征点:
在第一帧中,特征点用红色绘制
在下一帧中,特征点以蓝色绘制
我想在第一帧(带有红点的图像)内的这些红色和蓝色(匹配)点之间画一条线。 平局函数没有帮助,因为它显示了一个窗口,其中两个连续的帧彼此相邻以进行匹配。在 OpenCV 中可以吗?
提前致谢
我通过在 features2d 框架中使用不同的检测器从两个连续的特征点中获得了特征点:
在第一帧中,特征点用红色绘制
在下一帧中,特征点以蓝色绘制
我想在第一帧(带有红点的图像)内的这些红色和蓝色(匹配)点之间画一条线。 平局函数没有帮助,因为它显示了一个窗口,其中两个连续的帧彼此相邻以进行匹配。在 OpenCV 中可以吗?
提前致谢
我想您想可视化每个关键点如何在两帧之间移动。据我所知,OpenCV 中没有满足您要求的内置函数。
但是,当您调用该drawMatches()
函数时,您已经有了两个关键点集(以 C++ 代码为例)vector<KeyPoint>& keypoints1, keypoints2
和匹配项vector<DMatch>& matches1to2
。然后您可以通过调用该函数获取每个关键点的像素坐标Point keypoints1.pt
并在关键点之间绘制线条。line()
您应该注意,由于您要keypoints2
在第一帧中绘制,因此像素坐标可能会超过img1
.
有一种快速了解关键点运动的方法。下面是imshowpair()
Matlab 中显示的结果:
找到好的匹配项后,我使用此代码绘制线条。
(...some code...)
//draw good matches
for( int i = 0; i < (int)good_matches.size(); i++ )
{
printf( "-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx );
//query image is the first frame
Point2f point_old = keypoints_1[good_matches[i].queryIdx].pt;
//train image is the next frame that we want to find matched keypoints
Point2f point_new = keypoints_2[good_matches[i].trainIdx].pt;
//keypoint color for frame 1: RED
circle(img_1, point_old, 3, Scalar(0, 0, 255), 1);
circle(img_2, point_old, 3, Scalar(0, 0, 255), 1);
//keypoint color for frame 2: BLUE
circle(img_1, point_new, 3, Scalar(255, 0, 0), 1);
circle(img_2, point_new, 3, Scalar(255, 0, 0), 1);
//draw a line between keypoints
line(img_1, point_old, point_new, Scalar(0, 255, 0), 2, 8, 0);
line(img_2, point_old, point_new, Scalar(0, 255, 0), 2, 8, 0);
}
imwrite("directory/image1.jpg",img_1);
imwrite("directory/image2.jpg",img_2);
(...some code...)
我将结果保存到第一帧 (img_1) 和下一帧 (img_2)。如您所见,我有不同的结果,但线条形状是相同的。在 OpenCV 的视频单应性样本中,关键点跟踪似乎是准确的。他们遵循这种方法:检测关键点-->计算关键点-->扭曲关键点-->匹配-->查找单应性-->绘制匹配。但是,我应用了检测关键点-->计算关键点-->匹配-->绘制匹配。如果我必须考虑单应性和透视(或其他东西)才能准确地看到关键点运动,我会感到困惑。
我的第一帧结果(img_1)
和下一帧(img_2)