【问题标题】:OpenCV segfault with SIFT detector in PythonOpenCV segfault 与 Python 中的 SIFT 检测器
【发布时间】:2021-07-21 07:24:01
【问题描述】:

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")

输出它,恩:

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()

解决了我的问题

【问题讨论】:

  • 你可以试试sift = cv2.SIFT_create()吗?您使用的是什么版本的 OpenCV?
  • 很好.. 没有更多的核心转储。谢谢!
  • cv2.__version__ -> '4.5.1'

标签: python opencv cv2 sift opencv-python


【解决方案1】:

OpenCV 中的特征检测器应该使用它们的静态create 方法创建。 API 参考中没有明确说明不使用构造函数,但您可以在 docs for the SIFT class 中看到 create() 方法是唯一显示的方法(并且它们显示相应的 Python 调用是 SIFT_create())。

这是必要的原因是因为 OpenCV Algorithm 类(Feature2D 是其子类)是使用 PIMPL idiom 实现的,因此 SIFT 实际上是一个不打算实例化的基类/虚拟类直接地;而SIFT::create 返回一个SIFT_Impl 实例,如您所见in the code。 Python 绑定可能会在未来某个时候“修复”以缓解此问题,但在此之前,您将希望对所有特征检测器使用 SIFT_create()BRISK_create() 等。

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

【讨论】:

    猜你喜欢
    • 2014-05-11
    • 2023-03-21
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多