Код выхода -1073741819 (0xC0000005) с OpenCV

#python #opencv

#python #opencv

Вопрос:

Я пытаюсь использовать действительно простой пример OpenCV на Python, который полностью не работает для меня:

 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.8 opencv-python и opencv-contrib-python 4.4.0.44.

Комментарии:

1. Такое смешивание библиотек никогда не является хорошей идеей…

2. cv2.SIFT не существует …, для OpenCV 4.4.0.44 синтаксис sift = cv2.SIFT_create()

Ответ №1:

Если вы посмотрите на документацию, это должно быть 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)