Python??迪鄼C(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 圖像,如果是其他格式,請修改
# 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??迪鄼C(jī)api超簡單入坑指南的文章就介紹到這了,更多相關(guān)Python海康相機(jī)api內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python將PPT的幻燈片和形狀轉(zhuǎn)為多種圖片格式
這篇文章主要為大家詳細(xì)介紹了如何使用Python?將PPT幻燈片和形狀轉(zhuǎn)換為多種圖片格式,即JPG,?PNG,?BMP,?SVG,?TIFF,需要的可以參考下2025-02-02
Python3.7實(shí)現(xiàn)驗(yàn)證碼登錄方式代碼實(shí)例
這篇文章主要介紹了Python3.7實(shí)現(xiàn)驗(yàn)證碼登錄方式代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
python防止隨意修改類屬性的實(shí)現(xiàn)方法
這篇文章主要介紹了python防止隨意修改類屬性的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Python使用PyNmap進(jìn)行網(wǎng)絡(luò)掃描的詳細(xì)步驟
使用 PyNmap 進(jìn)行網(wǎng)絡(luò)掃描是一個(gè)非常有效的方式,PyNmap 是 Nmap 工具的一個(gè) Python 封裝,它允許你在 Python 腳本中使用 Nmap 的強(qiáng)大功能,本文介紹了如何使用 PyNmap 進(jìn)行網(wǎng)絡(luò)掃描的詳細(xì)步驟,需要的朋友可以參考下2024-08-08
python常用request庫與lxml庫操作方法整理總結(jié)
一路學(xué)習(xí),一路總結(jié),技術(shù)就是這樣,應(yīng)用之后,在進(jìn)行整理,才可以加深印象。本篇文字為小節(jié)篇,核心總結(jié) requests 庫與 lxml 庫常用的操作2021-08-08
Python使用wxPython構(gòu)建文件編輯器與預(yù)覽器的完整實(shí)現(xiàn)
本文介紹了使用Python的wxPython庫開發(fā)一個(gè)集成了編輯、保存和預(yù)覽功能的桌面應(yīng)用程序的過程,該應(yīng)用程序支持HTML和Markdown文件的編輯和預(yù)覽,具有輕量級(jí)、定制化的特性,適用于快速編輯和預(yù)覽文本文件,需要的朋友可以參考下2026-01-01
對python實(shí)時(shí)得到鼠標(biāo)位置的示例講解
今天小編就為大家分享一篇對python實(shí)時(shí)得到鼠標(biāo)位置的示例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10

