Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 低分辨率图像的特征检测器和描述符_Image_Opencv_Feature Detection_Feature Extraction_Feature Tracking - Fatal编程技术网

Image 低分辨率图像的特征检测器和描述符

Image 低分辨率图像的特征检测器和描述符,image,opencv,feature-detection,feature-extraction,feature-tracking,Image,Opencv,Feature Detection,Feature Extraction,Feature Tracking,我正在使用低分辨率(VGA)和jpg压缩图像序列在移动机器人上进行视觉导航。目前,我正在使用SURF来检测关键点,并从图像中提取描述符,使用FLANN来跟踪它们。在应用RANSAC之前,我每幅图像获得4000-5000个特征,通常每对连续图像进行350-450个匹配(这通常会减少20%的匹配次数) 我正在努力增加比赛的数量(和质量)。我试过另外两种探测器:SIFT和ORB。SIFT显著增加了特征的数量(总体而言,跟踪特征的数量增加了35%),但速度要慢得多。ORB提取的功能大致与SURF相同,但

我正在使用低分辨率(VGA)和jpg压缩图像序列在移动机器人上进行视觉导航。目前,我正在使用SURF来检测关键点,并从图像中提取描述符,使用FLANN来跟踪它们。在应用RANSAC之前,我每幅图像获得4000-5000个特征,通常每对连续图像进行350-450个匹配(这通常会减少20%的匹配次数)

我正在努力增加比赛的数量(和质量)。我试过另外两种探测器:SIFT和ORB。SIFT显著增加了特征的数量(总体而言,跟踪特征的数量增加了35%),但速度要慢得多。ORB提取的功能大致与SURF相同,但匹配性能要差得多(在最好的情况下,约100个匹配)。我在ORB的opencv中的实现是:

cv::ORB orb = cv::ORB(10000, 1.2f, 8, 31);
orb(frame->img, cv::Mat(), im_keypoints, frame->descriptors);
frame->descriptors.convertTo(frame->descriptors, CV_32F); //so that is the same type as m_dists
然后,在匹配时:

cv::Mat m_indices(descriptors1.rows, 2, CV_32S);
cv::Mat m_dists(descriptors1.rows, 2, CV_32F);
cv::flann::Index flann_index(descriptors2, cv::flann::KDTreeIndexParams(6));
flann_index.knnSearch(descriptors1, m_indices, m_dists, 2, cv::flann::SearchParams(64) );
在处理低分辨率和噪声图像时,最好的特征检测器和提取器是什么?我是否应该根据所使用的特征检测器更改FLANN中的任何参数

编辑:

我发布了一些相当容易跟踪的序列图片。这些图片是我给特征检测器方法的图片。它们已经过预处理以消除一些噪声(通过
cv::bilateralFilter()


如果您可以控制跟踪的特征,您可以使其旋转不变并使用相关性。

在许多情况下,基于光流的方法是一个不错的选择。该方法有一些限制,例如照明发生较大变化。如果使用21x21或大于21x21的大窗口,则跟踪器对噪声的鲁棒性应更高。您可以从favorit SIFT、SURF、FAST或GFT功能检测器获取要跟踪的功能,或者将其初始化为常规采样网格。这使您可以从场景中定期采样运动信息。

我已经使用ORB功能检测几个月了。 我没有发现ORB本身有任何问题,尽管作者提到要微调一些参数以使其性能更好

h t t p s://github.com/wher0001/Image-Capture-and-Processing

当我使用您的图片和标准距离排序运行ORB时,我得到了下面的图片,其中显然有一些不好的匹配。

我总是将nfeatures的数量设置得很高(5000),然后从那里开始。 它默认为500,这是我用于这些图片的值。 从那里你可以改变它的排序方式,就像我在这里展示的那样,可以减少nfeatures的数量,甚至可以只使用前X个匹配数

import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread("c:/Users/rwheatley/Desktop/pS8zi.jpg")
img2 = cv2.imread("c:/Users/rwheatley/Desktop/vertrk.jpg")

grey1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
grey2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# Initiate ORB detector
orb = cv2.ORB_create(nfeatures=5000)

# find the keypoints and descriptors with ORB
kp1, des1 = orb.detectAndCompute(grey1,None)
kp2, des2 = orb.detectAndCompute(grey2,None)

# create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

# Match descriptors.
matches = bf.match(des1,des2)

# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance)

# Draw first 10 matches.
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches,None,flags=2)
print(len(matches))

plt.imshow(img3),plt.show()
然后,我切换到一些不同的方法,当我使用一个(请原谅这个词)蹩脚的戴尔网络摄像头时,我发现这些方法是有益的。

将numpy导入为np
进口cv2
从matplotlib导入pyplot作为plt
img1=cv2.imread(“c:/Users/rwheatley/Desktop/pS8zi.jpg”)
img2=cv2.imread(“c:/Users/rwheatley/Desktop/vertrk.jpg”)
灰色1=cv2.CVT颜色(img1,cv2.COLOR\U BGR2GRAY)
灰色2=cv2.CVT颜色(img2,cv2.COLOR\U BGR2GRAY)
#启动球形探测器
orb=cv2.orb_创建(nfeatures=5000)
#使用ORB查找关键点和描述符
kp1,des1=orb.detectAndCompute(灰色1,无)
kp2,des2=orb.detectAndCompute(灰色2,无)
#具有默认参数的BFMatcher
bf=cv2.BFMatcher()
匹配=bf.knnMatch(des1,des2,k=2)
#应用比率测试
好的=[]
对于匹配中的m,n:
如果m.距离<0.75*n.距离:
好的。追加([m])
#cv2.drawMatchesKnn希望列表列表是匹配的。
img3=cv2.drawMatchesKnn(img1,kp1,img2,kp2,良好,无,标志=2)
打印(len(匹配))
plt.imshow(img3),plt.show()
在最新版本的OpenCV中,还有第三种类型的匹配目前处于盈亏平衡状态。基于Flann的匹配。修复后,我建议您切换到该选项,或者对图像应用一些smarts


例如,如果您向系统中添加陀螺仪,您可以在缩小搜索窗口所创建的窗口之外抛出匹配项。

您可以上传一些示例图像吗?另外,帧与帧之间有很多旋转吗?我在图片上贴了两个链接。当我上传它们时,我意识到我正在处理灰度图像,所以我在代码中对其进行了修正,并相应地编辑了我的问题。在这个序列中根本没有旋转,尽管我可能会绕垂直轴旋转20度。好的,在没有旋转的情况下,简短比其他二进制描述符更准确。我会试试它而不是圆球。描述符提取器简介。对于关键点探测器。。。冲浪还是快?我不知道是哪个探测器。如果不需要快速运行的话,我会使用SIFT。是的,那个网络摄像头很糟糕。与ORB knnMatching的匹配看起来很好,您得到了多少匹配?我使用ORB是因为它是旋转和缩放不变的。我将其设置为5000个匹配项,第一组代码得到2395个匹配项,第二组代码得到3401个匹配项。我不同意教授对第二个算法使用0.75,因为它留下了太多不好的匹配。我建议使用一个标准的算法来消除基于方向差异的异常值,即使它们在距离上匹配。然后使用相似区域来跟踪特征。通过“第二种算法”,我假设你指的是Lowe比率,不是吗?我想说,如果你把它降低到0.6甚至更高,那么好匹配的数量会急剧增加。在任何情况下,你告诉我ORB找到了多少特征,我是问你得到了多少好的匹配。在图片中,它看起来不超过200。算法不是Lowe's。这是一个简单的,不是很科学的过滤器。这个比率,因为它是一个数字,如果它不是在所有情况下都有效,或者没有95%的置信区间,就不应该归因于一个人。你没有要求“好”的比赛,但也许这就是你的意思。第二张图片的好匹配项增加了约10%,在没有任何调整的情况下约为200。我使用一种特定的科学方法来去除异常值。它比“第二种算法”好得多
import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread("c:/Users/rwheatley/Desktop/pS8zi.jpg")
img2 = cv2.imread("c:/Users/rwheatley/Desktop/vertrk.jpg")

grey1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
grey2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# Initiate ORB detector
orb = cv2.ORB_create(nfeatures=5000)

# find the keypoints and descriptors with ORB
kp1, des1 = orb.detectAndCompute(grey1,None)
kp2, des2 = orb.detectAndCompute(grey2,None)

# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

# Apply ratio test
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])

# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
print(len(matches))

plt.imshow(img3),plt.show()