处理文件、摄像头和图形用户界面
1、基本I/O腳本
1.1 讀/寫圖像文件
import numpy import cv2#利用二維Numpy數組簡單創建一個黑色的正方形圖像 img = numpy.zeros((3,3),dtype=numpy.uint8) img #結果為: ''' array([[0, 0, 0],[0, 0, 0],[0, 0, 0]], dtype=uint8) ''' img.shape#結果為:(3, 3)####################################################################利用cv2.cvtColor函數將該圖像轉化為BGR格式 img1 = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) img1 #結果為: ''' array([[[0, 0, 0],[0, 0, 0],[0, 0, 0]],[[0, 0, 0],[0, 0, 0],[0, 0, 0]],[[0, 0, 0],[0, 0, 0],[0, 0, 0]]], dtype=uint8) ''' img1.shape#結果為:(3, 3, 3)①將圖像從PNG格式轉換為JPG格式:
②將BGR圖片轉化為灰度圖片:
運行前:
運行后:
1.2 圖像與原始字節之間的轉換
將含有隨機字節的bytearray轉換為灰度圖像和BGR圖像:
import cv2 import numpy import osrandomByteArray = bytearray(os.urandom(120000)) flatNumpyArray = numpy.array(randomByteArray)grayImage = flatNumpyArray.reshape(300,400)#(y,x) cv2.imwrite('RandomGray.png',grayImage)bgrImage = flatNumpyArray.reshape(100,400,3)#(y,x,顏色通道數目) cv2.imwrite('RandomColor.png',bgrImage)運行前:
運行后:
1.3 使用numpy.array訪問圖像數據
將BGR圖像在(10,10)處的像素轉換為紅像素
import cv2 import numpy as npimg = cv2.imread("result.png") img[10,10] = [0,0,255]#[B,G,R] cv2.imshow('yy',img) cv2.waitKey(0) cv2.destroyAllWindows()結果為:
將坐標(150,120的當前藍色值(127)變為255:
import cv2 import numpy as np img = cv2.imread("result.png") print(img.item(50,20,0)) #pixel img.itemset((150,20,0),255) print(img.item(50,20,0)) cv2.imshow('yy',img) cv2.waitKey(0) cv2.destroyAllWindows()結果為:
操作通道:將指定通道(B,G,R)的值置為零,下列代碼將圖像所有的R通道設置為0(黑色),為了是效果更加明顯,這里將圖片選擇純紅色的彩色照片。
import cv2 import numpy as np img = cv2.imread("red.jpg") img[:,:,2] = 0 cv2.imshow('yy',img) cv2.waitKey(0) cv2.destroyAllWindows()原始照片:
運行結果:
將該區域與變量綁定,然后設定第二個區域,并將第二個區域的值分配給第二個區域(將圖像的一部分拷貝到改該圖像的另一個位置)
原始圖片:
運行結果:
獲得圖像屬性:
shape::Numpy返回包含寬度、高度和通道數(如果圖像是彩色的)的數組,這在調試圖像類型時很有用:如果圖像是單色或灰度的,將不包含通道值。
size:該屬性是指圖像像素的大小。
datatype:該屬性會得到圖像的數據類型(通常為一個無符號整數類型的變量和該類
型占的位數,比如uint8類型)。
1.4 視頻文件的讀/寫
Opencv提供了 Video Capture類和 Videowriter類來支持各種格式的視頻文件。支持的格式類型會因系統的不同而變化,但應該都支持AWI格式。在到達視頻文件末尾之前,Video Capture類可通過 reado函數來獲取新的幀,每幀是一幅基于BGR格式的圖像。
可將一幅圖像傳遞給 Video Writer類的 write(0函數,該函數會將這幅圖像加到Videowriter類所指向的文件中。
讀取AVI文件(hahaha.avi)的幀,并采用YUV顏色編碼將其寫人另一個幀(xixixi.flv)中:
import cv2 videoCapture = cv2.VideoCapture("hahaha.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('xixixi.flv',cv2.VideoWriter_fourcc('F','L','V','1'),fps,size)success,frame = videoCapture.read() while success:videoWriter.write(frame)success,frame = videoCapture.read()運行結果:
| cv2.VideoWriter fouree (T’, ‘4’,‘2’,‘0’) | .avi | 該選項是一一個未壓縮的YUV顏色編碼,是4:2:0色度子采樣。這種編碼有很好的兼容性,但會產生較大文件。 |
| cv2.VideoWriter_ fouree (‘P’,T’, ‘M’, ‘1’) | .avi | 該選項是MPEG-1編碼類型。 |
| cv2.VideoWriter_ fourcc (‘X’, ‘V’,T, ‘D’) | .avi | 該選項是MPEG-4編碼類型,如果希望得到的視頻大小為平均值,推薦使用此選項。 |
| cv2.VideoWriter_ fourcc(‘T’,‘H’,‘E’ ,‘O’) | .ogv | 該選項是Ogg Vorbis |
| cv2.VideoWriter_ fourcc (‘F’,‘L’, ‘V’, ‘1’) | .flv | 該選項是一個Flash視頻 |
1.5 捕獲攝像頭的幀并保存
捕獲攝像頭10s的視頻信息,并寫入一個AVI文件中:
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("siqi.avi",cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)success,frame = cameraCapture.read() numFramesRemaining = 10*fps-1 while success and numFramesRemaining > 0:videoWriter.write(frame)success,frame = cameraCapture.read()numFramesRemaining -= 1 cameraCapture.release()運行結果:
1.6 在窗口顯示圖像
import cv2 import numpy as npimg = cv2.imread("gray.png") cv2.imshow('siqi_show',img) cv2.waitKey() cv2.destroyAllWindows()運行結果:
1.7 在窗口顯示攝像頭幀
OpenCV的窗口函數和waitKey()函數相互依賴。OpenCV 的窗口只有在調用waitKey()函數時才會更新,waitKey()函數只有在OpenCV窗口成為活動窗口時,才能捕獲輸人信息。鼠標回調雨數setMouseCallback()有五個參數。param為可選參數,它是setMouseCallback(函數的第三個參數,默認情況下,該參數是0。
實時顯示攝像頭幀,按任意鍵結束:
運行結果:
回調事件參數可以取如下的值,它們分別對應不同的鼠標事件。
| cv2.EVENT MOUSEMOVE | 該事件對應鼠標移動 |
| cv2. EVENT LBUTTONDOWN | 該事件對應鼠標左鍵按下 |
| cv2. EVENT RBUTTONDOWN | 該事件對應鼠標右鍵按下 |
| cv2.EVENT MBUTTONDOWN | 該事件對應鼠標中間鍵按下 |
| cv2.EVENT LBUTTONUP | 該事件對應鼠標左鍵松開 |
| cv2.EVENT_ RBUTTONUP | 該事件對應鼠標右鍵松開 |
| cv2.EVENT MBUTTONUP | 該事件對應鼠標中間鍵松開 |
| cv2.EVENT LBUTTONDBLCLK | 該事件對應雙擊鼠標左鍵 |
| cv2.EVENT RBUTTONDBLCLK | 該事件對應雙擊鼠標右鍵 |
| cv2.EVENT MBUTTONDBLCLK | 該事件對應雙擊鼠標中間鍵 |
鼠標回調的標志參數可能是以下事件的按位組合:
| cv2.EVENT FLAG LBUTTON | 該事件對應按下鼠標左鍵 |
| cv2.EVENT FLAG RBUTTON | 該事件對應按下鼠標右鍵 |
| cv2.EVENT FLAG MBUTTON | 該事件對應按下鼠標中間鍵 |
| cv2.EVENT FLAG CTRLKEY | 該事件對應按下Ctrl鍵 |
| cv2.EVENT FLAG SHIFTKEY | 該事件對應按下Shift 鍵 |
| cv2.EVENT FLAG ALTKEY | 該事件對應按下Alt鍵 |
OpenCV不提供任何處理窗口事件的方法。例如:當單擊窗口的關閉按鈕時,并不能關閉應用程序。
總結
以上是生活随笔為你收集整理的处理文件、摄像头和图形用户界面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米投影仪青春版2可以连接switch吗
- 下一篇: 已知一个掺杂了多个数字字符的中文名拼音,