生活随笔
收集整理的這篇文章主要介紹了
OpenCV3计算机视觉:Python实现 读书笔记-第二章
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第二章
使用numpy.array訪問圖像數據
改變一個特定像素的值:
- numpy.array提供的item()
- 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)
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
)
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()獲取鼠標輸入。
import cv2
clicked
= False
"""
flags: 代表鼠標的拖拽事件,以及鍵盤鼠標聯合事件
param:函數指針 標識了所響應的事件函數,相當于自定義了一個OnMouseAction()函數的ID。
"""
def onMouse( event
, x
, y
, flags
, param
):global clicked
if event
== cv2
.EVENT_LBUTTONUP
:clicked
= TruecameraCapture
= cv2
.VideoCapture
(0)
cv2
.namedWindow
('MyWindow')
"""
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
()
while 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
import cv2
import numpy
import time
class 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
.setter
def 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
() return self
._frame@
propertydef isWritingImage(self
):return self
._imageFilename
is not None@
propertydef isWritingVideo(self
):return self
._videoFilename
is not Nonedef enterFrame(self
): assert not self
._enteredFrame
, \
'previous enterFrame() had no matching exitFrame()'if self
._capture
is not None :self
._enteredFrame
= self
._capture
.grab
() def exitFrame(self
):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
+= 1if 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
= filename
def startWritingVideo(self
,filename
,encoding
=cv2
.VideoWriter_fourcc
('I','4','2','0')):self
._videoFilename
= filenameself
._videoEncoding
= encoding
def 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
._isWindowCreated
def 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
)
cameo.py
import cv2
from managers
import WindowManager
, CaptureManager
class 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
() self
._windowManager
.processEvent
() def onKeypress(self
, keycode
): """Handle a keypress.space -> Take a screenshottab -> Start/Stop recording a screencastescape -> Quit"""if keycode
== 32: self
._captureManager
.writeImage
('screenshot.png')elif keycode
== 9:if not self
._captureManager
.isWritingVideo
:self
._captureManager
.startWritingVideo
('screencast.avi')else:self
._captureManager
.stopWritingVideo
()elif keycode
== 27:self
._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实现 读书笔记-第二章的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。