獲取圖像的方式有:1,讀取本地圖片,2,調用筆記本自帶攝像頭或usb攝像頭,3,調用網絡攝像頭。
這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:
Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
下面讀取一張圖片並顯示
學過數字圖像處理的小夥伴應該很熟悉,在數字圖像處理課上,這是一張標準的測試圖片。關於圖片的來源:1973年6月,美國南加州大學的信號圖像處理研究所的一個助理教授和他的一個研究生打算為了一個學術會議找一張數字照片,而他們對於手頭現有成堆"無聊"照片感到厭煩。事實上他們需要的是一個人臉照片,同時又能讓人眼前一亮。這時正好有人走進實驗室,手上帶著一本當時的花花公子雜誌,結果故事發生了……而限於當時實驗室設備和測試圖片的需要,lenna的圖片只摳到了原圖的肩膀部分。
Lena圖像在科研領域流行的原因:1.該圖適度的混合了細節、平滑區域、陰影和紋理,從而能很好的測試各種圖像處理算法。2.Lenna是個美女,對於圖像處理界的研究者(大部分都是男性)來說,美女圖可以有效地吸引他們來做研究。
下面是分別用面向過程與面向對象的編程方法實現讀取本地圖像和打開攝像頭兩段代碼:
# -*- coding: utf-8 -*-
"""
面向過程的編程方法,用函數把解決問題的步驟一步一步實現。
運行環境:win10系統 python==3.6 opencv-contrib-python== 4.1.0
第一行「# -*- coding: utf-8 -*-」 告訴Python解釋器,按照UTF-8編碼讀取原始碼
"""
import cv2
image=cv2.imread('lena.JPG') #讀取本地圖片,圖片與源文件放在一起
cv2.imshow("lena",image) #顯示
#
#調用攝像頭,cv2.VideoCapture(0),0表示使用默認攝像頭,如果有多個攝像頭,填寫不同的數字即可
#
#調用網絡攝像頭# 根據攝像頭設置IP及rtsp埠(手上沒有網絡攝像頭,沒有測試)
#url = 'rtsp://account:password@192.168.0.35:554/11'
#camera = cv2.VideoCapture(url)
#
camera = cv2.VideoCapture(0) #使用默認攝像頭
while(True):
ret,frame = camera.read() #frame圖片,參數ret為True 或False,代表是否讀取成功
cv2.imshow('camera',frame) #顯示
K=cv2.waitKey(10) #等待10ms,並檢測按鍵
if K == 27: #按下 Esc 退出,窗口活動時有效
break
camera.release() #釋放攝像頭
cv2.waitKey(0) #等待按下任意鍵,窗口活動時有效
cv2.destroyAllWindows() #銷毀所有窗口
# -*- coding: utf-8 -*-
"""
定義類,面向對象的編程方法,程序設計的重點在於數據而不是步驟,以功能來劃分問題
運行環境 python==3.6 opencv-contrib-python== 4.1.0 win10系統
第一行 「 # -*- coding: utf-8 -*- 」 告訴Python解釋器,按照UTF-8編碼讀取原始碼
"""
#圖像獲取
import cv2
import numpy as np
#
class image():
#創建一個 image類
def __init__(self, name,model=0): # 構造函數
#初始化屬性
self.name = name
self.model = model # 給屬性指定默認值
def read(self): # 定義一個read()方法 讀取本地圖片
self.image=cv2.imread(self.model) #讀取本地圖片
def openCamera(self): # 定義一個 openCamera()方法
self.camera = cv2.VideoCapture(self.model) #使用默認攝像頭
def run(self): # 定義一個run()方法
self.ret,self.image = self.camera.read() #image圖片,參數ret為True 或False,代表是否讀取成功
def close(self):
self.camera.release() #釋放攝像頭
#
if __name__ == '__main__':
」」」
if __name__ == '__main__': 的作用
python代碼文件使用時有兩種方法,1,直接作為腳本執行,有沒有if __name__ == 'main':這 句無影響。2,import到其他的python腳本執行。如果沒有if __name__ == 'main': 時,想import 到其他的python腳本調用此腳本裡面的函數時會執行整個python代碼,而我們只想調用某個函 數,這時就要加上if __name__ == 'main':這句了。
」」」
m1=image("image1",0)
m1.openCamera()
while(1):
m1.run()
image1=m1.image
cv2.imshow('camera',image1) #顯示
K=cv2.waitKey(500) #等待按下任意鍵,窗口活動時有效
if K == 27: #按下 Esc 退出,窗口活動時有效
m1.close()
break
cv2.destroyAllWindows() #銷毀所有窗口
#
m2=image("image2",model='lena.JPG')
m2.read()
cv2.imshow(lena,m2.image)
cv2.waitKey(0)
cv2.destroyAllWindows() #銷毀所有窗口
面向過程性能更高,面向對象易維護、易復用、易擴展。兩種方法各有各的優勢,使用時要根據實際情況選擇。