属性错误:'numpy.ndarray'对象没有属性'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用户也知道这一点。那么,你希望它是什么样的物体呢?

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

编辑

最初

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

cv2文档的快速阅读来看,这有get/set方法

但是你做

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

这重新定义了vidTarget