TypeError:'channel'是此函数的无效关键字参数

时间:2016-04-17 11:34:14

标签: typeerror

每当我运行cameo.py文件时,我都会遇到错误。请帮忙

导入cv2 导入过滤器 来自经理导入WindowManager,CaptureManager

类Cameo(对象):

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()

如果名称 ==“主要”:

Cameo()。run()

导入cv2 导入numpy 进口时间

类CaptureManager(对象):

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)

类WindowManager(对象):

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)

1 个答案:

答案 0 :(得分:0)

在CaptureManager类中更改行
_, self._frame = self._capture.retrieve(channel = self.channel)

_, self._frame = self._capture.retrieve()

您使用的是哪个版本的OpenCV?在版本3.x中,cv2.VideoCapture.retrieve()没有名为channel的参数 对于3.x版,您必须在几个地方修改源文件,以使cameo.py成功运行。