Python海康相機(jī)api超簡單入坑指南(學(xué)習(xí)必看)
1.準(zhǔn)備工作
??倒倬W(wǎng)下載相機(jī)驅(qū)動(dòng)??禉C(jī)器人-機(jī)器視覺-下載中心
安裝好以后找到Python的開發(fā)文件目錄參考:D:\MVS\MVS\Development\Samples\Python\MvImport這幾個(gè)文件很重要,想調(diào)用??迪鄼C(jī)取圖會(huì)用到.
為了寫代碼方便可以把這幾個(gè)文件拷貝一下,跟你的api主文件放在同一個(gè)文件夾下可以減少80%的煩惱.
2.打開相機(jī)
1.枚舉設(shè)備
我這里枚舉了兩種設(shè)備USB和網(wǎng)口:
2.實(shí)例化相機(jī)
好多剛?cè)肟拥娜藭?huì)忽略這一步
3.選擇相機(jī)
這里選擇用編號(hào)來連接相機(jī),后邊更深入學(xué)習(xí)后可改用ip鏈接相機(jī),我電腦就插入了一個(gè)??档木W(wǎng)口相機(jī),所以int(0)直接寫0就好了
4.設(shè)置觸發(fā)方式
因?yàn)楹?迪鄼C(jī)觸發(fā)方式有可能是on,off才可以打開相機(jī),所以為了避免新手遇到一堆報(bào)錯(cuò),這里直接代碼設(shè)置觸發(fā)方式為off,(也可以通過mvs把相機(jī)觸發(fā)方式設(shè)置為off).
5.打開相機(jī)
連接相機(jī)
6.開始取流
到取流這一步可以想象成已經(jīng)打開了相機(jī)實(shí)時(shí)取圖這一步
3.獲取一張圖像
獲取一張圖像數(shù)據(jù)
4.關(guān)閉相機(jī)
停止取流---關(guān)閉設(shè)備---銷毀句柄
5.完整代碼
把最后注釋掉的代碼釋放掉運(yùn)行,就可以看到你相機(jī)拍攝的圖片了
from.MvCameraControl_class import * # from.CameraParams_header import * from ctypes import * import time import cv2 import numpy as np # sys.path.append("./Become a master in a hundred days/CAMapi") class CameraManager: def __init__(self): self.cam = None self.data_buf = None self.device_status = False self.stOutFrame = None def data_camera(self): # 枚舉設(shè)備 tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE deviceList = MV_CC_DEVICE_INFO_LIST() # 實(shí)例相機(jī) self.cam = MvCamera() ret = self.cam.MV_CC_EnumDevices(tlayerType, deviceList) if ret is None: print("錯(cuò)誤") return else: print(ret) # 選擇設(shè)備 stDeviceList = cast(deviceList.pDeviceInfo[int(0)], POINTER(MV_CC_DEVICE_INFO)).contents # 創(chuàng)建句柄 ret = self.cam.MV_CC_CreateHandleWithoutLog(stDeviceList) # start_time = time.time() # 獲取設(shè)備名稱,返回是一個(gè)內(nèi)存地址,循環(huán)遍歷用chr把每個(gè)字符碼轉(zhuǎn)換為字符 # strModeName = "" # for per in stDeviceList.SpecialInfo.stGigEInfo.chModelName: # strModeName = strModeName + chr(per) # print(f"device model name:{strModeName}") # 獲取設(shè)備名稱,ctypes.string_at 函數(shù)直接將內(nèi)存地址中的內(nèi)容讀取為字節(jié)字符串,然后使用 decode('utf-8') 進(jìn)行解碼。 strModeName = ctypes.string_at(stDeviceList.SpecialInfo.stGigEInfo.chModelName).decode('utf-8') print(f"設(shè)備名稱:{strModeName}") # end_time = time.time() # camera_time = round(abs(start_time - end_time) * 1000, 3) # 保留小數(shù)點(diǎn)后3為,拍照時(shí)間 # print(f"獲取設(shè)備名稱時(shí)間:{camera_time}ms") # 設(shè)置觸發(fā)方式 ret = self.cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF) # 打開相機(jī) ret = self.cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0) print("打開相機(jī)執(zhí)行碼:[0x%x]" % ret) # 開始取流 ret = self.cam.MV_CC_StartGrabbing() self.device_status = True return self.cam def get_image(self): # 獲取一張圖像 self.stOutFrame = MV_FRAME_OUT() # 圖像結(jié)構(gòu)體,輸出圖像地址&信息 start_time = time.time() ret = self.cam.MV_CC_GetImageBuffer(self.stOutFrame, 300) # 圖像獲取函數(shù) print("圖像獲取執(zhí)行碼:[0x%x]" % ret) end_time = time.time() camera_time = round(abs(start_time - end_time) * 1000, 3) # 保留小數(shù)點(diǎn)后3為,拍照時(shí)間 print(f"獲取圖像時(shí)間:{camera_time}ms") # 獲取圖像數(shù)據(jù)的長度和指針 nPayloadSize = self.stOutFrame.stFrameInfo.nFrameLen pData = self.stOutFrame.pBufAddr # 將數(shù)據(jù)存儲(chǔ)在 data_buf 中 self.data_buf = (c_ubyte * nPayloadSize)() cdll.msvcrt.memcpy(byref(self.data_buf), pData, nPayloadSize) end_time = time.time() camera_time = round(abs(start_time - end_time) * 1000, 3) # 保留小數(shù)點(diǎn)后3為,拍照時(shí)間 print(f"獲取圖像儲(chǔ)存時(shí)間:{camera_time}ms") #釋放圖像緩存 self.cam.MV_CC_FreeImageBuffer(self.stOutFrame) return self.data_buf def off_camera(self): # 停止取流 ret = self.cam.MV_CC_StopGrabbing() print("停止取流執(zhí)行碼:[0x%x]" % ret) # 關(guān)閉設(shè)備 ret = self.cam.MV_CC_CloseDevice() print("關(guān)閉設(shè)備執(zhí)行碼:[0x%x]" % ret) # 銷毀句柄 ret = self.cam.MV_CC_DestroyHandle() print("銷毀句柄執(zhí)行碼:[0x%x]" % ret) self.device_status = False return self.device_status # #實(shí)例化類 # CAM = CameraManager() # deta_CAM = input("輸入1鏈接相機(jī):") # if deta_CAM == "1": # CAM.data_camera() # print(f"當(dāng)前相機(jī)鏈接狀態(tài):{CAM.device_status}") # else: # print("鏈接相機(jī)錯(cuò)誤!") # deta_CAM = input("輸入2獲取圖片:") # if deta_CAM == "2": # CAM.get_image() # print(f"當(dāng)前相機(jī)鏈接狀態(tài):{CAM.device_status}獲取圖片!") # else: # print("獲取圖片錯(cuò)誤!") # # 將 c_ubyte 數(shù)組轉(zhuǎn)換為 numpy 數(shù)組 # temp = np.frombuffer(CAM.data_buf, dtype=np.uint8) # # 檢查圖像的分辨率信息,假設(shè)它是 2048x1024x3 # # 但首先需要確認(rèn)圖像的真實(shí)分辨率和像素格式,這里假設(shè)為 RGB 格式 # # 你可能需要根據(jù)實(shí)際情況調(diào)整 reshape 的參數(shù) # # 使用正確的分辨率信息進(jìn)行重塑 # width = CAM.stOutFrame.stFrameInfo.nWidth # height = CAM.stOutFrame.stFrameInfo.nHeight # channels = 3 # 假設(shè)是 RGB 圖像,如果是其他格式,請(qǐng)修改 # print(width) # print(height) # try: # temp = temp.reshape((height, width, channels)) # except Exception as e: # print(f"Reshape error: {e}") # # 將 BGR 轉(zhuǎn)換為 RGB # temp = cv2.cvtColor(temp, cv2.COLOR_RGB2BGR) # # 轉(zhuǎn)換為灰度圖像 # gray = cv2.cvtColor(temp, cv2.COLOR_RGB2GRAY) # # 顯示圖像 # cv2.namedWindow("ori", cv2.WINDOW_NORMAL) # cv2.imshow("ori", temp) # # 顯示灰度圖像 # cv2.namedWindow("gray", cv2.WINDOW_NORMAL) # cv2.imshow("gray", gray) # cv2.waitKey(0) # deta_CAM = input("輸入3關(guān)閉相機(jī)設(shè)備:") # if deta_CAM == "3": # CAM.off_camera() # print(f"當(dāng)前相機(jī)鏈接狀態(tài):{CAM.device_status}") # else: # print("關(guān)閉相機(jī)錯(cuò)誤!")
總結(jié)
到此這篇關(guān)于Python海康相機(jī)api超簡單入坑指南的文章就介紹到這了,更多相關(guān)Python??迪鄼C(jī)api內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Python?Tkinter?復(fù)選框?->Checkbutton
這篇文章主要介紹了關(guān)于Python?Tkinter復(fù)選框Checkbutton,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Python PyQt5實(shí)戰(zhàn)項(xiàng)目之文件拷貝器的具體實(shí)現(xiàn)詳解
PyQt5以一套Python模塊的形式來實(shí)現(xiàn)功能。它包含了超過620個(gè)類,600個(gè)方法和函數(shù)。本篇文章手把手帶你用PyQt5實(shí)現(xiàn)一個(gè)簡單的文件拷貝器,大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11pycharm中:OSError:[WinError?1455]頁面文件太小無法完成操作問題的多種解決方法
這篇文章主要給大家介紹了關(guān)于pycharm中:OSError:[WinError?1455]頁面文件太小無法完成操作問題的多種徹底解決方法,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02對(duì)python 矩陣轉(zhuǎn)置transpose的實(shí)例講解
下面小編就為大家分享一篇對(duì)python 矩陣轉(zhuǎn)置transpose的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04