例如,在使用OpenCV时,通常使用SURF等算法来检测关键点.我的问题是这些关键点究竟是什么?
我知道它们是图像中的某种"兴趣点".我也知道它们是尺度不变的并且是圆形的.
此外,我发现他们有方向但我无法理解这实际上是什么.这是一个角度,但在半径和东西之间?你能解释一下吗?我想我首先需要的是更简单的东西,然后更容易理解论文.
我按照blob检测示例(使用cv2.SimpleBlobDetector)并成功检测到二进制图像中的斑点.但后来我不知道如何提取关键点的坐标和面积.以下是blob检测的代码:
# I skipped the parameter setting part.
blobParams = cv2.SimpleBlobDetector_Params()
blobVer = (cv2.__version__).split('.')
if int(blobVer[0]) < 3:
detector = cv2.SimpleBlobDetector(blobParams)
else:
detector = cv2.SimpleBlobDetector_create(blobParams)
# Detect Blobs
keypoints_black = detector.detect(255-black_blob)
trans_blobs = cv2.drawKeypoints(gray_video_crop, \
keypoints_white, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
Run Code Online (Sandbox Code Playgroud)
因此变量keypoints_black包含blob的信息.当我打印变量时,它看起来像这样(发现了2个blob):
KeyPoint 0x10b10b870, KeyPoint 0x10b1301b0
Run Code Online (Sandbox Code Playgroud)
那么如何获得关键点及其区域的质心坐标,以便我可以将它们作为osc消息发送以进行交互.
我正在尝试使用 open cv 创建一个基本的图像检测器。我正在使用 ORB,我尝试打开图像,然后尝试检测图像中的关键点。这是我的代码
import cv2
from cv2 import ORB
image1 = cv2.imread("original.jpg", cv2.IMREAD_GRAYSCALE)
orb = ORB()
# find the keypoints with ORB
kp = orb.detect(image1, None)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的代码时,程序崩溃并出现以下错误
Process finished with exit code -1073741819 (0xC0000005)
Run Code Online (Sandbox Code Playgroud)
我搜索此错误,发现这是内存访问冲突,但我不知道哪里可能存在冲突?
我一直在从事图像处理和机器人技术的自我项目,而机器人像往常一样检测颜色并挑选物体,它试图检测板上的孔(类似于不同的多边形).为了更好地理解设置,这里是一张图片:

如您所见,我必须检测这些孔,找出它们的形状,然后使用机器人将物体装入孔中.我正在使用kinect深度相机来获取深度图像.图片如下所示:

我想到如何使用相机检测孔洞,最初使用遮罩来移除背景部分和一些基于深度测量的前景部分,但是这并没有成功,因为在相机的不同方向上孔将与板合并...类似于排列(它完全变白).然后我遇到了adaptiveThreshold功能
adaptiveThreshold(depth1,depth3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,-1.0);
Run Code Online (Sandbox Code Playgroud)
使用侵蚀,扩张和高斯模糊消除噪音; 它以更好的方式检测到孔,如下图所示.然后我使用了cvCanny边缘检测器来获得边缘,但到目前为止它还不如下图所示.之后我尝试了来自SIFT,SURF,ORB,GoodFeaturesToTrack的各种特征检测器,发现ORB给出了最好的时间和检测到的功能.在此之后,我尝试通过查找其关键点并匹配这些关键点来获得查询图像的相对相机姿势,以便为该findHomography函数提供良好的匹配.结果如下图所示:

最后,我想获得两个图像之间的相对相机姿势,并使用从solvePnP函数获得的旋转和平移向量将机器人移动到该位置.
那么有没有其他方法可以提高检测到的关键点检测和匹配孔的质量?
我也曾尝试过轮廓检测和近似,但近似的形状并不是很好:

我已经尝试调整阈值和canny函数的输入参数,但这是我能得到的最好的
另外,我的方法是让相机姿势正确吗?
更新:无论我尝试什么,我都无法获得良好的可重复功能来映射.然后我在网上看到深度图像的分辨率很低,它只用于掩蔽和获取距离等东西.所以,由于低分辨率的图像及其杂乱的边缘,这让我觉得功能不合适.所以我想到了检测RGB图像上的特征并使用深度图像来获得这些特征的距离.我得到的功能质量完全脱离了图表.它甚至检测到了主板上的螺丝!以下是使用GoodFeaturesToTrack关键点检测检测到的关键点.
.我遇到了另一个障碍,同时距离不正确的点距离.我搜索了可能的原因,很长一段时间后,由于相机之间的偏移,RGB和深度图像中存在偏移.我可以从前两个图像中看到这一点.然后,我在网上搜索了如何补偿这种偏移,但找不到有效的解决方案.
如果你们中的任何一个人可以帮助我补偿抵消,那就太好了!
更新:我无法正常使用goodFeaturesToTrack函数.该函数给出了Point2f类型的角点.如果你想计算描述符,我们需要关键点并将Point2f转换为Keypoint,下面的代码片段会导致缩放和旋转不变性的丢失.
for( size_t i = 0; i < corners1.size(); i++ )
{
keypoints_1.push_back(KeyPoint(corners1[i], 1.f));
}
Run Code Online (Sandbox Code Playgroud)
功能匹配的可怕结果如下所示
.
我现在必须开始不同的功能匹配.我会发布进一步的更新.如果有人可以帮助消除偏移问题,那将非常有用.
我正在研究OpenCV对象检测的一些可能性,这让我很困惑.我只是没有看到这两者之间的区别.
谢谢!
我正在尝试通过 python 使用 opencv 来查找火车图像中的多个对象,并将其与从查询图像中检测到的关键点进行匹配。对于我的情况,我正在尝试检测下面提供的图像中的网球场。我看了网上的教程,只发现它只能检测1个物体。我想过插入一个循环来查找多个对象,但我失败了。关于如何做有什么想法吗?*我使用 SIFT,因为 ORB 不太适合我的情况
这是代码和一组示例图像。
import numpy as np
import cv2
from matplotlib import pyplot as plt
MIN_MATCH_COUNT = 10
img1 = cv2.imread('Image 11.jpg',0) # queryImage
img2 = cv2.imread('Image 5.jpg',0) # trainImage
# Initiate SIFT detector
sift = cv2.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches …Run Code Online (Sandbox Code Playgroud) cv::cornerHarris()来检测角落(我可以轻松做到)。std::vector<KeyPoint>(我不知道该怎么做)。稍后我将使用它来计算描述符并匹配它们。我可以很容易地使用 SURF 来完成它们,但我想使用 Harris 角点检测器来完成。
/// Detecting corners
cv::cornerHarris(leftRoi, dst, blockSize, apertureSize, k, BORDER_DEFAULT);
/// Normalizing
normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
convertScaleAbs(dst_norm, dst_norm_scaled);
/// Drawing a circle around corners
for (int j = 0; j < dst_norm.rows; j++)
{
for (int i = 0; i < dst_norm.cols; i++)
{
if ((int)dst_norm.at<float>(j, i) > 165)
{
circle(dst_norm_scaled, Point(i, j), 5, Scalar(0), 2, 8, 0);
}
}
}
/// Showing the result
namedWindow("corners_window", CV_WINDOW_AUTOSIZE); …Run Code Online (Sandbox Code Playgroud)我通过在 features2d 框架中使用不同的检测器从连续两个中获得特征点:
在第一帧中,特征点以红色绘制

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

我想在第一帧(带有红点的图像)内的这些红色和蓝色(匹配)点之间画一条线。 opencv中的drawmatches函数没有帮助,因为它显示一个窗口,其中两个连续帧彼此相邻以进行匹配。在 OpenCV 中可以吗?
提前致谢
ORB 在图像边缘附近找不到关键点,我不明白为什么。SIFT 和 SURF 似乎更糟糕,我预计情况恰恰相反。
如果我理解正确,那么 SIFT/SURF 在测试点周围分别使用 16x16 和 20x20 方块,因此我希望它们不会找到距离边缘 8 和 10 像素的关键点。FAST/ORB 在测试点周围使用直径为 7 的圆,因此我希望它能找到更接近边缘的关键点,也许接近 4 个像素(尽管我认为相关的算法,BRIEF,用于描述关键点使用更大的窗口)所以这会删除一些关键点)。
一个实验让我的预测变得毫无意义。在我的实验中,距边缘的最小距离随着方块的大小和间距而变化,但例子是
谁能解释为什么?
我使用的代码如下。我画了一个正方形网格并应用了高斯模糊。我预计算法会锁定角落,但他们发现了正方形的中心和一些伪影。
import numpy as np
import cv2
size = 501; border = 51; step = 10
image = np.zeros( (size,size), np.uint8 )
# fill with disjoint squares
def drawsquare(img,i,j):
restsize = step//5
cv2.rectangle(img,(i-restsize,j-restsize),(i+restsize,j+restsize),255,-1)
for i in range(0,size,step):
for j in range(0,size,step):
drawsquare(image,i,j)
# blank out the …Run Code Online (Sandbox Code Playgroud) 如何为WongKinYiu/yolov7准备自定义关键点数据集?