AttributeError: 'numpy.ndarray' object has no attribute 'set'

AttributeError: 'numpy.ndarray' object has no attribute 'set'

当我写这段代码时:(我的整个代码,关于增强现实的学校项目) 在我尝试 运行 视频之前,一切都很顺利。 ..................................................... ..................................................... ..................................................... ..................................................... ...

import cv2
import numpy as np

cap=cv2.VideoCapture(2)                                         
imgTarget=cv2.imread('F1racecars.jpeg')                         
vidTarget= cv2.VideoCapture('F1racecars.mp4')
               
success, vidTarget = vidTarget.read()                           
imgTarget=cv2.resize(imgTarget,(640,360))                       
hT, wT, cT = imgTarget.shape   
vidTarget=cv2.resize(vidTarget,(wT,hT))                        


orb = cv2.ORB_create(nfeatures=1000)
kp1, des1 = orb.detectAndCompute(imgTarget,None)

detect = False
fcount = 0


while True:                                                     
   success, imgWebcam= cap.read()                              
   imgAug = imgWebcam.copy()

   imgWarp = np.zeros((imgWebcam.shape[1], imgWebcam.shape[0],imgWebcam.shape[2]))
   masknew = np.zeros((imgWebcam.shape[0], imgWebcam.shape[1],imgWebcam.shape[2]), np.uint8)
   maskInv = np.zeros((imgWebcam.shape[0], imgWebcam.shape[1], imgWebcam.shape[2]), np.uint8)
   Mergecamfeed =  np.zeros((imgWebcam.shape[0], imgWebcam.shape[1], imgWebcam.shape[2]), np.uint8)
   ARfinal = np.zeros((imgWebcam.shape[0], imgWebcam.shape[1], imgWebcam.shape[2]), np.uint8)

   if detect is False:
      vidTarget.set(cv2.CAP_PROP_POS_FRAMES,0)
      fcount =0
   else:
      if fcount == vidTarget.get(cv2.CAP_PROP_FRAME_COUNT, 0):
         vidTarget.set(cv2.CAP_PROP_POS_FRAMES, 0)
         fcount = 0
   success, vidTarget= vidTarget.read()
   vidTarget= cv2.resize(vidTarget, (wT, hT))

   kp2, des2 = orb.detectAndCompute(imgWebcam,None)

   if des2 is None: print(False)
   else:
      bf = cv2.BFMatcher()
      featmatch = bf.knnMatch(des1,des2,k=2)
      good=[]
      for m,n in featmatch:
          if m.distance < 0.75 * n.distance: good.append(m)
      print(len(good))

      if len(good)>20:                                                                
         detect = 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 = cv2.findHomography(srcpts,dstpts, cv2.RANSAC, 5)
         print(matrix)

         pts = np.float32([[0,0],[0,360],[640,360],[640,0]]).reshape(-1, 1, 2)

         dst = cv2.perspectiveTransform(pts,matrix)
         cv2.polylines(imgWebcam,[np.int32(dst)],True,(255,0,255),3)

         imgWarp = cv2.warpPerspective(vidTarget,matrix, (imgWebcam.shape[1],imgWebcam.shape[0]))

         cv2.fillPoly(masknew, [np.int32(dst)], (255,255,255))

         maskInv = cv2.bitwise_not(masknew)

         Mergecamfeed = cv2.bitwise_and(imgAug,imgAug,None, mask = maskInv[:,:,0])
                                                                            
         ARfinal = cv2.bitwise_or(imgWarp, Mergecamfeed)                     


   cv2.imshow('imgTarget', imgTarget)
   cv2.imshow('imgTargetVdo', vidTarget)
   cv2.imshow('webcam', imgWebcam)
   cv2.imshow('warp', imgWarp)
   cv2.imshow('mask', masknew)
   cv2.imshow('Modified mask', maskInv)
   cv2.imshow('Aug Image', Mergecamfeed)
   cv2.imshow('Augmented Reality Final O/P', ARfinal)
   cv2.waitKey(1)
   fcount += 1

显示如下:

AttributeError: 'numpy.ndarray' object has no attribute 'set'

通常我们会要求提供完整的错误消息,并带有追溯。这使得更容易识别错误发生的位置。不过在这种情况下,set 只使用了几次。

vidTarget.set(cv2.CAP_PROP_POS_FRAMES,0)

这是什么东西vidTarget?该错误表明它是一个 numpy 数组,并且很明显这样的对象没有 set 方法。有经验的 numpy 用户也知道这一点。那么你期望它是什么样的对象呢?

我们看到属性错误的原因有两个。要么代码编写者没有阅读文档,并尝试使用non-existent方法。或者所讨论的变量不是他所期望的。你应该知道,在每一步,变量是什么——不仅仅是猜测或希望,知道。必要时进行测试。

编辑

最初

vidTarget= cv2.VideoCapture('F1racecars.mp4')

通过快速阅读 cv2 文档,这有 get/set 方法

但后来你做到了

succses, vidTarget = vidTarget.read()
# and resize

重新定义vidTarget