OpenCV的封裝 for Python programming

CaptureManager類用於獲取輸入:圖像,視頻或者相機python

WindowManager類用於顯示圖像與響應鍵盤、鼠標ide

######################managers.py########################oop

#definition of two essential classesui

import cv2
import numpy
import time

class CaptureManager(object):
    def __init__(self, capture, previewWindowManager = None,
                 shouldMirrorPreview = False):
        self.previewWindowManager = previewWindowManager
        self.shouldMirrorPreview = shouldMirrorPreview
        
        self._capture = capture
        self._channel = 0
        self._enteredFrame = None
        self._frame = None
        self._readimageFilename = None
        self._writeimageFilename = 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:
            flag,self._frame = self._capture.retrieve()
        elif self._readimageFilename is not None:
            self._frame = cv2.imread(self._readimageFilename,cv2.CV_LOAD_IMAGE_GRAYSCALE)
        else:
            self._frame = None
        return self._frame
        
    def isWritingImage(self):
        return self._writeimageFilename is not None
    
    def isReadingImage(self):
        return self._readimageFilename is not None
        
    def isWritingVideo(self):
        return self._videoFilename is not None
    
    def enterFrame(self):
        """Capture the next frame, if any."""
        if self._capture is not None:
            #But first, check the 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()
        else:
            None
            
    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 window, if any
        if self.previewWindowManager is not None:
            #cv2.waitKey(1)
            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._writeimageFilename, self._frame)
            self._writeimageFilename = None
            
        #Write to the video file, if any
        if self.isWritingVideo():
            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._writeimageFilename = filename
        
    def readImage(self, filename):
        """Write the next exited frame to an image file"""
        self._readimageFilename = filename
        
    def startWritingVideo(self,filename,\
                          encoding = cv2.cv.CV_FOURCC('I','4','2','0')):
        """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 _writerVideoFrame(self):
        
        if not self.isWritingVideo():
            return
        if self._videoWriter is None:
            fps = self._capture.get(cv2.cv.CV_CAP_PROP_FPS)
            if fps == 0.0:
                if self.framesElapsed <20:
                    #wait until more frames elapse so that the
                    #estimat 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)
            
    def _writerImage(self):
        
        if not self.isWritingImage:
            return
        if self._ImageWriter is None:
            cv2.imwrite(self._writeimageFilename,self._frame) 
                             
class WindowManager(object):
    
    def __init__(self,windowName, keypressCallback = None):
        self.keypressCallback = keypressCallback
        self._windowName = windowName
        self._ifWindowCreated = False
        
    def isWindowCreated(self):
        return self._isWindowCreated
    def show(self,frame):
        cv2.imshow(self._windowName,frame)
        
    def createWindow(self):
        cv2.namedWindow(self._windowName)
        self._isWindowCreated = True
        
    def destroyWindow(self):
        cv2.destroyWindow(self._windowName)
        self._isWindowCreated = False
    
    def processEvents(self):
        keycode = cv2.waitKey(1)
        if self.keypressCallback is not None:
            #Discard any non -ASCII info encoded by GTK
            #keycode &= 0xFF
            self.keypressCallback(keycode)
        if keycode != -1:
            print(keycode)


例子1,輸入圖像:spa

####################cameo1.py#################################code

from managersD import WindowManager, CaptureManager

class Cameo(object):
    def __init__(self):
        self._windowManager = WindowManager('Cameo',self.onKeypress)
        self._captureManager = CaptureManager(None, self._windowManager, False)
    
    def run(self):
        """Run the main loop"""
        self._windowManager.createWindow()
        self._captureManager.readImage("e:\python\corner_s2.jpg")
        while self._windowManager._isWindowCreated:
            self._captureManager.enterFrame()
            self._captureManager.frame()
            
            #TODO: Filter the 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 ==27: #escape
            self._windowManager.destroyWindow()
        elif keycode == -1:
            print("non")
            #self._windowManager.show(self._captureManager.frame())
if __name__ =="__main__":
    Cameo().run()


例子2,輸入video或相機圖像:視頻

#################cameo2.py##########################################ip

import cv2
from managersD import WindowManager, CaptureManager

class Cameo(object):
    def __init__(self):
        self._windowManager = WindowManager('Cameo',self.onKeypress)
        self._captureManager = CaptureManager(cv2.VideoCapture(0), self._windowManager, False)
    
    def run(self):
        """Run the main loop"""
        self._windowManager.createWindow()
        while self._windowManager._isWindowCreated:
            self._captureManager.enterFrame()
            self._captureManager.frame()
            
            #TODO: Filter the 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()
        
if __name__ =="__main__":
    Cameo().run()


OpenCV computer vision with python電子版的下載地址:http://filepi.com/i/VHV2mnu get

相關文章
相關標籤/搜索