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