Home > Enterprise >  AttributeError: 'numpy.ndarray' object has no attribute 'set'
AttributeError: 'numpy.ndarray' object has no attribute 'set'

Time:02-17

when I write this code: (my entire code, school project on Augmented Reality) Everything worked perfectly until I tried to run the video. ...........................................................................................................................................................................................................

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

It shows like this:

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

CodePudding user response:

Normally we ask for the full error message, with traceback. That makes it easier to identify where the error occurs. In this case though, set is only used a couple of times.

vidTarget.set(cv2.CAP_PROP_POS_FRAMES,0)

What's this thing vidTarget? The error says it's a numpy array, and is clear that such an object does not have a set method. Experienced numpy users also know that. So what kind of object did you expect it to be?

We see attribute errors for one of two reasons. Either the code writer did not read the documentation, and tried to use a non-existent method. Or the variable in question is not what he expected. You should know, at every, step what the variable is - not just guess or hope, know. Test if necessary.

edit

Initially

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

From a quick read of cv2 docs, this has get/set methods

but then you do

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

That redefines vidTarget.

  • Related