白話文講計算機視覺-第一講-OPENCV圖片及視頻讀寫

大家好,我是小木,沒想到吧,我又回來了,啊哈哈哈。之前幾天我腸胃感冒,所以我的博客就一直沒有更新。但我小木是打不死的小強,這次繼續回來講解啦!

本次課程我主講的內容是計算機視覺。爲什麼小木我要開這次課程呢?很簡單,因爲我之前讀了一本書,叫做《OPENCV3 計算機視覺 PYTHON語言實現》。讀了這本書,不知道是翻譯沒翻譯好,還是國外的作者寫的不好,讀起來語句不通,知識概念模糊,稍有常識的人都會知道,這是人能讀的懂的麼,一本全tmd是術語,能不能好好說話?

本人最討厭的是不好好說話的人,總說一些別人聽不懂的之乎者也,顯得自己像一個文化人,尤其是那些上了名校的本科,自以爲了不起的人。我一般很喜歡用白話把他說的聽起來很困難的東西變成簡單的不行的,幼兒園小朋友都可以理解的東西,直接給他搞的下不了臺。雖然本人的正直得罪的不少人,但是這並不影響本人在網絡中進行知識的普及。

廢話不多說,開始今天的內容:

首先我先說一下啥叫OPENCVOPENCV是一個縮寫,它的英文全稱是Open source computer version,也就是免費的計算機視覺資源。我來一個個地解釋一下,OPEN也就是open source,這個意思是開放資源,也就是免費資源。我們中國人一般有點東西都藏起來。而美國人不是這樣的,他們是做出來什麼,直接發到網上,毫無保留,爲了就是告訴大家,我能!美國人很單純,很實在,我們一定要學習。Computer version也就是CV,指的是計算機視覺,視覺我們最能聯想到的是眼睛,那麼計算機的眼睛是啥?它有眼睛?我的回答是有的,我們筆記本上面是不是都有一個攝像頭?你坐在計算機的面前,它是不是能通過攝像的方式看到你呢?這個難道不是計算機的眼睛嗎?所以計算機視覺也就是對計算機攝像頭或者是已有的圖片進行處理,讓它能夠辨識一些事物,比如我們上班打卡的人臉識別。

我們名字已經介紹完成了,既然燈塔國的科學家爲我們提供了這麼好的東西,那麼我們是不是必須拿來研究一下,才能對得起他們的心血呢?那麼我們就開始吧!

我們這次講座使用的編程語言叫做PYTHON,這個語言的教程網上太多了,大家如果不太懂的話,隨便找找教程看看就行了。

1)我們先來一個基礎,來說一下如何運用OPENCV,讀取一張圖片,並在屏幕上輸出。

首先,我們導入兩個庫,一個是cv庫,另外一個是numpy庫。爲啥要這兩個庫呢,第一個庫是計算機視覺的類庫,裏面包含很多視覺算法。第二庫是矩陣庫,這個庫裏面包括很多用來計算矩陣的算法。

其次,我們要做的是用imread類讀取圖片文件到內存中,假如小木我讀取的文件名字是opencv1-1.png圖片樣式爲

 

接下來,我們要做的是把讀取的圖片在屏幕上顯示,使用imshow類。

最後,我們設定一個參數,按鍵盤任意鍵,可以關閉圖像。

代碼如下所示:

#導入cv與numpy庫

import cv2

import numpy

#讀入圖片opencv1-1.png到變量img中

img=cv2.imread('D:/小木/opencv1-1.png')

#在屏幕上顯示圖片,圖片窗口名稱爲dawawa,展示的圖片爲img

cv2.imshow('dawawa',img)

#等待鍵盤按鍵

cv2.waitKey()

#關閉窗口並退出

cv2.destroyAllWindows()

這樣我們就在一個叫做dawawa的窗口下,顯示了一張圖片。但是我們有一點要注意,就是我們窗口名稱一定要是英文,千萬不要寫中文,否則可能報錯。

最後的結果如圖所示:


如果大家對代碼不是很熟悉的話,你們就直接拿過去用,把地址和窗口名一改就好了。(2)在我們講完讀入圖片之後,接下來我們要講解的是如何保存圖片。

首先,創造一張圖片,爲了方便,我們就用按照上面的代碼,導入的圖片img

其次,我們講內存中的圖片,保存到硬盤中,使用imwrite()類。

最後,我們設定一個參數,按鍵盤任意鍵,可以關閉圖像。
代碼如下所示:

#導入cv與numpy庫

import cv2

import numpy

#讀入圖片opencv1-1.png到變量img中

img=cv2.imread('D:/小木/opencv1-1.png')

#把img變量保存爲圖片dawawa.png

cv2.imwrite('D:/小木/dawawa.png',img)

#等待鍵盤按鍵

cv2.waitKey()

#關閉窗口並退出

cv2.destroyAllWindows()

我們的結果如圖所示:

 

3)這樣,我們的圖像就保存完畢了,我們再(1)、(2)上面拓展一下,如何能夠打開一個圖片,再把它轉換爲黑白圖片,並在屏幕中顯示,之後再保存起來呢?很簡單,我們僅僅把imread類稍微改動一下就好啦。

#導入cv與numpy庫

import cv2

import numpy

#讀入圖片opencv1-1.png到變量img中

###########修改之處##########################

img=cv2.imread('D:/小木/opencv1-1.png',cv2.IMREAD_GRAYSCALE)

###########修改之處##########################

#在屏幕上顯示圖片,圖片窗口名稱爲dawawa,展示的圖片爲img

cv2.imshow('dawawa',img)

#把img變量保存爲圖片dawawa.png

cv2.imwrite('D:/小木/dawawa1.png',img)

#等待鍵盤按鍵

cv2.waitKey()

#關閉窗口並退出

cv2.destroyAllWindows()

結果如圖所示:

 

(4)圖片的輸入輸出基礎我已經講完了,下面我要講解的是如何進行視頻的導入導出。首先我先講解一下如何導入視頻,並在屏幕中讀取:

首先,我們導入兩個庫,一個是cv庫,另外一個是numpy庫。

其次,導入視頻,應用VideoCapture類。

接着,我們獲取視頻每秒鐘的幀數。

接下來VideoCapture類中的read()方法,讀取一幀數據,我們用cv庫自帶的方法:cv2.CAP_PROP_FPS

接着,我們搞一個循環,首先在屏幕顯示一下這幀圖片,等待一段時間,一般是等待一幀的時間,計算方法是用1000/每秒幀數。然後接着讀取下一幀數據。然後顯示這幀,等待一幀的時間,然後讀取下一幀。。。

最後,當所有的幀數都讀取完畢了,我們設定一個參數,按鍵盤任意鍵,可以關閉圖像。

代碼如下所示:

#導入cv與numpy庫

import cv2

import numpy

 

#導入視頻testvideo.mp4

cameraCapture=cv2.VideoCapture('D:/小木/testvideo.mp4')

#獲取視頻的幀數

fps=cameraCapture.get(cv2.CAP_PROP_FPS)

#讀取視頻的第一幀

success,frame=cameraCapture.read()

#按照順序,循環讀取視頻中的每一幀,並顯示到屏幕上

while success:

    cv2.imshow('video',frame) #顯示到屏幕上

    cv2.waitKey(int(1000/fps))

    success,frame=cameraCapture.read() #讀取視頻的第一幀

#等待鍵盤按鍵

cv2.waitKey()

#關閉窗口並退出

cv2.destroyAllWindows()

結果如圖所示:

 

這樣,我們的視頻讀取,並且播放就做完了。

(5)假如我們用OPENCV創造了一個視頻,我們想把它保存到硬盤上,怎麼做呢,其實很簡單:

首先,我們製作視頻,爲了方便,我們就用(4)中讀取的視頻當作我們製作的視頻。

然後,給視頻確定一個幀數和尺寸(爲了方便,就用視頻自帶的幀數和尺寸代替自己設定了)並且我們建立一個視頻輸出流,用cv庫中的VideoWriter類。

其次,我們讀這個視頻的每一幀。

接下來,我們把每一幀寫入到輸出流當中進行保存。並循環讀取每一幀,並寫入輸出流,直到所有幀都保存爲止。

代碼如下所示:

#導入cv與numpy庫

import cv2

import numpy

 

#導入視頻testvideo.mp4

cameraCapture=cv2.VideoCapture('D:/小木/testvideo.mp4')

#獲取視頻的幀數

fps=cameraCapture.get(cv2.CAP_PROP_FPS)

#獲取視頻的尺寸

size=(int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))

#打開寫入流

videowriter=cv2.VideoWriter('D:/小木/save1.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)

#讀取視頻的第一幀

success,frame=cameraCapture.read()

#按照順序,循環讀取視頻中的每一幀,並輸出到寫入流中

while success:

    videowriter.write(frame) #寫入到硬盤

    success,frame=cameraCapture.read() #讀取視頻的第一幀

#等待鍵盤按鍵

cv2.waitKey()

#關閉寫入流

videowriter.release()

#關閉窗口並退出

cv2.destroyAllWindows()

結果如圖所示:

 

這樣我們的視頻讀入寫入就講完了。我們這(5)講完成之後,我們對OPENCV多少有了一點點的瞭解了。然而計算機視覺是視覺,攝像頭實驗應該是最重要的了,所以我們必須要使用攝像頭,但是怎麼使用呢,很簡單,就改改我們的(4~5)代碼就好啦。

(6)讀取攝像頭實驗:

我們用VideoCapture(0)讀取攝像頭,在括號裏,我們寫上索引號就行,比如你有2個攝像頭,第一個攝像頭索引就是0,第二個就是1

其它的都和上面一樣,如果我們打開一個攝像頭,並且在屏幕上顯示攝像頭的內容,然後把攝像頭錄製的東西保存,如果想關閉攝像頭,按鍵盤任意按鍵即可。

代碼這樣寫就行:

#導入cv與numpy庫

import cv2

import numpy

 

#導入攝像頭

cameraCapture=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('D:/小木/save1.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)

#讀取視頻的第一幀

success,frame=cameraCapture.read()

#按照順序,循環讀取視頻中的每一幀,並顯示到屏幕上、輸出到寫入流中

while success and cv2.waitKey(1)== -1: #一直讀取,並且按任意鍵結束

    cv2.imshow('video',frame) #顯示到屏幕上

    cv2.waitKey(int(1000/fps))

    videowriter.write(frame) #寫入到硬盤

    success,frame=cameraCapture.read() #讀取視頻的第一幀

#等待鍵盤按鍵

cv2.waitKey()

#關閉寫入流

videowriter.release()

#關閉攝像頭

cameraCapture.release()

#關閉窗口並退出

cv2.destroyAllWindows()

結果:

 


以上內容主要有:圖片的讀取,保存。視頻的讀取、保存。以及如何調用攝像頭。然而不僅僅小木我喜歡編寫這樣的代碼,好多人都編寫了。美國一個天才編寫了一個Cameo的類庫,這裏麪包含我們所有的東西,而且還有不少新的功能,非常強大,我們只需要調用就可以。這個代碼我們下節課講解。

————————————————

如果對我的課程感興趣的話,歡迎關注小木希望學園-微信公衆號: 

mutianwei521

也可以掃描二維碼哦!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章