AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)
Я решил попробовать, что такое Ar, и столкнулся со следующей проблемой:
File "C:/Users/Егор/PycharmProjects/ARfotoandvideo/AR.py", line 25, in <module>
macthes = bf.knnMatch(des1, des2, k=2)
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-0ycehs0d\opencv\modules\core\src\batch_distance.cpp:275: error: (-215:Assertion failed) type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U) in function 'cv::batchDistance'
Стек
- Windows 8.1 на одном языке
- Python 3.7.7
- Pycharm Сommunity 2018.3.7
- Opencv-python 4.5.1.48
- Веб-камера - на ноутбуке я стал непригодным для использования камеры с телефона Redmy by Xiaomi через приложение Droidcam через соединение Wi-Fi.
Информация
Я постараюсь описать предыдущие возникшие ошибки и то, как я их решил - возможно, это подскажет вам, что нужно сделать для решения проблемы.
Во время выполнения программы происходит сбой в момент получения изображения с веб-камеры - как он проявляется, при запуске программы изображение с веб-камеры дает монохромный фон (в моем случае бирюзовый), после того как я принудительно закройте все окна, нажав на X, данные в окнах обновятся и получат правильное изображение. Эта проблема частично решается тем, cv2.waitKey (100) где изменение значения 100 приводит к тому, что приходит изображение с веб-камеры, !!!! НО !!! в этом нет уверенности, так как бывают неудачи.
Попытавшись связать все возможные причины ошибки из cv2.error, я пришел к выводу, что проблема заключается в дескрипторах на 1 и 2 изображениях. ХОЧУ ЗАМЕТИТЬ, что при перемещении веб-камеры относительно изображения (не зума, а сдвига вперед или назад) в 1-2 случаях из 30 это помогало запустить программу и работать без сбоев.
Мой код
import cv2
import numpy as np
cap = cv2.VideoCapture(1, cv2.CAP_DSHOW)
imgTarget = cv2.imread('foto.jpg')
myVid = cv2.VideoCapture('video.mp4')
success, imgVideo = myVid.read()
hT, wT, cT = imgTarget.shape
imgVideo = cv2.resize(imgVideo, (wT + 400, hT))
orb = cv2.ORB_create(nfeatures=10)
kp1, des1 = orb.detectAndCompute(imgTarget, None)
imgTarget = cv2.drawKeypoints(imgTarget, kp1, None)
while True:
success, imgWebcam = cap.read()
kp2, des2 = orb.detectAndCompute(imgWebcam, None)
imgWebcam = cv2.drawKeypoints(imgWebcam, kp2, None)
# imgWebcam = cv2.resize(imgWebcam, (wT, hT))
bf = cv2.BFMatcher()
macthes = bf.knnMatch(des1, des2, k=2)
good = []
for m, n in macthes:
if m.distance < 0.75 * n.distance:
good.append(m)
print(len(good))
imgFeatures = cv2.drawMatches(imgTarget, kp1, imgWebcam, kp2, good, None, flags=2)
if len(good) > 20:
srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
matrix, mask = cv2.findHomography(srcPts, dstPts, cv2.RANSAC, 5)
print(matrix)
pts = np.float32([[0, 0], [0, wT], [wT, hT], [wT, 0]]).reshape(-1, 1, 2)
dst = cv2.perspectiveTransform(pts, matrix)
img2 = cv2.polylines(imgWebcam, [np.int32(dst)], True, (255, 0, 255), 3)
cv2.imshow('img2', img2)
cv2.imshow('imgFeatures', imgFeatures)
cv2.imshow('imgTarget', imgTarget)
cv2.imshow('myVid', imgVideo)
cv2.imshow('imgWebcam', imgWebcam)
cv2.waitKey(100)