OpenCV圖像處理GUI功能詳解
OpenCV圖像處理
一、圖像入門
1.讀取圖像
使用 cv.imread() 函數(shù)讀取一張圖像,圖片應(yīng)該在工作目錄中,或者應(yīng)該提供完整的圖像路徑。第二個參數(shù)是一個 flag,指定了應(yīng)該讀取圖像的方式
cv.IMREAD_COLOR:加載彩色圖像,任何圖像的透明度都會被忽略,它是默認(rèn)標(biāo)志
cv.IMREAD_GRAYSCALE:以灰度模式加載圖像
cv.IMREAD_UNCHANGED:加載圖像,包括 alpha 通道
Note
你可以簡單地分別傳遞整數(shù) 1、0 或-1,而不是這三個 flag。
import numpy as np import cv2 as cv # 用灰度模式加載圖像 img = cv.imread('messi5.jpg', 0)
即使圖像路徑錯誤,它也不會拋出任何錯誤,但是打印 img會給你None
2.顯示圖像
用 cv.imshow() 函數(shù)在窗口中顯示圖像,窗口自動適應(yīng)圖像的大小。
第一個參數(shù)是窗口名,它是一個字符串,第二個參數(shù)就是我們的圖像。你可以根據(jù)需要創(chuàng)建任意數(shù)量的窗口,但是窗口名字要不同。
cv.imshow('image', img) cv.waitKey(0) #毫秒級顯示,如果是0就是按下任意按鍵結(jié)束顯示 cv.destroyAllWindows()
cv.waitKey() 是一個鍵盤綁定函數(shù),它的參數(shù)是以毫秒為單位的時間。該函數(shù)為任意鍵盤事件等待指定毫秒。如果你在這段時間內(nèi)按下任意鍵,程序?qū)⒗^續(xù)。如果傳的是 0,它會一直等待鍵盤按下。
cv.destroyAllWindows() 簡單的銷毀我們創(chuàng)建的所有窗口。如果你想銷毀任意指定窗口,應(yīng)該使用函數(shù) cv.destroyWindow() 參數(shù)是確切的窗口名。
import numpy as np import cv2 as cv # 用RGB模式加載圖像 img = cv.imread('1.jpg', 1) cv.imshow('image', img) cv.waitKey(0) cv.destroyAllWindows()
也可以同時顯示兩張圖像
有一種特殊情況,你可以先創(chuàng)建一個窗口然后加載圖像到該窗口。在這種情況下,你能指定窗口是否可調(diào)整大小。它是由這個函數(shù)完成的 cv.namedWindow()。默認(rèn)情況下,flag 是 cv.WINDOW_AUTOSIZE。但如果你指定了 flag 為 cv.WINDOW_NORMAL,你能調(diào)整窗口大小。當(dāng)圖像尺寸太大,在窗口中添加跟蹤條是很有用的。
import numpy as np import cv2 as cv # 用RGB模式加載圖像 img = cv.imread('1.jpg', 1) cv.imshow('image', img) cv.waitKey(0) cv.destroyAllWindows()
可以看到圖片可以拉伸,也可以自己去對比一下效果。
3.保存圖像
保存圖像,用這個函數(shù) cv.imwrite()。
第一個參數(shù)是文件名,第二個參數(shù)是你要保存的圖像。
import numpy as np import cv2 as cv # 用RGB模式加載圖像 img = cv.imread('1.jpg', 1) cv.imwrite('11.jpg',img) #將1.jpg保存為11.jpg cv.namedWindow('image', cv.WINDOW_NORMAL) cv.imshow('image',img) cv.waitKey(0) cv.destroyAllWindows()
圖像小結(jié)
下面的程序以灰度模式讀取圖像,顯示圖像,如果你按下 's‘ 會保存和退出圖像,或者按下 ESC 退出不保存。
import numpy as np import cv2 as cv img = cv.imread('11.jpg',0) cv.imshow('image',img) k = cv.waitKey(0) if k == 27: # ESC 退出 cv.destroyAllWindows() elif k == ord('s'): # 's' 保存退出 cv.imwrite('m.jpg',img) cv.destroyAllWindows()
二、視頻入門
1.用相機捕捉視頻
通常,我們用相機捕捉直播。OpenCV 為此提供了一個非常簡單的接口。我們用相機捕捉一個視頻(我用的電腦內(nèi)置攝像頭),將它轉(zhuǎn)換成灰度視頻并顯示。去獲取一個視頻,你需要創(chuàng)建一個VideoCapture對象。它的參數(shù)可以是設(shè)備索引或者一個視頻文件名。設(shè)備索引僅僅是攝像機編號。通常會連接一臺攝像機(as in my case)。所以我只傳了 0(或者-1)。你可以通過傳 1 來選擇第二個攝像機,以此類推。之后,你能逐幀捕獲。但是最后,不要忘記釋放這個 Capture 對象。
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) while(True): # 一幀一幀捕捉 ret, frame = cap.read() # 我們對幀的操作在這里 gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # cv.COLOR_BGR2RG顯示彩色圖像 # 顯示返回的每幀 cv.imshow('frame',gray) if cv.waitKey(1) & 0xFF == ord('q'): break # 當(dāng)所有事完成,釋放 VideoCapture 對象 cap.release() cv.destroyAllWindows()
cap.read() 返回一個 bool 值(True/False)。如果加載成功,它會返回True。因此,你可以通過這個返回值判斷視頻是否結(jié)束。
2.播放視頻文件
它和從相機捕獲一樣,只需要用視頻文件名更改相機索引。同時顯示 frame,為 cv.waitKey() 使用合適的時間。如果它太小,視頻將非???,如果太大,視頻將很慢 (嗯,這就是如何顯示慢動作)。正常情況下,25 毫秒就可以了。
import numpy as np import cv2 as cv cap = cv.VideoCapture('FinalVideo_1642014289.728580.MP4') while(cap.isOpened()): ret, frame = cap.read() gray = cv.cvtColor(frame, cv.COLOR_BGR2RGB) cv.imshow('frame',gray) if cv.waitKey(1) & 0xFF == ord('q'): break cap.release() cv.destroyAllWindows()
視頻只有30秒左右,可以看到視頻播放速度很快,像是原視頻2倍速播放一樣。
3.保存視頻
我們捕獲視頻,逐幀處理然后保存下來。對于圖像來說,是非常的簡單,就用 cv.imwrite()。這里需要做更多的工作。
這次我們創(chuàng)建一個 VideoWriter 對象。我們應(yīng)該指定輸出文件的名字 (例如:output.avi)。然后我們應(yīng)該指定 FourCC 碼。然后應(yīng)該傳遞每秒幀數(shù)和幀大小。最后一個是 isColor flag。如果是 True,編碼器期望彩色幀,否則它適用于灰度幀。
FourCC 是用于指定視頻解碼器的 4 字節(jié)代碼。這里 fourcc.org 是可用編碼的列表。它取決于平臺,下面編碼就很好。
In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. (XVID 是最合適的. MJPG 結(jié)果比較大. X264 結(jié)果比較小)
In Windows: DIVX (還需要測試和添加跟多內(nèi)容)
In OSX: MJPG (.mp4), DIVX (.avi), X264 (.mkv).
對于 MJPG, FourCC 的代碼作為 cv.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) 或 cv.VideoWriter_fourcc(‘MJPG’)* 傳遞。
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) # 聲明編碼器和創(chuàng)建 VideoWrite 對象 fourcc = cv.VideoWriter_fourcc(*'XVID') out = cv.VideoWriter('output.avi',fourcc, 20.0, (640,480)) while(cap.isOpened()): ret, frame = cap.read() if ret==True: frame = cv.flip(frame,0) # 寫入已經(jīng)翻轉(zhuǎn)好的幀 out.write(frame) cv.imshow('frame',frame) if cv.waitKey(1) & 0xFF == ord('q'): break else: break # 釋放已經(jīng)完成的工作 cap.release() out.release() cv.destroyAllWindows()
可以看到有avi文件生成。
總結(jié)
GUI功能是opencv的入門知識,還是很好理解的。
到此這篇關(guān)于OpenCV圖像處理——GUI功能的文章就介紹到這了,更多相關(guān)OpenCV圖像處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解基于Facecognition+Opencv快速搭建人臉識別及跟蹤應(yīng)用
這篇文章主要介紹了詳解基于Facecognition+Opencv快速搭建人臉識別及跟蹤應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01實例講解Python腳本成為Windows中運行的exe文件
在本篇文章里小編給大家分享了關(guān)于Python腳本成為Windows中運行的exe文件的相關(guān)知識點內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-01-01django搭建項目配置環(huán)境和創(chuàng)建表過程詳解
這篇文章主要介紹了django搭建項目配置環(huán)境和創(chuàng)建表過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07Python OpenCV學(xué)習(xí)之特征點檢測與匹配詳解
提取圖像的特征點是圖像領(lǐng)域中的關(guān)鍵任務(wù),不管在傳統(tǒng)還是在深度學(xué)習(xí)的領(lǐng)域中,特征代表著圖像的信息,對于分類、檢測任務(wù)都是至關(guān)重要的。這篇文章主要為大家詳細(xì)介紹了OpenCV特征點檢測與匹配,需要的可以參考一下2022-01-01