Python 中带有 SIFT 检测器的 OpenCV 段错误
OpenCV segfault with SIFT detector in Python
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 内存
其他代码工作正常但 SIFT 不行
cat /proc/meminfo
MemTotal: 32776404 kB
MemFree: 29683128 kB
MemAvailable: 31038428 kB
这里附上的图片是 2k (61x54)pixel
为什么会这样?谢谢大家
cv2.__version__
-> '4.5.1'
感谢 alkasm
sift = cv2.SIFT_create()
解决了我的问题
OpenCV 中的特征检测器应使用其静态 create
方法创建。 API 引用中没有明确表示不使用构造函数,但您可以在 docs for the SIFT
class 中看到 create()
方法是唯一显示的方法(并且它们表明相应的Python 来电是 SIFT_create()
).
这是必要的原因是因为 OpenCV Algorithm
class(Feature2D
是 class 的子class)是使用 PIMPL idiom so that SIFT
is actually a base/virtual class not intended to be instantiated directly; instead SIFT::create
returns a SIFT_Impl
instance, as you can see in the code 实现的. Python 绑定可能会在将来的某个时候“修复”以缓解此问题,但在那之前,您将希望使用 SIFT_create()
、BRISK_create()
等所有特征检测器。
另请注意,SIFT.create()
和 BRISK.create()
等是等效的有效生成名称,但您会发现下划线版本在教程和人们的项目中更常见,它们是目前明确记录的那些。
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 内存
其他代码工作正常但 SIFT 不行
cat /proc/meminfo
MemTotal: 32776404 kB
MemFree: 29683128 kB
MemAvailable: 31038428 kB
这里附上的图片是 2k (61x54)pixel
为什么会这样?谢谢大家
cv2.__version__
-> '4.5.1'
感谢 alkasm
sift = cv2.SIFT_create()
解决了我的问题
OpenCV 中的特征检测器应使用其静态 create
方法创建。 API 引用中没有明确表示不使用构造函数,但您可以在 docs for the SIFT
class 中看到 create()
方法是唯一显示的方法(并且它们表明相应的Python 来电是 SIFT_create()
).
这是必要的原因是因为 OpenCV Algorithm
class(Feature2D
是 class 的子class)是使用 PIMPL idiom so that SIFT
is actually a base/virtual class not intended to be instantiated directly; instead SIFT::create
returns a SIFT_Impl
instance, as you can see in the code 实现的. Python 绑定可能会在将来的某个时候“修复”以缓解此问题,但在那之前,您将希望使用 SIFT_create()
、BRISK_create()
等所有特征检测器。
另请注意,SIFT.create()
和 BRISK.create()
等是等效的有效生成名称,但您会发现下划线版本在教程和人们的项目中更常见,它们是目前明确记录的那些。