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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取

發(fā)布時(shí)間:2023/12/4 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、學(xué)習(xí)目標(biāo)

  • 了解圖片的結(jié)構(gòu)屬性
  • 了解如何捕獲視頻
  • 了解waitkey的使用方法
  • 目錄

    [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é)

  • 了解圖片的屬性是有3個(gè)通道,分別為紅綠藍(lán),并且可以通過(guò)shape獲取到圖片的寬高和三個(gè)通道
  • 了解了如何計(jì)算圖片的大小,是寬高乘積再乘3
  • 了解了一張完整的圖片是由3個(gè)單張的紅綠藍(lán)三通道圖片組成
  • 了解捕獲視頻需要?jiǎng)?chuàng)建VideoCapture對(duì)象
  • 了解了選擇設(shè)備在VideoCapture方法中傳入?yún)?shù)進(jìn)行選擇
  • 了解waitkey的可以等待并且接受輸入的按鍵值
  • 總結(jié)

    以上是生活随笔為你收集整理的【python opencv 计算机视觉零基础到实战】二、 opencv文件格式与摄像头读取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。