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