首页 > 解决方案 > 使用 OpenCV 退出代码 -1073741819 (0xC0000005)

问题描述

我正在 Python 中尝试一个非常简单的 OpenCV 示例,但它完全不适合我:

import cv2
import matplotlib.pyplot as plt

if __name__ == '__main__':
    img1 = plt.imread('../data/input/frame000013.png')
    img2 = plt.imread('../data/input/frame000014.png')
    img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    sift = cv2.SIFT()
    print(sift)
    kp = sift.detect(img1_gray, None)
    print(kp)

如果我尝试使用 PyCharm 运行它,我会收到以下错误:

Process finished with exit code -1073741819 (0xC0000005)

如果我尝试通过终端执行它,它似乎并没有越过kp = sift.detect(img1_gray, None)行,也没有真正到达第二条print语句,没有提供任何错误通知。

我使用:Windows 10、Python 3.8opencv-pythonopencv-contrib-python4.4.0.44。

标签: pythonopencv

解决方案


如果您查看文档,它应该是SIFT_create()

sift = cv2.SIFT_create()
print(sift)
kp = sift.detect(img1_gray, None)

但是,你为什么要阅读图像plt.imread

我问的原因是,您正在使用BGR2GRAY. 但plt.imread将图像作为RGB格式返回。因此,如果您要使用plt.imread

import cv2
import numpy as np
import matplotlib.pyplot as plt


def rgb2gray(rgb):
    return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140]).astype(np.uint8)


if __name__ == '__main__':
    img1 = plt.imread('../data/input/frame000013.png')
    img2 = plt.imread('../data/input/frame000014.png')
    img1_gray = rgb2gray(img1)
    sift = cv2.SIFT_create()
    print(sift)
    kp = sift.detect(img1_gray, None)
    print(kp)

或者如果您选择cv2.imread

import cv2
import matplotlib.pyplot as plt

if __name__ == '__main__':
    img1 = cv2.imread('../data/input/frame000013.png')
    img2 = cv2.imread('../data/input/frame000014.png')
    img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    sift = cv2.SIFT_create()
    print(sift)
    kp = sift.detect(img1_gray, None)
    print(kp)

推荐阅读