Python 中带有 SIFT 检测器的 OpenCV 段错误

问题描述

small image

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_ImplSIFT_create() 等.

还要注意 BRISK_create()SIFT.create() 等是等效的有效生成名称,但您会发现下划线版本在教程和人们的项目中更常见,它们目前是明确记录的。