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)

Ответы (0 шт):