??本文介紹如何利用python控制辦公攝像頭、工業(yè)相機(jī)和科研相機(jī)。將數(shù)據(jù)采集和處理統(tǒng)一到python代碼中。
??主要圍繞解決采用什么庫(kù)、掌握這個(gè)庫(kù)的控制相機(jī)方法(參數(shù)配置、讀取數(shù)據(jù)等等)、結(jié)合自己的算法進(jìn)行處理、保存顯示結(jié)果。
??基本流程:導(dǎo)入相關(guān)的庫(kù) -> 讀取圖片的方法 -> 處理數(shù)據(jù) -> 結(jié)果保存、顯示等等。
預(yù)備內(nèi)容:
● 掌握python語(yǔ)言以及安裝加載包的方法(cv2)
● pointgray官網(wǎng)SDK及Python庫(kù):https://meta.box.lenovo.com/v/link/view/a1995795ffba47dbbe45771477319cc3
● PCO相機(jī)介紹python控制方法:https://www.pco.cn/software/third-party-software/python/
1. python控制辦公攝像頭
?? 使用cv2庫(kù)可以直接控制家用攝像頭(usb連接主機(jī)后,可以直接用電腦自帶相機(jī)軟件打開),讀取的圖像是numpy數(shù)組。具體實(shí)現(xiàn)方法如下:
# 實(shí)時(shí)在線測(cè)試家用攝像頭
# 流程:讀取圖像 -> 預(yù)處理 -> 實(shí)時(shí)顯示
import cv2
import time
import numpy as np
# 初始化
cv2.destroyAllWindows(), time.sleep(0.003) # 清空cv2顯示的窗口
# gap = (np.ones([448, 20], dtype=np.float32)*65535).astype(np.uint16)
cap = cv2.VideoCapture(0) # 指定相機(jī)
one = np.ones([480, 640, 3], dtype=np.uint8)*255 # 本demo的需求,用于計(jì)算1-img的結(jié)果,實(shí)現(xiàn)圖像色彩負(fù)片
while True:
start = time.time() # 記錄開始時(shí)間
# 讀取圖像
ret, frame = cap.read() # 讀取為numpy數(shù)組
# 預(yù)處理
frame_1 = one - frame
# 顯示圖像
cv2.imshow('frame', np.concatenate([frame, frame_1], axis=1)) # 并排顯示原圖和處理后的圖像
if cv2.waitKey(1) == 27: # 按下ESC鍵退出
break
# 打印幀率
print('幀率:{:.4f} fps'.format(1.0/(time.time()-start)))
# 釋放資源
cap.release()
cv2.destroyAllWindows()
運(yùn)行結(jié)果:
圖1 家用相機(jī)的python控制運(yùn)行結(jié)果
2. python控制工業(yè)相機(jī)的例子
??這一節(jié)以工業(yè)相機(jī)pointgray為例,介紹python如何控制pointgray相機(jī)。
??控制工業(yè)相機(jī)筆者測(cè)試了很多辦法(cv2.VideoCapture(0),pyflycap2,PyCapture2),很多方法都不行,最后成功運(yùn)行的是用官網(wǎng)提供的相關(guān)資料,pointgray官網(wǎng)SDK及Python庫(kù):https://meta.box.lenovo.com/v/link/view/a1995795ffba47dbbe45771477319cc3,下面下載的壓縮包中有readme文件,它也詳細(xì)講述了安裝步驟。
2.1 環(huán)境配置
??裝包流程:下載應(yīng)用程序和python庫(kù) -> 進(jìn)行安裝 -> 運(yùn)行demo程序 -> 進(jìn)行自己的開發(fā)。
1)從官網(wǎng)中下載對(duì)應(yīng)的SpinnakerSDK應(yīng)用程序(筆者是64位電腦,就安裝了x64的包),下載完之后進(jìn)行安裝(默認(rèn)形式安裝即可),裝完之后打開應(yīng)用程序,應(yīng)用程序在安裝路徑的bin文件夾下,如何可以用軟件打開相機(jī),說(shuō)明連接上沒(méi)有問(wèn)題,準(zhǔn)備下一步;
軟件成功打開相機(jī),并能夠控制相機(jī);
2)下載python版本的壓縮包,如下圖,進(jìn)入到python文件夾中,下載對(duì)應(yīng)電腦系統(tǒng)和python版本的壓縮包;
3)隨便解壓到一個(gè)文件夾,打開文件夾,復(fù)制.whl文件到cmd的默認(rèn)路徑(一般是C:\user\xxx),使用pip install xxx.whl進(jìn)行安裝。
安裝完之后,可以在命令行中輸入pip list來(lái)檢查pyspin包是否安裝好了:
安裝成功之后就可以使用這個(gè)庫(kù)對(duì)相機(jī)進(jìn)行控制了。
2.2 控制pointgray相機(jī)
??因?yàn)榘惭b好的庫(kù)是小寫的,官網(wǎng)給的代碼示例都是大寫的,直接導(dǎo)入PySpin會(huì)出錯(cuò),因此這里需要到入庫(kù)名稱為pyspin。
# 使用PySpin控制pointgray相機(jī)
import cv2
import numpy as np
import pyspin as PySpin
# 初始化
system = PySpin.System.GetInstance() # 創(chuàng)建系統(tǒng)對(duì)象
cam_list = system.GetCameras() # 獲取相機(jī)列表
cam = cam_list.GetByIndex(0) # 選擇要使用的相機(jī)
cam.Init()
cam.AcquisitionMode.SetValue(PySpin.AcquisitionMode_Continuous) # 采集模式為連續(xù)采集
cam.BeginAcquisition() # 開始采集
# 循環(huán)
while True:
# 讀取圖像
image_result = cam.GetNextImage(1000)
img = image_result.GetNDArray() # 轉(zhuǎn)為numpy數(shù)組
# 顯示圖像
n, m = (int(img.shape[0]/3), int(img.shape[1]/3)) # 縮小尺寸
img_resize = cv2.resize(img, (m, n)) # 縮小后的圖像
cv2.imshow('frame', np.concatenate([img_resize, 255-img_resize], axis=1)) # 并排顯示原圖和處理后的圖像
# 按下 'q' 鍵退出循環(huán)
if cv2.waitKey(1) == ord('q'):
break
# 停止采集
cam.EndAcquisition()
# 關(guān)閉相機(jī)
cam.DeInit()
# 釋放系統(tǒng)資源
del cam
del cam_list
system.ReleaseInstance()
cv2.destroyAllWindows()
結(jié)果:
3. python控制科研相機(jī)
??以PCO相機(jī)為例,1) 使用pip install pco安裝控制PCO相機(jī)所需要的庫(kù);2)使用庫(kù)初始化相機(jī)參數(shù)和讀取數(shù)據(jù);3)進(jìn)行后續(xù)自己的數(shù)據(jù)處理;
??PCO官網(wǎng)提供的說(shuō)明文檔也有非常具體的操作指南,讀者可以下載下來(lái)進(jìn)一步學(xué)習(xí)。
PCO相機(jī)介紹python控制方法:https://www.pco.cn/software/third-party-software/python/
import cv2
import pco
# 清空cv2顯示的窗口
cv2.destroyAllWindows(), time.sleep(0.003)
# 初始化相機(jī)
cam = pco.Camera() # 指定相機(jī)
exp_time = 0.01
cam.set_exposure_time(exp_time)
cam.record(4, mode='ring buffer') # 啟動(dòng)相機(jī)
cam.wait_for_first_image()
while True:
img, meta = cam.image(image_number=0xFFFFFFFF) # 讀取為numpy數(shù)組
# 執(zhí)行數(shù)據(jù)處理
# xxx
# 顯示圖像
cv2.imshow('frame', img) # 并排顯示原圖和處理后的圖像
# 按下 'q' 鍵退出循環(huán)
if cv2.waitKey(1) == ord('q'):
break
# 釋放資源
cv2.waitKey(-1)
cam.close()
cv2.destroyAllWindows()
如圖是筆者實(shí)時(shí)運(yùn)行一個(gè)去散射的結(jié)果:
如果有自動(dòng)調(diào)節(jié)曝光時(shí)間的需求,可以在上面循環(huán)語(yǔ)句中的xxx位置放置下面這段代碼:
if np.max(img[543:1438:2, 560:1455:2]) == 65535: # 過(guò)曝了,縮小曝光時(shí)間
exp_time = exp_time*55000/65535
cam.set_exposure_time(exp_time)
print('exp_time: ', exp_time)
elif np.max(img[543:1438:2, 560:1455:2]) > 50000: # 最大像素值>50000, 無(wú)需調(diào)節(jié)
pass
else: # 最大像素值<50000, 增加曝光時(shí)間
exp_time = exp_time*55000/np.max(img[543:1438:2, 560:1455:2])
cam.set_exposure_time(exp_time)
print('exp_time: ', exp_time)
自適應(yīng)曝光的實(shí)現(xiàn)過(guò)程:利用圖像的最大值分布在50000~65535之間的約束來(lái)調(diào)節(jié)曝光時(shí)間,首先計(jì)算采集圖像的最大值I_max,執(zhí)行判斷:1)如果最大值等于65535(說(shuō)明過(guò)曝),增益系數(shù)α=55000/65535,用exp_time = αexp_time來(lái)縮小曝光時(shí)間;2)如果最大值大于50000,略過(guò);3)如果最大值小于50000,增益系數(shù)α=55000/I_max,用exp_time = αexp_time來(lái)增大曝光時(shí)間。說(shuō)明:考慮到不同幀之間最大值會(huì)波動(dòng),所以用55000這個(gè)中間值來(lái)計(jì)算增益α,這樣即使有波動(dòng),只要最大值大于50000,我們就不用更新曝光時(shí)間,從而在程序上只執(zhí)行一行判斷語(yǔ)句,對(duì)整體運(yùn)行效率幾乎沒(méi)有影響。
4. 實(shí)時(shí)監(jiān)測(cè)系統(tǒng)的實(shí)現(xiàn)
??采集完圖片和處理之后,只要外部增加一個(gè)循環(huán)語(yǔ)句,就可以實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè),實(shí)時(shí)看到自己算法的效果。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-540300.html
while True:
img = cam.capture() # 這行命名是示例,要根據(jù)具體的讀取命令進(jìn)行編寫
cv2.imshow('windows', img)
# 按下 'q' 鍵退出循環(huán)
if cv2.waitKey(1) == ord('q'):
break
其他相關(guān)資料:
● matlab控制pointgray工業(yè)相機(jī):https://www.flir.cn/support-center/iis/machine-vision/application-note/getting-started-with-matlab/
● matlab控制pco相機(jī):https://blog.csdn.net/qq_34917728/article/details/121527862文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-540300.html
到了這里,關(guān)于COI實(shí)驗(yàn)室技能:python控制相機(jī)的方法——采集、處理、顯示、實(shí)時(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!