【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取
一、學(xué)習(xí)目標(biāo)
目錄
[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 一、opencv的helloworld
[【python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld
[[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 三、numpy與圖像編輯] 一、opencv的helloworld
[[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 四、了解色彩空間及其詳解] 一、opencv的helloworld
[[python opencv 計(jì)算機(jī)視覺(jué)零基礎(chǔ)到實(shí)戰(zhàn)] 五、對(duì)象追蹤] 一、opencv的helloworld
二、了解opencv的圖像屬性
2.1 圖像的屬性
在我們獲取到圖像后,可以獲取到圖像的大小、類型以及通道等信息;通道指的是RGB這三個(gè)顏色通道,一幅完整的圖像是由單獨(dú)的紅色圖像、單獨(dú)的綠色圖像以及單獨(dú)的藍(lán)色圖像組成;一幅圖像若綠色通道沒(méi)有,或者說(shuō)關(guān)閉,它將會(huì)偏向其它兩個(gè)顏色,同理,若其它顏色通道關(guān)閉后亦是如此。
我們可以操作這些通道信息,完成對(duì)圖像的編輯。這三個(gè)通道的單獨(dú)值范圍都是0-255,顯示方式如單獨(dú)的紅色則是(255,0,0),單獨(dú)的綠色是(0,255,0)單獨(dú)的藍(lán)色則是(0,0,255),這些值對(duì)應(yīng)一種數(shù)據(jù)類型uint8,表示取值范圍就是0-255.
2.2 查看圖像的寬高通道
那如何獲取到圖像的這些屬性呢?在OpenCV中獲取這些信息是十分簡(jiǎn)單的。首先我們可以使用shape獲取圖像的長(zhǎng)寬以及通道個(gè)數(shù)。如下代碼:
import cv2img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg') cv2.namedWindow("Image",cv2.WINDOW_NORMAL) cv2.destroyWindow("Image") cv2.imshow("Image", img) print(img.shape)以上代碼中除了最后一行代碼,其余都是上一節(jié)的內(nèi)容,最后一行代碼調(diào)用了讀取到的img圖片文件的shape屬性。shape屬性是img圖片的長(zhǎng)寬和通道,當(dāng)使用該屬性時(shí)將會(huì)得到長(zhǎng)寬和通道屬性。結(jié)果如下:
在顯示的結(jié)果中可以看到,該值為1080、1620與3,其中長(zhǎng)是1080,寬是1620,通道數(shù)是3。我們可以查看該圖片屬性得到值,對(duì)比是否一致。改圖片信息如下:
2.3 查看圖像的整體大小
得到信息后,我們還可以具體查看這個(gè)圖片的具體大小。使用size屬性可以獲取到當(dāng)前圖片的具體大小值。
print(img.size)在2.2示例代碼末尾處添加以上代碼。運(yùn)行代碼我們可以看到顯示的內(nèi)容如下:
我們可以發(fā)現(xiàn),使用size查看大小后得到了5248800,這個(gè)數(shù)值是如何計(jì)算而來(lái)呢?我們可以通過(guò)計(jì)算器計(jì)算1080*1620的數(shù)值,當(dāng)然得出的結(jié)果并不是5248800,因?yàn)槲覀冞€缺少一步,乘上3個(gè)通道值,因?yàn)槲覀兊膱D片是需要有RGB三個(gè)通道的圖片構(gòu)成。最終通過(guò)計(jì)算機(jī)結(jié)果得出了大小的計(jì)算公式:長(zhǎng) * 寬 * 通道=size。
2.4 查看圖像通道所占的位數(shù)
我們接下來(lái)可以查看一下每個(gè)通道占的位數(shù)。使用dtype屬性可以查看每個(gè)通道數(shù)據(jù)的所占位數(shù)。
import cv2img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg') cv2.namedWindow("Image",cv2.WINDOW_NORMAL) cv2.destroyWindow("Image") cv2.imshow("Image", img)print(img.shape) print(img.size) print(img.dtype)運(yùn)行代碼我們可以看到顯示的內(nèi)容如下:
在顯示結(jié)果中的最后一行可以得知,所占的位數(shù)是uint8這個(gè)類型,這個(gè)類型所代表的一個(gè)數(shù)據(jù)范圍就是0-255,以后若見(jiàn)到了該數(shù)據(jù)類型就可以很清楚的知道其中的數(shù)據(jù)的范圍了,表示無(wú)符號(hào)的0-255這個(gè)范圍的數(shù)據(jù)。
2.4 numpy
其實(shí)我們這個(gè)讀取過(guò)來(lái)的img對(duì)象的數(shù)據(jù)類型是numpy的數(shù)據(jù)類型。numpy是一個(gè)做科學(xué)計(jì)算的數(shù)據(jù)計(jì)算包,通過(guò)numpy可以簡(jiǎn)單的去做很多運(yùn)算。我們?cè)谧x取這個(gè)圖片時(shí)所存儲(chǔ)的內(nèi)容就是很多個(gè)0-255的數(shù)據(jù)組成的,這就是這個(gè)圖片在這里最原始的樣子。也可以說(shuō)“這就是計(jì)算機(jī)所見(jiàn)到的圖片的樣子”,這句話并不嚴(yán)謹(jǐn),但是有利于我們?cè)谶@個(gè)層次去對(duì)這些圖像數(shù)據(jù)做運(yùn)算處理。
三、了解視頻讀取方法
3.1 了解視頻與圖片有什么關(guān)系
其實(shí)視頻就是很多張圖片而組成的,多張圖片呈現(xiàn)流暢的視覺(jué)感受我們就可以叫做視頻。越流暢,畫面的視頻更新率就越高,我們打游戲時(shí)有時(shí)候會(huì)說(shuō)“卡成了ppt”,這個(gè)就是指視頻更新率不夠流暢,例如fps8,指每秒有8圖片進(jìn)行顯示,fps 80則是表示有每秒有80張流暢的圖片在你眼前飄過(guò),但是你感受不出來(lái);這種呈現(xiàn)出來(lái)流程的視覺(jué)效果讓我們感受不出來(lái)是在看一張張的圖片。
我們?cè)谑褂胮r進(jìn)行視頻剪輯的時(shí)候很容易感受到這種一張張圖片,這種沒(méi)一張張圖片我們稱為每一幀。如圖:
我們每次左右移動(dòng)一個(gè)幀那么就是一張圖片,流程的圖片就形成了視頻動(dòng)畫。我們還有更為熟悉的在紙上畫畫,隨后波動(dòng)紙張就可以形成流程的動(dòng)畫效果。
其實(shí)我們可以從這個(gè)原理得到在之后課程中對(duì)視頻中圖像識(shí)別的啟示。
3.2 了解捕捉視頻的方法
要捕捉相機(jī)視頻我們需要?jiǎng)?chuàng)建一個(gè)VideoCapture對(duì)象,VideoCapture方法可以選擇相機(jī),并且返回一個(gè)VideoCapture對(duì)象。代碼如下:
captrue = cv2.VideoCapture(0)在VideoCapture方法中,傳入的參數(shù)為選擇相機(jī)是哪一個(gè),0代表第一個(gè),若你有多個(gè)相機(jī),則可以添加其他數(shù)字進(jìn)行選擇。創(chuàng)建相機(jī)后將返回一個(gè)值,該值可以使用isOpened方法判斷相機(jī)是否打開(kāi),若沒(méi)有打開(kāi)則返回,你可以可以在里面添加提示信息:
if not capture.isOpened():exit()我們可以逐幀的讀取視頻信息。編寫一個(gè)while循環(huán),使用capture的read方法。read方法將會(huì)返回2個(gè)結(jié)果,一個(gè)是是否正確讀取時(shí)的布爾值,一個(gè)是幀圖像:
while(True):ret,frame=capture.read()if not ret:break以上代碼中,ret是讀取的正確與否,frame是幀圖像。若ret不正確則會(huì)直接跳出循環(huán)。這時(shí)我們可以使用imshow函數(shù)對(duì)幀圖形進(jìn)行顯示,并且由于循環(huán)每次都在同一個(gè)窗口中進(jìn)行顯示,這時(shí)將會(huì)刷新顯示,代碼如下:
cv2.imshow("vedio",frame)由于我電腦跑不動(dòng),筆記本太老,需要添加個(gè)延時(shí),并且延時(shí)設(shè)置為3秒,3000毫秒扥估3秒:
c=cv2.waitKey (3000)為什么要等于c呢?這時(shí)因?yàn)槲倚枰袛嗍欠癜聪耬sc鍵進(jìn)行退出。waitkey可以在一定時(shí)間內(nèi)等待你按下鍵并且進(jìn)行記錄,esc鍵的值是27,所以代碼為:
if c==27:break整體代碼為:
import cv2capture=cv2.VideoCapture(0) if not capture.isOpened():exit() while(True):ret,frame=capture.read()if not ret:breakcv2.imshow("vedio",frame)c=cv2.waitKey (3000)if c==27:break這時(shí)可以運(yùn)行代碼查看效果,如果你電腦比我的更差,嗯。。。那就延時(shí)設(shè)置更高吧。運(yùn)行效果如下:
本人比較害羞所以打碼了,并且由于我設(shè)備有些問(wèn)題,所以出現(xiàn)了點(diǎn)不一樣的情況,正常情況會(huì)清晰的顯示出結(jié)果的。
注:文章首發(fā)于ebaina
四、總結(jié)
總結(jié)
以上是生活随笔為你收集整理的【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [python opencv 计算机视觉
- 下一篇: [python opencv 计算机视觉