Python??迪鄼Capi超簡單入坑指南(學習必看)
1.準備工作
??倒倬W(wǎng)下載相機驅(qū)動??禉C器人-機器視覺-下載中心

安裝好以后找到Python的開發(fā)文件目錄參考:D:\MVS\MVS\Development\Samples\Python\MvImport這幾個文件很重要,想調(diào)用??迪鄼C取圖會用到.

為了寫代碼方便可以把這幾個文件拷貝一下,跟你的api主文件放在同一個文件夾下可以減少80%的煩惱.

2.打開相機
1.枚舉設備
我這里枚舉了兩種設備USB和網(wǎng)口:

2.實例化相機
好多剛?cè)肟拥娜藭雎赃@一步

3.選擇相機
這里選擇用編號來連接相機,后邊更深入學習后可改用ip鏈接相機,我電腦就插入了一個海康的網(wǎng)口相機,所以int(0)直接寫0就好了

4.設置觸發(fā)方式
因為海康相機觸發(fā)方式有可能是on,off才可以打開相機,所以為了避免新手遇到一堆報錯,這里直接代碼設置觸發(fā)方式為off,(也可以通過mvs把相機觸發(fā)方式設置為off).

5.打開相機
連接相機

6.開始取流
到取流這一步可以想象成已經(jīng)打開了相機實時取圖這一步

3.獲取一張圖像
獲取一張圖像數(shù)據(jù)

4.關閉相機
停止取流---關閉設備---銷毀句柄

5.完整代碼
把最后注釋掉的代碼釋放掉運行,就可以看到你相機拍攝的圖片了
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):
# 枚舉設備
tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
deviceList = MV_CC_DEVICE_INFO_LIST()
# 實例相機
self.cam = MvCamera()
ret = self.cam.MV_CC_EnumDevices(tlayerType, deviceList)
if ret is None:
print("錯誤")
return
else:
print(ret)
# 選擇設備
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()
# 獲取設備名稱,返回是一個內(nèi)存地址,循環(huán)遍歷用chr把每個字符碼轉(zhuǎn)換為字符
# strModeName = ""
# for per in stDeviceList.SpecialInfo.stGigEInfo.chModelName:
# strModeName = strModeName + chr(per)
# print(f"device model name:{strModeName}")
# 獲取設備名稱,ctypes.string_at 函數(shù)直接將內(nèi)存地址中的內(nèi)容讀取為字節(jié)字符串,然后使用 decode('utf-8') 進行解碼。
strModeName = ctypes.string_at(stDeviceList.SpecialInfo.stGigEInfo.chModelName).decode('utf-8')
print(f"設備名稱:{strModeName}")
# end_time = time.time()
# camera_time = round(abs(start_time - end_time) * 1000, 3) # 保留小數(shù)點后3為,拍照時間
# print(f"獲取設備名稱時間:{camera_time}ms")
# 設置觸發(fā)方式
ret = self.cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
# 打開相機
ret = self.cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
print("打開相機執(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ù)點后3為,拍照時間
print(f"獲取圖像時間:{camera_time}ms")
# 獲取圖像數(shù)據(jù)的長度和指針
nPayloadSize = self.stOutFrame.stFrameInfo.nFrameLen
pData = self.stOutFrame.pBufAddr
# 將數(shù)據(jù)存儲在 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ù)點后3為,拍照時間
print(f"獲取圖像儲存時間:{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)
# 關閉設備
ret = self.cam.MV_CC_CloseDevice()
print("關閉設備執(zhí)行碼:[0x%x]" % ret)
# 銷毀句柄
ret = self.cam.MV_CC_DestroyHandle()
print("銷毀句柄執(zhí)行碼:[0x%x]" % ret)
self.device_status = False
return self.device_status
# #實例化類
# CAM = CameraManager()
# deta_CAM = input("輸入1鏈接相機:")
# if deta_CAM == "1":
# CAM.data_camera()
# print(f"當前相機鏈接狀態(tài):{CAM.device_status}")
# else:
# print("鏈接相機錯誤!")
# deta_CAM = input("輸入2獲取圖片:")
# if deta_CAM == "2":
# CAM.get_image()
# print(f"當前相機鏈接狀態(tài):{CAM.device_status}獲取圖片!")
# else:
# print("獲取圖片錯誤!")
# # 將 c_ubyte 數(shù)組轉(zhuǎn)換為 numpy 數(shù)組
# temp = np.frombuffer(CAM.data_buf, dtype=np.uint8)
# # 檢查圖像的分辨率信息,假設它是 2048x1024x3
# # 但首先需要確認圖像的真實分辨率和像素格式,這里假設為 RGB 格式
# # 你可能需要根據(jù)實際情況調(diào)整 reshape 的參數(shù)
# # 使用正確的分辨率信息進行重塑
# width = CAM.stOutFrame.stFrameInfo.nWidth
# height = CAM.stOutFrame.stFrameInfo.nHeight
# channels = 3 # 假設是 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關閉相機設備:")
# if deta_CAM == "3":
# CAM.off_camera()
# print(f"當前相機鏈接狀態(tài):{CAM.device_status}")
# else:
# print("關閉相機錯誤!")總結(jié)
到此這篇關于Python海康相機api超簡單入坑指南的文章就介紹到這了,更多相關Python??迪鄼Capi內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于Python?Tkinter?復選框?->Checkbutton
這篇文章主要介紹了關于Python?Tkinter復選框Checkbutton,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
Python PyQt5實戰(zhàn)項目之文件拷貝器的具體實現(xiàn)詳解
PyQt5以一套Python模塊的形式來實現(xiàn)功能。它包含了超過620個類,600個方法和函數(shù)。本篇文章手把手帶你用PyQt5實現(xiàn)一個簡單的文件拷貝器,大家可以在過程中查缺補漏,提升水平2021-11-11
pycharm中:OSError:[WinError?1455]頁面文件太小無法完成操作問題的多種解決方法
這篇文章主要給大家介紹了關于pycharm中:OSError:[WinError?1455]頁面文件太小無法完成操作問題的多種徹底解決方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-02-02
對python 矩陣轉(zhuǎn)置transpose的實例講解
下面小編就為大家分享一篇對python 矩陣轉(zhuǎn)置transpose的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

