OpenCV - (- 215: утверждение не удалось) _src.total () ›0 в функции 'cv :: warpPerspective'

Мой полный код:

import cv2 as cv
import numpy as np


cap = cv.VideoCapture(0 + cv.CAP_DSHOW)
imgTarget = cv.imread('photos\TargetImage.jpg') #bu resmimiz
myVid = cv.VideoCapture('photos\video.mp4')


detection = False
frameCounter = 0
imgVideo = cap.read()
success, imgVideo = myVid.read()
hT,wT,cT = imgTarget.shape #burada resmimizin yüksekliğini, kalınlığını genişliğini falan alıyoruz.
'''while myVid.isOpened():
    success, Video = myVid.read()
    if success:
        Video = cv.resize(Video, (wT, hT))'''

#burada key points yani böyle önemli bölgeler, köşeler gibi yerleri beliriliyoruz.
orb = cv.ORB_create(nfeatures=1000)
kp1, des1 = orb.detectAndCompute(imgTarget,None)

while True: #burada webcam ile fotoğrafları birleştircez.
 

    sucess,imgWebcam = cap.read()
    imgAug = imgWebcam.copy()
    #burada key points yani böyle önemli bölgeler, köşeler gibi yerleri beliriliyoruz.
    kp2, des2 = orb.detectAndCompute(imgWebcam, None)#imgwebcami myvid yapıp değiştir o zaman oldu .d tek seferliktir belki?
    # imgWebcam = cv2.drawKeypoints(imgWebcam, kp2, None)
 
    if detection == False:
        myVid.set(cv.CAP_PROP_POS_FRAMES,0)
        frameCounter = 0
    else:
        if frameCounter == myVid.get(cv.CAP_PROP_FRAME_COUNT):
            myVid.set(cv.CAP_PROP_POS_FRAMES, 0)
            frameCounter = 0
        success, imgVideo = myVid.read()
        imgVideo = cv.resize(imgVideo, (wT, hT))
 
    #burada ise matches yani webcam resmi ile fotoğrafımız arasındaki benzerlikleri alıyoruz.
    bf = cv.BFMatcher()
    matches = bf.knnMatch(des1,des2,k=2)
    good =[]
    for m,n in matches:
        if m.distance < 0.75 *n.distance:
            good.append(m)
    print(len(good))
    imgFeatures = cv.drawMatches(imgTarget,kp1,imgWebcam,kp2,good,None,flags=2)
 
    if len(good) > 20: #burada eğer anahtar bölgelerimiz 20 den fazla şekilde uyuşuyorsa, tanımlama(detection) tamamlanmış oluyor.
        detection = True
        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 = cv.findHomography(srcPts,dstPts,cv.RANSAC,5)
        print(matrix)

        #eşleşine resmin etrafını çiziyoruz
        pts = np.float32([[0,0],[0,hT],[wT,hT],[wT,0]]).reshape(-1,1,2)
        dst = cv.perspectiveTransform(pts,matrix)
        img2 = cv.polylines(imgWebcam,[np.int32(dst)],True,(255,0,255),3)

        #burada videomuzu, webcam resmimiz ile aynı boyuta getiriyoruz.
        imgWarp = cv.warpPerspective(imgVideo,matrix, (imgWebcam.shape[1],imgWebcam.shape[0]))

. . . . . Привет, ребята, я делаю проект. И в своем коде я попытался использовать параметр warpPerspective. Но в этой строке он дает ошибку:

ошибка: OpenCV (4.0.1) C: \ ci \ opencv-suite_1573470242804 \ work \ modules \ imgproc \ src \ imgwarp.cpp: 2903: error: (-215: Assertion failed) _src.total () ›0 in function ' cv :: warpPerspective '

И это мой связанный код ошибки:

imgWarp = cv.warpPerspective(imgVideo,matrix, (imgWebcam.shape[1],imgWebcam.shape[0]))

Я также скопировал весь свой код в начало страницы, потому что он может понадобиться.

Есть ли проблемы с моей веб-камерой? Но это работает в других кодах, а также в приложениях. Почему возникает эта ошибка и как ее решить?

Жду вашей помощи ... Любые предложения будут очень полезны для решения этой проблемы.


person Ö. ALP EREN GÜL    schedule 27.01.2021    source источник


Ответы (1)


Позвольте мне начать с небольшого изменения вашего кода.

Когда вы инициализировали с использованием разделителя \, ваш код будет работать только для Windows.

imgTarget = cv.imread('photos\TargetImage.jpg') #bu resmimiz
myVid = cv.VideoCapture('photos\video.mp4')

Если вы используете sep os.path, он будет работать на всех ОС.

from os.path import sep

imgTarget = cv.imread('photos' + sep + 'TargetImage.jpg') #bu resmimiz
myVid = cv.VideoCapture('photos' + sep + 'video.mp4')

Я хотел бы предложить вам использовать разрешение по умолчанию и инициализировать вашу переменную cap как:

cap = cv.VideoCapture(0)

Вы также можете отобразить imgWarp, используя imshow

cv.imshow("imgWarp", imgWarp)
cv.waitKey(0)

Пример вывода:

введите описание изображения здесь

Код:


import cv2 as cv
import numpy as np

from os.path import sep

cap = cv.VideoCapture(0)
imgTarget = cv.imread('photos' + sep + 'TargetImage.jpg')  # bu resmimiz
myVid = cv.VideoCapture('photos' + sep + 'video.mp4')

detection = False
frameCounter = 0
# imgVideo = cap.read()
success, imgVideo = myVid.read()
hT, wT, cT = imgTarget.shape  # burada resmimizin yüksekliğini, kalınlığını genişliğini falan alıyoruz.
'''while myVid.isOpened():
    success, Video = myVid.read()
    if success:
        Video = cv.resize(Video, (wT, hT))'''

# burada key points yani böyle önemli bölgeler, köşeler gibi yerleri beliriliyoruz.
orb = cv.ORB_create(nfeatures=1000)
kp1, des1 = orb.detectAndCompute(imgTarget, None)

while myVid.isOpened():  # burada webcam ile fotoğrafları birleştircez.
    sucess, imgWebcam = cap.read()
    imgAug = imgWebcam.copy()
    # burada key points yani böyle önemli bölgeler, köşeler gibi yerleri beliriliyoruz.
    kp2, des2 = orb.detectAndCompute(imgWebcam,
                                     None)  # imgwebcami myvid yapıp değiştir o zaman oldu .d tek seferliktir belki?
    # imgWebcam = cv2.drawKeypoints(imgWebcam, kp2, None)

    if detection == False:
        myVid.set(cv.CAP_PROP_POS_FRAMES, 0)
        frameCounter = 0
    else:
        if frameCounter == myVid.get(cv.CAP_PROP_FRAME_COUNT):
            myVid.set(cv.CAP_PROP_POS_FRAMES, 0)
            frameCounter = 0
        success, imgVideo = myVid.read()
        imgVideo = cv.resize(imgVideo, (wT, hT))

    # burada ise matches yani webcam resmi ile fotoğrafımız arasındaki benzerlikleri alıyoruz.
    bf = cv.BFMatcher()
    matches = bf.knnMatch(des1, des2, k=2)
    good = []
    for m, n in matches:
        if m.distance < 0.75 * n.distance:
            good.append(m)
    print(len(good))
    imgFeatures = cv.drawMatches(imgTarget, kp1, imgWebcam, kp2, good, None, flags=2)

    if len(good) > 20:  # burada eğer anahtar bölgelerimiz 20 den fazla şekilde uyuşuyorsa, tanımlama(detection) tamamlanmış oluyor.
        detection = True
        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 = cv.findHomography(srcPts, dstPts, cv.RANSAC, 5)
        print(matrix)

        # eşleşine resmin etrafını çiziyoruz
        pts = np.float32([[0, 0], [0, hT], [wT, hT], [wT, 0]]).reshape(-1, 1, 2)
        dst = cv.perspectiveTransform(pts, matrix)
        img2 = cv.polylines(imgWebcam, [np.int32(dst)], True, (255, 0, 255), 3)

        # burada videomuzu, webcam resmimiz ile aynı boyuta getiriyoruz.
        imgWarp = cv.warpPerspective(imgVideo, matrix, (imgWebcam.shape[1], imgWebcam.shape[0]))
        cv.imshow("imgWarp", imgWarp)
        cv.waitKey(0)

Есть ли проблемы с моей веб-камерой? Но это работает в других кодах, а также в приложениях. Почему возникает эта ошибка и как ее решить?

Если вы хотите подключить веб-камеру по умолчанию, обычно вы инициализируете ее как:

myVid = cv.VideoCapture(0)

Если вы хотите подключиться к внешнему устройству, вы можете использовать 1, 2 и т. Д.

person Ahx    schedule 27.01.2021
comment
Спасибо за ответ, я скоро попробую, потом вернусь сюда - person Ö. ALP EREN GÜL; 28.01.2021
comment
Большое спасибо мой друг .... Это действительно сработало - person Ö. ALP EREN GÜL; 29.01.2021
comment
привет еще раз, могу ли я задать ту же ошибку, но в другом коде, отредактировав свой вопрос? Я изменил некоторые коды (не так много) и выдает ту же ошибку. После того, как я отредактирую свой вопрос, вы посмотрите еще раз? Или мне следует открыть новый вопрос - person Ö. ALP EREN GÜL; 04.02.2021
comment
Все зависит от вас, но на вашем месте я бы задал новый вопрос, так как если вы добавите новый код, он запутается. Поэтому я предлагаю разместить новый вопрос, но, конечно, вы решите - person Ahx; 04.02.2021
comment
да, вы правы, но небольшой вопрос: почему изображения GIF не имеют формы в opencv? - person Ö. ALP EREN GÜL; 04.02.2021
comment
Opencv не поддерживает изображения в формате GIF. Скорее всего, он вернет None. Вам необходимо преобразовать его в поддерживаемые форматы, такие как png, jpeg, jpg и т. Д. - person Ahx; 04.02.2021
comment
хорошо спасибо за информацию - person Ö. ALP EREN GÜL; 05.02.2021
comment
Я знаю, что задал много вопросов, но если у вас есть время или если вы хотите, я просто прошу вас ответить на этот новый вопрос === ›stackoverflow.com/questions/66076212/ - person Ö. ALP EREN GÜL; 06.02.2021
comment
Вы хотите учиться, поэтому ничего страшного. Я ответил на вопрос. - person Ahx; 06.02.2021
comment
Сэр, могу я спросить еще кое-что? Я не мог это решить. Пожалуйста, помогите мне решить .... ссылка === ›stackoverflow.com/questions/66292414/ - person Ö. ALP EREN GÜL; 20.02.2021