日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

OpenCV3计算机视觉:Python实现 读书笔记-第二章

發布時間:2023/12/10 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV3计算机视觉:Python实现 读书笔记-第二章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第二章

使用numpy.array訪問圖像數據

改變一個特定像素的值:

  • numpy.array提供的item()
    • item(x,y,id)
    • id為索引,B G R
  • itemset()
    • itemset((x,y,id),val)
    • (x,y,索引,要設定的值)

操作通道:將指定通道所有值置0

import cv2 import numpy as np img = cv2.imread('1.png') img[:,:,1] = 0

視頻文件的讀/寫

  • OpenCV提供了VideoCapture類和VideoWriter類支持各種格式的視頻文件(都支持AVI格式),到達視頻文件末尾前,可通過read()獲取新的幀,每一幀是一幅基于BGR格式的圖像
import cv2 videoCapture = cv2.VideoCapture('2_1.avi') fps = videoCapture.get(cv2.CAP_PROP_FPS)#幀速率 size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))) videoWriter = cv2.VideoWriter('2_1_copy.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)sucess , frame = videoCapture.read() while sucess:videoWriter.write(frame)sucess , frame = videoCapture.read()

其中編解碼器的可用性常用選項:

  • cv2.VideoWriter_fource('I','4','2','0'):該選項是一個未壓縮的YUV顏色編碼,4:2:0色度子采樣。這種編碼有很好地兼容性,但會產生較大文件,文件擴展名.avi (例子視頻145K,產生了12.4M文件)
  • cv2.VideoWriter_fource(‘P’,‘I’,‘M’,‘1’): 生成.avi
  • cv2.VideoWriter_fource(‘X’,‘V’,‘I’,‘D’):MPEG-4編碼類型,生成.avi(若希望視頻大小為平均值,推薦使用)
  • cv2.VideoWriter_fource(‘F’,‘L’,‘V’,‘1’):該選項是一個Flash視頻,擴展名.flv

捕獲攝像頭的幀

import cv2cameraCapture = cv2.VideoCapture(0) #為了針對攝像頭創建合適的VideoWriter類, #要么對幀速率作出假設, #要么使用計時器測量 fps = 30 size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))videoWriter = cv2.VideoWriter('2_1_catch_camera.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)success , frame = cameraCapture.read() numFramesRemaining = 10 * fps - 1while success and numFramesRemaining > 0 :videoWriter.write(frame) #需要同步一組攝像頭,read()方法不適用,可用grab(),retrive()替代success , frame = cameraCapture.read()numFramesRemaining -= 1cameraCapture.release()

imshow在窗口顯示圖像

import cv2 import numpy as np img = cv2.imread('2_1.jpg') cv2.imshow('2_1.jpg',img) cv2.waitKey()#保證顯示視頻時窗口上幀可以一直更新 cv2.destroyAllWindows()

在窗口顯示攝像頭幀

  • 任意窗口下都可以通過waitKey()獲取鍵盤輸入;
  • 通過setMouseCallback()獲取鼠標輸入。
#實時顯示攝像頭幀#OpenCV不提供任何處理窗口事件的方法,單擊窗口關閉時,并不能關閉應用程序 import cv2 clicked = False #鼠標響應函數 """ flags: 代表鼠標的拖拽事件,以及鍵盤鼠標聯合事件 param:函數指針 標識了所響應的事件函數,相當于自定義了一個OnMouseAction()函數的ID。 """ def onMouse( event , x , y , flags , param ):global clickedif event == cv2.EVENT_LBUTTONUP:clicked = TruecameraCapture = cv2.VideoCapture(0) cv2.namedWindow('MyWindow')#鼠標回調函數,param為可選參數 """ C++中原型: void setMouseCallback(const string& winname, //圖像視窗名稱 MouseCallback onMouse, //鼠標響應函數,監視到鼠標操作后調用并處理相應動作 void* userdata = 0 //鼠標響應處理函數的ID,識別號,默認0 ); """ cv2.setMouseCallback('MyWindow',onMouse)print('Showing camera feed. Click window or press any key to stop.')sucess , frame = cameraCapture.read()#waitKey()參數為等待鍵盤觸發的時間,單位ms,返回值-1(表示沒有被按下) #某些系統waitKey()返回值可能比ASCII更大,可通過讀取返回值最后一個字節 #保證只提取ASCII碼: # keycode = cv2.waitKey(1) # if keycode != -1 : # keycode &= 0xFFwhile sucess and cv2.waitKey(1) == -1 and not clicked:cv2.imshow('MyWindow',frame)sucess , frame = cameraCapture.read()cv2.destroyWindow('MyWindow') cameraCapture.release()

Cameo-面向對象設計

  • 使用多個I/O流
  • 創建CaptureManager類和WindowManager類作為高級的I/O流接口

使用managers.CaptureManager提取視頻流

使用windowManager抽象窗口和鍵盤

監聽鍵盤和鼠標事件:進行截圖,截屏

運行時,攝像頭幀被鏡像,存儲圖片也被鏡像(默認設置鏡像為True)
managers.py

#managers.CaptureManager提取視頻流 import cv2 import numpy import timeclass CaptureManager(object):def __init__(self,capture,previewWindowManager = None,shouldMirrorPreview = False):self.previewWindowManager = previewWindowManagerself.shouldMirrorPreview = shouldMirrorPreviewself._capture = captureself._channel = 0self._enteredFrame = Falseself._frame = Noneself._mirroredframe = Noneself._imageFilename = Noneself._videoFilename = Noneself._videoEncoding = Noneself._videoWriter = Noneself._startTime = Noneself._framesElapsed = numpy.long(0)self._fpsEstimate = None@propertydef channel(self):return self._channel@channel.setterdef channel(self,value):if self._channel != value:self._channel = valueself._frame = None@propertydef frame(self):if self._enteredFrame and self._frame is None:_ , self._frame = self._capture.retrieve() #retrieve()是解碼并返回一個幀,grab是指向下一個幀(不需要當前幀時可跳過),read是grab和retrieve的結合return self._frame@propertydef isWritingImage(self):return self._imageFilename is not None@propertydef isWritingVideo(self):return self._videoFilename is not Nonedef enterFrame(self): #Capture the next frame#check previous frame was existed.# 檢查上一幀是否退出assert not self._enteredFrame , \'previous enterFrame() had no matching exitFrame()'if self._capture is not None :self._enteredFrame = self._capture.grab() #用grab()指向下一幀def exitFrame(self):#draw to the window ,write to files , release the frame.if self.frame is None:self._enteredFrame = Falsereturnif self._framesElapsed == 0 :self._startTime = time.time()else:timeElapsed = time.time() - self._startTimeself._fpsEstimate = self._framesElapsed / timeElapsedself._framesElapsed += 1#draw to the windowif self.previewWindowManager is not None:if self.shouldMirrorPreview:self._mirroredframe = numpy.fliplr(self._frame).copy()self.previewWindowManager.show(self._mirroredframe)else:self.previewWindowManager.show(self._frame)if self.isWritingImage:if self.shouldMirrorPreview:cv2.imwrite(self._imageFilename,self._mirroredframe)else :cv2.imwrite(self._imageFilename, self._frame)self._imageFilename = Noneself._writeVideoFrame()self._frame = Noneself._enteredFrame = Falsedef writeImage(self , filename):self._imageFilename = filenamedef startWritingVideo(self,filename,encoding=cv2.VideoWriter_fourcc('I','4','2','0')):self._videoFilename = filenameself._videoEncoding = encodingdef stopWritingVideo(self):self._videoFilename = Noneself._videoEncoding = Noneself._videoWriter = Nonedef _writeVideoFrame(self): #非公有if not self.isWritingVideo:returnif self._videoWriter is None:fps = self._capture.get(cv2.CAP_PROP_FPS)if fps == 0.0:if self._framesElapsed < 20 :returnelse:fps = self._fpsEstimatesize = (int(self._capture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(self._capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))self._videoWriter = cv2.VideoWriter(self._videoFilename,self._videoEncoding,fps,size)self._videoWriter.write(self._frame)#抽象窗口和鍵盤 class WindowManager(object):def __init__(self,windowName,keypressCallback = None,mousepressCallback = None):self.keypressCallback = keypressCallbackself.mousepressCallback = mousepressCallback #鼠標self._windowName = windowNameself._isWindowCreated = False@propertydef isWindowCreated(self):return self._isWindowCreateddef createWindow(self):cv2.namedWindow(self._windowName)self._isWindowCreated = Truecv2.setMouseCallback(self._windowName,self.mousepressCallback) #鼠標事件def show(self , frame):cv2.imshow(self._windowName,frame)def destoryWindow(self):cv2.destroyWindow(self._windowName)self._isWindowCreated = Falsedef processEvent(self):keycode = cv2.waitKey(1)if self.keypressCallback is not None and keycode != -1:keycode &= 0xFFself.keypressCallback(keycode)#python內置的@property裝飾器就是負責把一個方法變成屬性調用的

cameo.py

import cv2 from managers import WindowManager , CaptureManagerclass Cameo(object):def __init__(self):self._windowManager = WindowManager('cameo',self.onKeypress,self.onMouse)self._captureManager = CaptureManager(cv2.VideoCapture(0),self._windowManager,True)def run(self):self._windowManager.createWindow() #創建窗口while self._windowManager.isWindowCreated:self._captureManager.enterFrame() #檢查上一幀是否退出,并指向下一幀frame = self._captureManager.frame #獲取當前幀self._captureManager.exitFrame() #draw to the window ,write to files , release the frame.self._windowManager.processEvent() #處理鍵盤事件def onKeypress(self , keycode): #鍵盤響應"""Handle a keypress.space -> Take a screenshottab -> Start/Stop recording a screencastescape -> Quit"""if keycode == 32: #spaceself._captureManager.writeImage('screenshot.png')elif keycode == 9:#tabif not self._captureManager.isWritingVideo:self._captureManager.startWritingVideo('screencast.avi')else:self._captureManager.stopWritingVideo()elif keycode == 27:#escapeself._windowManager.destoryWindow()def onMouse(self , event, x, y, flags, param): #鼠標響應函數if event == cv2.EVENT_LBUTTONUP:self._windowManager.destoryWindow() if __name__=="__main__":Cameo().run()

總結

以上是生活随笔為你收集整理的OpenCV3计算机视觉:Python实现 读书笔记-第二章的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。