海康工業相機Python呼叫實現連續實時拍照
阿新 • • 發佈:2021-01-27
海康工業相機Python呼叫實現連續實時拍照
文章目錄
前言:
海康的相機呼叫簡直太複雜了。當然相比point gray fly的相機無法python呼叫要好很多。
為了將照片呼叫打包成類,我竟然花了兩天時間?
這裡做一個簡單的記錄。希望能給大夥兒一個分享。
參考連結:
海康工業相機Python呼叫實現拍照
通過python呼叫海康威視工業攝像頭並進行影象儲存(資料流獲取問題未能解決)
提前設定:
- 先安裝MVS,下載地址
- 條件:Python+海康官方的mvs檔案下的development/samples下的python資料夾
- 注意:相機連線後不要用官方app開啟相機,不然python程式碼檢測不到裝置,程式碼在pycharm會提示報錯,親測能跑並能擷取到圖片
- 需要新增模組MvImport的路徑:
這是整個程式碼的核心,檔案裡面內容如下,具體可以下載MVS裡面例程裡面有:
import sys
sys.path.append("C:\Program Files (x86)\MVS\Development\Samples\Python\MvImport")
圖片資料流的獲取:
save_image2local
函式部分,主要是將C程式給過來的資料流進行了一個轉換,仔細看儲存的路徑不難看出,img_buff就是我們想要的影象資料流。
只能先將其儲存下來然後再通過cv2進行讀取來進行一系列圖片操作。
file_path是我們圖片儲存的路徑,可以自己更改。原本下面有一個輸入a退出的按鈕但沒有反應,所以我刪掉了它。
再到之後就是關閉資料流,關閉攝像頭操作。因為博主沒法直接讀取資料流不能直接視訊顯示,沒法得知這個資料是實時更新影象還是一次整體執行獲取一次影象資訊,所以我的方法是整體執行關閉一次採集一次資料,非常麻煩。
程式碼:
# -- coding: utf-8 --
from os import times
import cv2
import sys
import numpy as np
import time
from ctypes import *
sys.path.append("C:\Program Files (x86)\MVS\Development\Samples\Python\MvImport")
from MvCameraControl_class import *
class HHV:
def __init__(self,):
self.init_cam()
for i in range(10):
st = time.time()
img = self.get_image_array()
print(img.shape)
# cv2.imshow("img", img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
print("st:", time.time()-st)
self.exit_cam()
def get_image_array(self):
self.save_image2local(index=0)
img = cv2.imread("AfterConvert_RGB0.jpg")
return img
def init_cam(self,):
deviceList = MV_CC_DEVICE_INFO_LIST()
tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
nConnectionNum = 0
# ch:建立相機例項 | en:Creat Camera Object
self.cam = MvCamera()
# ch:選擇裝置並建立控制代碼 | en:Select device and create handle
stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)],
POINTER(MV_CC_DEVICE_INFO)).contents
ret = self.cam.MV_CC_CreateHandle(stDeviceList)
# ch:開啟裝置 | en:Open device
ret = self.cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
# ch:設定觸發模式為off | en:Set trigger mode as off
ret = self.cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
# ch:獲取資料包大小 | en:Get payload size
stParam = MVCC_INTVALUE()
memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))
ret = self.cam.MV_CC_GetIntValue("PayloadSize", stParam)
self.nPayloadSize = stParam.nCurValue
def save_image2local(self, index=0):
# ch:開始取流 | en:Start grab image
ret = self.cam.MV_CC_StartGrabbing()
stDeviceList = MV_FRAME_OUT_INFO_EX()
memset(byref(stDeviceList), 0, sizeof(stDeviceList))
self.data_buf = (c_ubyte * self.nPayloadSize)()
ret = self.cam.MV_CC_GetOneFrameTimeout(byref(self.data_buf), self.nPayloadSize, stDeviceList, 1000)
if ret == 0:
# print ("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (stDeviceList.nWidth, stDeviceList.nHeight, stDeviceList.nFrameNum))
nRGBSize = stDeviceList.nWidth * stDeviceList.nHeight * 3
stConvertParam=MV_SAVE_IMAGE_PARAM_EX()
stConvertParam.nWidth = stDeviceList.nWidth
stConvertParam.nHeight = stDeviceList.nHeight
stConvertParam.pData = self.data_buf
stConvertParam.nDataLen = stDeviceList.nFrameLen
stConvertParam.enPixelType = stDeviceList.enPixelType
stConvertParam.nImageLen = stConvertParam.nDataLen
stConvertParam.nJpgQuality = 70
stConvertParam.enImageType = MV_Image_Jpeg
stConvertParam.pImageBuffer = (c_ubyte * nRGBSize)()
stConvertParam.nBufferSize = nRGBSize
# ret = self.cam.MV_CC_ConvertPixelType(stConvertParam)
# print(stConvertParam.nImageLen)
ret = self.cam.MV_CC_SaveImageEx2(stConvertParam)
if ret != 0:
print ("convert pixel fail ! ret[0x%x]" % ret)
del self.data_buf
sys.exit()
file_path = "AfterConvert_RGB"+str(index)+".jpg"
file_open = open(file_path.encode('ascii'), 'wb+')
img_buff = (c_ubyte * stConvertParam.nImageLen)()
cdll.msvcrt.memcpy(byref(img_buff), stConvertParam.pImageBuffer, stConvertParam.nImageLen)
file_open.write(img_buff)
# print ("Save Image succeed!")
def exit_cam(self,):
# ch:停止取流 | en:Stop grab image
ret = self.cam.MV_CC_StopGrabbing()
if ret != 0:
print ("stop grabbing fail! ret[0x%x]" % ret)
del self.data_buf
sys.exit()
# ch:關閉裝置 | Close device
ret = self.cam.MV_CC_CloseDevice()
if ret != 0:
print ("close deivce fail! ret[0x%x]" % ret)
del self.data_buf
sys.exit()
# ch:銷燬控制代碼 | Destroy handle
ret = self.cam.MV_CC_DestroyHandle()
if ret != 0:
print ("destroy handle fail! ret[0x%x]" % ret)
del self.data_buf
sys.exit()
del self.data_buf
if __name__ == "__main__":
hhv = HHV()