1. 程式人生 > 其它 >海康工業相機Python呼叫實現連續實時拍照

海康工業相機Python呼叫實現連續實時拍照

技術標籤:傳統視覺機器視覺影象識別海康工業相機MVS

海康工業相機Python呼叫實現連續實時拍照

文章目錄

前言:

海康的相機呼叫簡直太複雜了。當然相比point gray fly的相機無法python呼叫要好很多。
為了將照片呼叫打包成類,我竟然花了兩天時間?
這裡做一個簡單的記錄。希望能給大夥兒一個分享。

參考連結:

海康工業相機Python呼叫實現拍照
通過python呼叫海康威視工業攝像頭並進行影象儲存(資料流獲取問題未能解決)

提前設定:

  1. 先安裝MVS,下載地址
  2. 條件:Python+海康官方的mvs檔案下的development/samples下的python資料夾
  3. 注意:相機連線後不要用官方app開啟相機,不然python程式碼檢測不到裝置,程式碼在pycharm會提示報錯,親測能跑並能擷取到圖片
  4. 需要新增模組MvImport的路徑:
    這是整個程式碼的核心,檔案裡面內容如下,具體可以下載MVS裡面例程裡面有:
import sys
sys.path.append("C:\Program Files (x86)\MVS\Development\Samples\Python\MvImport")

在這裡插入圖片描述

圖片資料流的獲取:

save_image2local函式部分,主要是將C程式給過來的資料流進行了一個轉換,仔細看儲存的路徑不難看出,img_buff就是我們想要的影象資料流。

但是我把它print出來的時候它仍然是一個C*ubyte的資料型別,所以沒法直接用python-opencv進行直接讀取,即不能直接轉成numpy array的形式。
只能先將其儲存下來然後再通過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()