我正在尝试使用 OpenCV(用于 C++)的 BRISK 实现来检查照片是否包含图像(或图像的一部分)。例如,我拍了一张照片,然后尝试匹配它使用数据库中的一组图像,我想选择最佳的对应图像(如果所有图像都不够好,则会显示错误消息)。
所以,我目前只是在测试 OpenCV。我只是采用了框架中包含的示例 (matching_to_many_images),并将检测器和描述符从 SURF 更改为 BRISK。
但是,我有奇怪的结果。这些是匹配的结果(BruteForce Hamming):


在第一个中,场景完全不同,但有很多匹配!在第二个中,场景非常相似,但有些匹配是错误的。
我认为这是一个参数问题——因为在 BRISK 的演示视频中,结果很重要。
OpenCV 能否检测到如下所示的手工绘制的几何形状?形状可以是矩形、三角形、圆形、曲线、圆弧、多边形……我将开发一个检测这些形状的 android 应用程序。

我正在实现立体匹配,并且作为预处理,我正在尝试在不进行相机校准的情况下校正图像。我正在使用冲浪检测器来检测和匹配图像上的特征并尝试对齐它们。找到所有匹配项后,我使用以下函数删除所有不在极线上的匹配项:
[fMatrix, epipolarInliers, status] = estimateFundamentalMatrix(...
matchedPoints1, matchedPoints2, 'Method', 'RANSAC', ...
'NumTrials', 10000, 'DistanceThreshold', 0.1, 'Confidence', 99.99);
inlierPoints1 = matchedPoints1(epipolarInliers, :);
inlierPoints2 = matchedPoints2(epipolarInliers, :);
figure; showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2);
legend('Inlier points in I1', 'Inlier points in I2');
Run Code Online (Sandbox Code Playgroud)
问题是,如果我使用相同的数据运行此函数,我仍然会得到不同的结果,导致每次运行相同数据时结果视差图存在差异。推测匹配点仍然相同,但内联点在每次运行中有所不同。在这里您可以看到一些匹配结果不同:

更新:我认为差异是由 RANSAC 方法引起的,但是使用 LMedS、MSAC,我仍然在相同的数据上得到不同的结果
我通过在 features2d 框架中使用不同的检测器从连续两个中获得特征点:
在第一帧中,特征点以红色绘制

在下一帧中,特征点以蓝色绘制

我想在第一帧(带有红点的图像)内的这些红色和蓝色(匹配)点之间画一条线。 opencv中的drawmatches函数没有帮助,因为它显示一个窗口,其中两个连续帧彼此相邻以进行匹配。在 OpenCV 中可以吗?
提前致谢
我正在使用低分辨率 (VGA) 和 jpg 压缩的图像序列在移动机器人上进行视觉导航。目前我正在使用 SURF 来检测关键点并从图像中提取描述符,并使用 FLANN 来跟踪它们。在应用 RANSAC(通常会减少 20% 的匹配数量)之前,我每张图像得到 4000-5000 个特征,通常每对连续图像进行 350-450 个匹配
我正在努力增加比赛的数量(和质量)。我尝试了另外两种检测器: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
Run Code Online (Sandbox Code Playgroud)
然后,在匹配时:
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) );
Run Code Online (Sandbox Code Playgroud)
在处理低分辨率和嘈杂的图像时,最好的特征检测器和提取器是什么?我应该根据使用的特征检测器更改 FLANN 中的任何参数吗?
编辑:
我发布了一些相当容易跟踪的序列的图片。这些图片是我将它们提供给特征检测器方法的。它们已经过预处理以消除一些噪音(通过 cv::bilateralFilter())
opencv image feature-extraction feature-detection feature-tracking
我刚刚编写了 C++ OpenCV 2.4.7 代码来使用 SurfFeatureDetector 提取立体图像中的特征点。它工作得很好,但是当我意识到点坐标是浮点时我感到困惑,例如它发现坐标 [283.23 123.424] 作为左图像中的特征之一。
这是代码的一部分(简单地提取特征):
int minHessian = 400;
SurfFeatureDetector detector(minHessian);
vector<KeyPoint> featuresLeft, featuresRight;
detector.detect(leftImg, featuresLeft);
detector.detect(rightImg, featuresRight);
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这是怎么发生的?内置函数是否涉及任何插值?
opencv image-processing feature-extraction feature-detection
我需要检测图像上的不同形状,如椭圆和带有虚线边框的圆圈.
使用OpenCV会导致一些麻烦,例如openCV检测不到轮廓而是检测到一些小的分离线(轮廓).如果椭圆带有"虚线边框",我需要将其作为单个轮廓,而不是分离的对象.
你有什么建议来解决这个问题?
我还需要识别带有实线边框的椭圆(或圆圈)和带有虚线边框的椭圆(圆圈)
椭圆形,边框实线

带虚线边框的椭圆:

我正在使用 Python 和 OpenCV 3.0,我正在尝试评估两个图像的 SIFT 描述符。更具体地说,我对重复率感兴趣。在 C++ 中有这个函数用于执行评估:
cv::evaluateFeatureDetector(img_1c, img_2c, h12, &key_points_1, &key_points_2, repeatability, corrCounter);
Run Code Online (Sandbox Code Playgroud)
但是,我还没有在 Python 中找到任何实现,我也不太明白如何(以及是否)可以使用此函数。有没有其他方法可以计算python中的重复率?
通过阅读有关 stackoverflow 的一些答案,到目前为止我已经学到了很多东西:
掩码必须是一个numpy数组(与图像具有相同的形状),其数据类型CV_8UC1为0到255。
但是,这些数字的含义是什么?是否在检测过程中将忽略任何具有相应掩码值为 0 的像素而将使用任何掩码值为 255 的像素?中间的值呢?
另外,如何在pythonnumpy中用数据类型初始化数组CV_8UC1?我可以用吗dtype=cv2.CV_8UC1
这是我目前使用的代码,基于我在上面所做的假设。但问题是当我detectAndCompute为任一图像运行时,我没有得到任何关键点。我有一种感觉,这可能是因为掩码不是正确的数据类型。如果我是对的,我该如何纠正?
# convert images to grayscale
base_gray = cv2.cvtColor(self.base, cv2.COLOR_BGRA2GRAY)
curr_gray = cv2.cvtColor(self.curr, cv2.COLOR_BGRA2GRAY)
# initialize feature detector
detector = cv2.ORB_create()
# create a mask using the alpha channel of the original image--don't
# use transparent or partially transparent parts
base_cond = self.base[:,:,3] == 255
base_mask = np.array(np.where(base_cond, 255, 0))
curr_cond = self.base[:,:,3] == 255 …Run Code Online (Sandbox Code Playgroud) 我想做一个关于标志检测的简单项目。所以我尝试遵循关于特征检测的 OpenCV-Python 教程。OpenCV:特征匹配
我写了我的代码,如下所示。
ratio = 0.8
logo = cv.imread("T01/CocaCola_logo2.png", cv.IMREAD_GRAYSCALE)
img = cv.imread("T01/CocaCola.png", cv.IMREAD_GRAYSCALE)
orb = cv.ORB_create()
kp_logo, des_logo = orb.detectAndCompute(logo, None)
kp_img, des_img = orb.detectAndCompute(img, None)
FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH,
table_number=6,
key_size=12,
multi_probe_level=1)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params, search_params)
match_flann = flann.knnMatch(des_logo, des_img, k=2)
good = []
for p, q in match_flann:
if p.distance > q.distance*ratio:
good.append(p)
try:
img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
cv.drawMatchesKnn(logo, kp_logo, img, kp_img, good,
outImg=img_match, matchColor=None, …Run Code Online (Sandbox Code Playgroud)