类型错误:'channel'是此函数的无效关键字参数



每当我运行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()

如果name="main":

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)

在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。

最新更新