2016-04-17 12 views
1

Immer wenn ich die Cameo.py-Datei ausführe, erhalte ich einen Fehler. Bitte helfenTypeError: 'Kanal' ist ein ungültiges Schlüsselwort-Argument für diese Funktion

Import cv2 Importfilter von Manager importieren Windowmanager, Capture

Klasse Cameo (Objekt):

def __init__(self): 
    self._windowManager = WindowManager('Cameo', 
             self.onKeypress) 
    self._captureManager = CaptureManager(
     cv2.VideoCapture(0), self._windowManager, True) 
    self._curveFilter = filters.BGRPortraCurveFilter() 

def run(self): 
    """Run the main loop.""" 
    self._windowManager.createWindow() 
    while self._windowManager.isWindowCreated: 
     self._captureManager.enterFrame() 
     frame = self._captureManager.frame 

     if frame is not None: 

      # TODO: Track faces (Chapter 3). 

      filters.strokeEdges(frame, frame) 
      self._curveFilter.apply(frame, frame) 

     self._captureManager.exitFrame() 
     self._windowManager.processEvents() 

def onKeypress(self, keycode): 
    """Handle a keypress. 

    space -> Take a screenshot. 
    tab -> Start/stop recording a screencast. 
    escape -> Quit. 

    """ 
    if keycode == 32: # space 
     self._captureManager.writeImage('screenshot.png') 
    elif keycode == 9: # tab 
     if not self._captureManager.isWritingVideo: 
      self._captureManager.startWritingVideo(
       'screencast.avi') 
     else: 
      self._captureManager.stopWritingVideo() 
    elif keycode == 27: # escape 
     self._windowManager.destroyWindow() 

wenn Name == "Haupt":

Cameo(). Run()

import CV2 import numpy import Zeit

Klasse Capture (object):

def __init__(self, capture, previewWindowManager = None, 
      shouldMirrorPreview = False): 

    self.previewWindowManager = previewWindowManager 
    self.shouldMirrorPreview = shouldMirrorPreview 

    self._capture = capture 
    self._channel = 0 
    self._enteredFrame = False 
    self._frame = None 
    self._imageFilename = None 
    self._videoFilename = None 
    self._videoEncoding = None 
    self._videoWriter = None 

    self._startTime = None 
    self._framesElapsed = long(0) 
    self._fpsEstimate = None 

@property 
def channel(self): 
    return self._channel 

@channel.setter 
def channel(self, value): 
    if self._channel != value: 
     self._channel = value 
     self._frame = None 



@property 
def frame(self): 
    if self._enteredFrame and self._frame is None: 
     _, self._frame = self._capture.retrieve(channel = self.channel) 

    return self._frame 

@property 
def isWritingImage(self): 
    return self._imageFilename is not None 

@property 
def isWritingVideo(self): 
    return self._videoFilename is not None 

def enterFrame(self): 
    """Capture the next frame, if any.""" 

    # But first, check that any previous frame was exited. 
    assert not self._enteredFrame, \ 
     'previous enterFrame() had no matching exitFrame()' 

    if self._capture is not None: 
     self._enteredFrame = self._capture.grab() 

def exitFrame(self): 
    """Draw to the window. Write to files. Release the frame.""" 

    # Check whether any grabbed frame is retrievable. 
    # The getter may retrieve and cache the frame. 
    if self.frame is None: 
     self._enteredFrame = False 
     return 

    # Update the FPS estimate and related variables. 
    if self._framesElapsed == 0: 
     self._startTime = time.time() 
    else: 
     timeElapsed = time.time() - self._startTime 
     self._fpsEstimate = self._framesElapsed/timeElapsed 
    self._framesElapsed += 1 

    # Draw to the window, if any. 
    if self.previewWindowManager is not None: 
     if self.shouldMirrorPreview: 
      mirroredFrame = numpy.fliplr(self._frame).copy() 
      self.previewWindowManager.show(mirroredFrame) 
     else: 
      self.previewWindowManager.show(self._frame) 

    # Write to the image file, if any. 
    if self.isWritingImage: 
     cv2.imwrite(self._imageFilename, self._frame) 
     self._imageFilename = None 

    # Write to the video file, if any. 
    self._writeVideoFrame() 

    # Release the frame. 
    self._frame = None 
    self._enteredFrame = False 

def writeImage(self, filename): 
    """Write the next exited frame to an image file.""" 
    self._imageFilename = filename 

def startWritingVideo(
     self, filename, 
     encoding = cv2.VideoWriter_fourcc('M','J','P','G')): 
    """Start writing exited frames to a video file.""" 
    self._videoFilename = filename 
    self._videoEncoding = encoding 

def stopWritingVideo(self): 
    """Stop writing exited frames to a video file.""" 
    self._videoFilename = None 
    self._videoEncoding = None 
    self._videoWriter = None 

def _writeVideoFrame(self): 

    if not self.isWritingVideo: 
     return 

    if self._videoWriter is None: 
     fps = self._capture.get(cv2.CAP_PROP_FPS) 
     if fps <= 0.0: 
      # The capture's FPS is unknown so use an estimate. 
      if self._framesElapsed < 20: 
       # Wait until more frames elapse so that the 
       # estimate is more stable. 
       return 
      else: 
       fps = self._fpsEstimate 
     size = (int(self._capture.get(
        cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), 
       int(self._capture.get(
        cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))) 
     self._videoWriter = cv2.VideoWriter(
      self._videoFilename, self._videoEncoding, 
      fps, size) 

    self._videoWriter.write(self._frame) 

Klasse Window (object):

def __init__(self, windowName, keypressCallback = None): 
    self.keypressCallback = keypressCallback 

    self._windowName = windowName 
    self._isWindowCreated = False 

@property 
def isWindowCreated(self): 
    return self._isWindowCreated 

def createWindow(self): 
    cv2.namedWindow(self._windowName) 
    self._isWindowCreated = True 

def show(self, frame): 
    cv2.imshow(self._windowName, frame) 

def destroyWindow(self): 
    cv2.destroyWindow(self._windowName) 
    self._isWindowCreated = False 

def processEvents(self): 
    keycode = cv2.waitKey(1) 
    if self.keypressCallback is not None and keycode != -1: 
     # Discard any non-ASCII info encoded by GTK. 
     keycode &= 0xFF 
     self.keypressCallback(keycode) 

Antwort

0

In der Capture Klasse die Zeile
_, self._frame = self._capture.retrieve(channel = self.channel)
bis
_, self._frame = self._capture.retrieve()

Welche Version von OpenCV verwenden Sie? In Version 3.x hat cv2.VideoCapture.retrieve() kein Argument namens channel.
Mit Version 3.x müssen Sie die Quelldateien an einigen Stellen ändern, damit cameo.py erfolgreich ausgeführt wird.

Verwandte Themen