问题描述
import cv2
img1 = cv2.imread('imref/ref-DN.png',0) # queryImage
# Initiate SIFT detector
sift = cv2.SIFT()
# find the keypoints and descriptors with SIFT
kp1,des1 = sift.detectAndCompute(img1,None)
print("end")
输出它,en:
Errore di segmentazione (core dump creato)
Segmentation error (core dump created)
我的 Linux Kubuntu 18.04LTS 桌面有 32GB 的 RAM
其他代码工作正常,但不是 SIFT
cat /proc/meminfo
MemTotal: 32776404 kB
MemFree: 29683128 kB
MemAvailable: 31038428 kB
此处附加的图像为 2k (61x54) 像素
为什么会出现这种情况?谢谢大家
cv2.__version__
-> '4.5.1'
感谢 alkasm
sift = cv2.SIFT_create()
解决了我的问题
解决方法
OpenCV 中的特征检测器应使用其静态 create
方法创建。 API 参考中没有明确不使用构造函数,但您可以在 docs for the SIFT
class 中看到 create()
方法是唯一显示的方法(并且它们显示相应的 Python 调用是 { {1}})。
这是必要的原因是因为 OpenCV SIFT_create()
类(其中 Algorithm
是其子类)是使用 PIMPL idiom 实现的,因此 Feature2D
实际上是一个基类/ 虚拟类不打算直接实例化;相反,SIFT
返回一个 SIFT::create
实例,如您所见 in the code。 Python 绑定可能会在未来的某个时候“修复”以缓解此问题,但在那之前,您需要对所有特征检测器使用 SIFT_Impl
、SIFT_create()
等.
还要注意 BRISK_create()
和 SIFT.create()
等是等效的有效生成名称,但您会发现下划线版本在教程和人们的项目中更常见,它们目前是明确记录的。