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