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() 等是等效的有效生成名称,但您会发现下划线版本在教程和人们的项目中更常见,它们是目前明确记录的那些。