64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
|
|
# camera_capture.py
|
|||
|
|
import os
|
|||
|
|
from pypylon import pylon
|
|||
|
|
import cv2
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
|
|||
|
|
def search_get_device():
|
|||
|
|
"""搜索并返回 Basler GigE 相机对象"""
|
|||
|
|
tl_factory = pylon.TlFactory.GetInstance()
|
|||
|
|
for dev_info in tl_factory.EnumerateDevices():
|
|||
|
|
if dev_info.GetDeviceClass() == 'BaslerGigE':
|
|||
|
|
print(f"Found Basler GigE Camera: {dev_info.GetModelName()} IP: {dev_info.GetIpAddress()}")
|
|||
|
|
return pylon.InstantCamera(tl_factory.CreateDevice(dev_info))
|
|||
|
|
raise EnvironmentError("没有找到 Basler GigE 相机")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def grab_image(save=True):
|
|||
|
|
"""
|
|||
|
|
采集一张图像并返回 numpy ndarray(BGR)
|
|||
|
|
save=True 时自动保存 PNG 文件到 camera/ 文件夹
|
|||
|
|
"""
|
|||
|
|
# 创建保存目录
|
|||
|
|
save_dir = "camera"
|
|||
|
|
os.makedirs(save_dir, exist_ok=True)
|
|||
|
|
|
|||
|
|
cam = search_get_device()
|
|||
|
|
cam.Open()
|
|||
|
|
|
|||
|
|
# 设置图像转换器(BGR8 → OpenCV格式)
|
|||
|
|
converter = pylon.ImageFormatConverter()
|
|||
|
|
converter.OutputPixelFormat = pylon.PixelType_BGR8packed
|
|||
|
|
converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
|
|||
|
|
|
|||
|
|
cam.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
|
|||
|
|
|
|||
|
|
grabResult = cam.RetrieveResult(5000, pylon.TimeoutHandling_ThrowException)
|
|||
|
|
|
|||
|
|
if grabResult.GrabSucceeded():
|
|||
|
|
image = converter.Convert(grabResult)
|
|||
|
|
img = image.GetArray() # OpenCV 可处理的 ndarray
|
|||
|
|
print("成功采集图像:", img.shape)
|
|||
|
|
|
|||
|
|
# 保存 PNG
|
|||
|
|
if save:
|
|||
|
|
filename = os.path.join(save_dir, f"Image_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png")
|
|||
|
|
cv2.imwrite(filename, img)
|
|||
|
|
print("已保存:", filename)
|
|||
|
|
|
|||
|
|
else:
|
|||
|
|
print("采集失败:", grabResult.ErrorCode, grabResult.ErrorDescription)
|
|||
|
|
img = None
|
|||
|
|
|
|||
|
|
grabResult.Release()
|
|||
|
|
cam.Close()
|
|||
|
|
return img
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
img = grab_image(save=True)
|
|||
|
|
if img is not None:
|
|||
|
|
print("图像类型:", type(img))
|
|||
|
|
print("图像尺寸:", img.shape)
|