python中带有sift检测器的opencv segfault

piztneat  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(317)

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
其他代码工作良好,但不筛选

cat /proc/meminfo 

MemTotal:       32776404 kB
MemFree:        29683128 kB
MemAvailable:   31038428 kB

此处所附图像为2k(61x54)像素
为什么会这样?谢谢大家 cv2.__version__ -> '4.5.1'
多亏了alkasm

sift = cv2.SIFT_create()

解决了我的问题

pgccezyw

pgccezyw1#

opencv中的特征检测器应该使用它们的静态 create 方法。在api引用中不使用构造函数是不明确的,但是您可以在文档中看到 SIFT 那个班级 create() 方法是唯一显示的方法(它们显示相应的python调用是 SIFT_create() ).
之所以有必要这样做,是因为opencv Algorithm 类别(哪个 Feature2D 是的子类)使用pimpl习惯用法实现,以便 SIFT 实际上是一个不打算直接示例化的基类/虚拟类;相反 SIFT::create 返回一个 SIFT_Impl 示例,如代码中所示。python绑定可能会在将来的某个时候被“修复”以缓解这个问题,但是在此之前,您需要使用 SIFT_create() , BRISK_create() ,依此类推。
还要注意的是 SIFT.create() 以及 BRISK.create() 等等是有效的生成名称,它们是等价的,但是您会发现下划线版本在教程和人们的项目中更为常见,而且它们目前是明确记录的。

相关问题