番外1. OpenCV 圖像處理之圖片加載與視頻加載
本系列專欄寫作方式交代
本系列專欄寫作將采用首創(chuàng)的問答式寫作形式,快速讓你學(xué)習(xí)到 OpenCV 的初級、中級、高級知識。
1. OpenCV 中圖片是如何加載與顯示的?
學(xué)習(xí) OpenCV 的第一步就是加載圖片,類似學(xué)習(xí)任何編程語言的 Hello Word一樣, 將電腦磁盤上的圖片加載到程序中,才可以進(jìn)行后續(xù)的操作。
在加載圖片的過程中,我們將使用到三個核心函數(shù),分別如下:
cv2.imread 讀取圖片
cv2.imshow 展示圖片
cv2.imwrite 寫入圖片
任何圖像處理領(lǐng)域的高手,都是伴隨這三個函數(shù)起步的,接下來你也將接觸到這3個起始函數(shù)啦
cv2.imread 讀取圖片的用法與注意事項(xiàng)
在讀取圖片之前,你首先要知道圖片所在的位置,即電腦磁盤路徑,該部分如果你完全零基礎(chǔ),建議你學(xué)習(xí)【絕對路徑】與【相對路徑】相關(guān)知識。
cv2.imread 函數(shù)具備兩個必會參數(shù),其一圖片路徑,其二是讀取方式,也就是告訴程序如何讀取這幅圖像。
第一個參數(shù)的取值非常簡單,就是電腦上任意圖片路徑即可,重點(diǎn)注意圖片的后綴名(擴(kuò)展名),
第二個參數(shù)取值非常多,初學(xué)階段掌握以下兩個數(shù)值即可
cv2.IMREAD_COLOR,讀取彩色圖像,此時忽略圖像的透明度,使用該值時,如果讀取的是透明 png 圖片,一定要注意,透明通道不會被讀取到
cv2.IMREAD_GRAYSCALE 灰度圖方式讀取
CV2.IMREAD_UNCHANGED 讀入的圖像包括 alpha 通道,即透明通道
這里存在一個問題,需要特別說明一下:
除了上述幾個值以外,還有其他值,但是在學(xué)習(xí)階段可以先略過,等到需要的時候。
那這里就有一個常見疑問,就是存在這樣一個值 cv2.IMREAD_ANYCOLOR,這個值與 cv2.IMREAD_COLOR
有何區(qū)別呢?
cv2.IMREAD_COLOR : 設(shè)置該值只會讀取BGR三個通道;
cv2.IMREAD_ANYCOLOR :設(shè)置該值會按照任何可能的顏色通道讀取;
如果你一直操作的都是 BGR 通道的圖片,那 ANYCOLOR 永遠(yuǎn)意識不到區(qū)別
讀取圖片的代碼如下
import cv2 img = cv2.imread('./test_img.jpg') print(type(img))
以上代碼從Python語言上來看,沒有什么特別難的地方,但是會出現(xiàn)如下錯誤
本系列專欄既然是為了解決問題而寫,那我們關(guān)注的就是BUG。
讀取圖片的時候,正常會讀取到一個圖片資源,圖片類型如下所示
但是,很多時候,會返回一個空值
該值出現(xiàn)的原因是,你的圖片路徑不對,即沒有讀取到你的目標(biāo)圖片,修改圖片路徑即可解決問題。
本部分代碼中 './test_img.jpg' 為圖片路徑,專業(yè)術(shù)語叫做硬編碼,實(shí)際開發(fā)過程中,建議采用os、path 模塊實(shí)現(xiàn)對路徑的自動處理。
還有一種可能性會導(dǎo)致你返回
cv2.imshow 顯示圖像的使用方法與相關(guān)注意事項(xiàng)
默認(rèn)使用 cv2.imshow 函數(shù)即可顯示圖像,而且打開的窗口會自適應(yīng)圖片,該函數(shù)也包含兩個參數(shù),其一是窗口名字,注意不要使用中文,其二是圖像。
這個函數(shù)的實(shí)際應(yīng)用比較簡單,但是有如下問題,需要注意,具體代碼為:
import cv2 img = cv2.imread('./test_img.jpg') print(type(img)) cv2.imshow('image',img) cv2.imshow('image',img) cv2.waitKey(0)
測試上述代碼之后,程序運(yùn)行之后只會出現(xiàn)一個窗口,這是因?yàn)槲覀儍纱问褂?cv2.imshow 函數(shù),第一個窗口名稱參數(shù)給了相同的值,如果希望打開兩個窗口,一定要將該參數(shù)設(shè)置為不同值。
這里還擴(kuò)展出了一個新的函數(shù) cv2.waitKey,如果沒有該函數(shù),窗口將一閃而過。
該函數(shù)準(zhǔn)確的說是鍵盤綁定的函數(shù),只是這里用了它等待響應(yīng)這一目的。
cv2.waitKey具備一個參數(shù),含義是時間,注意單位是毫秒,如果期望設(shè)置具體的毫秒數(shù),按照預(yù)期設(shè)置參數(shù)值即可,如果設(shè)置為 0,窗口將無限等待下去,直到關(guān)閉,或者按下特定按鍵。
在這個地方有一個需要特別注明,并且大家可以擴(kuò)展學(xué)習(xí)的知識點(diǎn)
一般情況下,我們按照如下設(shè)置進(jìn)行窗口檢測:
k = cv2.waitKey(0) if k == 27: pass
以上代碼在 32 位機(jī)器上可以正常運(yùn)行,但是在 64 位機(jī)器,建議按照下述代碼修改:
k = cv2.waitKey(0) & 0xFF if k == 27: pass
上述代碼還可以進(jìn)行修改,具體如下:
import cv2 img = cv2.imread('./test_img.jpg') cv2.startWindowThread() cv2.namedWindow("image_show") cv2.imshow("image_show", img) cv2.waitKey()
其中新增加了 cv2.startWindowThread函數(shù)與cv2.namedWindow函數(shù)
以上兩個函數(shù)的含義如下:
cv2.startWindowThread:新開一個線程用于實(shí)時刷新圖片
cv2.namedWindow:命名一個窗口,并且讓窗口可調(diào)整
cv2.namedWindow函數(shù)可以進(jìn)行拆解下:
默認(rèn)情況下,我們使用 cv2.imshow 打開的窗口是不能調(diào)整窗口比例的,如果希望可以調(diào)整,就必須用到 cv2.namedWidows 函數(shù),畢竟不是所有的電腦都是高分辨率的,例如橡皮擦自己的電腦就很難展示大圖。
該函數(shù)的原型如下:
cv.namedWindow(winname, flags=None)
其中 winname 是窗口名稱,后續(xù) cv2.imshow 在調(diào)用的時候,第一個參數(shù)要與其匹配上,第二個參數(shù)是窗口標(biāo)志。
WINDOW_NORMAL:顯示圖像后,允許用戶隨意調(diào)整窗口大小;
WINDOW_AUTOSIZE:根據(jù)圖像大小顯示窗口,不允許用戶調(diào)整大小;
WINDOW_FREERATIO:窗口大小自適應(yīng)比例;
WINDOW_KEEPRATIO:保持圖像的比例。
默認(rèn)值是 WINDOW_AUTOSIZE。
以上內(nèi)容比較簡單,不做代碼演示。
cv2.imwrite 寫入圖像的使用方法與相關(guān)注意事項(xiàng)
使用 cv2.imwrite 函數(shù)可以保存一張圖片,該函數(shù)也具備兩個參數(shù),第一個為圖片名,第二個為待保存的圖片
該函數(shù)的使用非常簡單:
import cv2 img = cv2.imread('test_img.jpg') cv2.imwrite('test.jpg',img)
該函數(shù)還有一個非必填參數(shù),即可選參數(shù),并且它存在不同解釋。
如果保存的為 JPG 圖片,表示的是圖像的質(zhì)量,用 0~100 的整數(shù)表示;
如果保存的為 PNG 圖片,表示的是壓縮級別,默認(rèn)為 3
使用的時候,參照如下代碼即可:
cv2.imwrite('test.jpg',img, [int(cv2.IMWRITE_JPEG_QUALITY), 95]) cv2.imwrite('test.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 4])
如果使用 cv2.imwrite發(fā)現(xiàn)文件并沒有存儲成功,注意,該問題可能是中文路徑的問題,例如下述代碼:
import cv2 img = cv2.imread('test_img.jpg') cv2.imwrite('./圖片/test.jpg',img)
出現(xiàn)該問題之后,建議將中文路徑名進(jìn)行修改,否則只能切換其他圖像保存方法。
OpenCV 圖像處理 視頻
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。