163 lines
6.1 KiB
Python
163 lines
6.1 KiB
Python
from tokenize import String
|
||
from typing import Optional
|
||
import numpy as np
|
||
from PySide6.QtCore import Signal, QObject
|
||
import threading
|
||
import ctypes
|
||
import time
|
||
import cv2
|
||
import os
|
||
import datetime
|
||
from .Mv3dRgbdImport.Mv3dRgbdApi import *
|
||
from .Mv3dRgbdImport.Mv3dRgbdDefine import *
|
||
from .Mv3dRgbdImport.Mv3dRgbdDefine import DeviceType_Ethernet, DeviceType_USB, MV3D_RGBD_FLOAT_EXPOSURETIME, \
|
||
ParamType_Enum, ParamType_Int, CoordinateType_Depth, MV3D_RGBD_FLOAT_Z_UNIT, MV3D_RGBD_OK, \
|
||
FileType_BMP,ImageType_Depth, ImageType_RGB8_Planar, ImageType_YUV420SP_NV12 ,ImageType_YUV420SP_NV21 , ImageType_YUV422, ImageType_Mono8
|
||
|
||
|
||
class CameraImg(QObject):
|
||
"""
|
||
海康相机SDK图像获取类
|
||
"""
|
||
# camera_image_finish = Signal(str) # 原有信号,传递文件路径
|
||
# stream_image_data = Signal(np.ndarray) # 新信号,直接传递图像数据
|
||
|
||
def __init__(self):
|
||
super().__init__()
|
||
self.camera:Optional[Mv3dRgbd]=None
|
||
self.running=False
|
||
self.fetchimg=False
|
||
# self._feeding=feeding
|
||
# 连接信号到启动保存线程的方法,而不是直接连接到save_frame_path
|
||
# self._feeding.take_photo_sigal.connect(self._set_fetch)
|
||
pass
|
||
|
||
def _set_fetch(self):
|
||
"""设置保存图片
|
||
Args:
|
||
value (bool): 暂停状态
|
||
"""
|
||
self.fetchimg=True
|
||
|
||
def _camera_info(self)->Optional[MV3D_RGBD_DEVICE_INFO_LIST]:
|
||
"""获取相机信息
|
||
Returns:
|
||
Optional[MV3D_RGBD_DEVICE_INFO_LIST]: 相机信息列表
|
||
"""
|
||
_nDeviceNum=ctypes.c_uint(0)
|
||
_nDeviceNum_p=byref(_nDeviceNum)
|
||
# ch:获取设备数量 | en:Get device number
|
||
ret=Mv3dRgbd.MV3D_RGBD_GetDeviceNumber(DeviceType_Ethernet | DeviceType_USB, _nDeviceNum_p)
|
||
if ret!=0:
|
||
return None
|
||
if _nDeviceNum==0:
|
||
print("find no device!")
|
||
return None
|
||
stDeviceList = MV3D_RGBD_DEVICE_INFO_LIST()
|
||
ret = Mv3dRgbd.MV3D_RGBD_GetDeviceList(DeviceType_Ethernet | DeviceType_USB, pointer(stDeviceList.DeviceInfo[0]), 2, _nDeviceNum_p)
|
||
if ret != 0:
|
||
return None
|
||
return stDeviceList
|
||
|
||
def open_camera(self)->bool:
|
||
"""打开相机
|
||
Returns:
|
||
bool: 是否成功
|
||
"""
|
||
if self.camera is not None:
|
||
return True
|
||
_stDeviceInfo=self._camera_info()
|
||
if _stDeviceInfo is None:
|
||
return False
|
||
_stDeviceInfo=_stDeviceInfo.DeviceInfo[0]
|
||
# ch:创建相机示例 | en:Create a camera instance
|
||
camera=Mv3dRgbd()
|
||
# ch:打开设备 | en:Open device
|
||
ret=camera.MV3D_RGBD_OpenDevice(pointer(_stDeviceInfo))
|
||
if ret!=0:
|
||
print ("MV3D_RGBD_OpenDevice fail! ret[0x%x]" % ret)
|
||
return False
|
||
|
||
# ch:开始取流 | en:Start grabbing
|
||
ret=camera.MV3D_RGBD_Start()
|
||
if ret != 0:
|
||
print ("start fail! ret[0x%x]" % ret)
|
||
camera.MV3D_RGBD_CloseDevice()
|
||
return False
|
||
self.camera=camera
|
||
return True
|
||
|
||
def close_camera(self):
|
||
"""关闭相机
|
||
"""
|
||
if self.camera is not None:
|
||
self.camera.MV3D_RGBD_CloseDevice()
|
||
self.camera=None
|
||
|
||
def save_frame_path(self):
|
||
"""保存当前帧并返回路径(内部实现,由线程调用)
|
||
Returns:
|
||
Optional[str]: 保存的文件名
|
||
"""
|
||
try:
|
||
if self.camera is None:
|
||
#打开相机
|
||
if not self.open_camera():
|
||
return None
|
||
stFrameData=MV3D_RGBD_FRAME_DATA()
|
||
# ch:获取图像数据 | en:Get image data
|
||
ret=self.camera.MV3D_RGBD_FetchFrame(pointer(stFrameData), 5000)
|
||
_now=datetime.datetime.now()
|
||
# 创建日期格式文件夹
|
||
_current_date = _now.strftime('%Y-%m-%d')
|
||
if not os.path.exists(_current_date):
|
||
os.makedirs(_current_date)
|
||
|
||
if MV3D_RGBD_OK == ret:
|
||
print("MV3D_RGBD_FetchFrame success.")
|
||
for i in range(0, stFrameData.nImageCount):
|
||
if ImageType_RGB8_Planar == stFrameData.stImageData[i].enImageType or ImageType_YUV420SP_NV12 == stFrameData.stImageData[i].enImageType or ImageType_YUV420SP_NV21 == stFrameData.stImageData[i].enImageType or ImageType_YUV422 == stFrameData.stImageData[i].enImageType:
|
||
try:
|
||
_current_time = _now.strftime('%H%M%S')
|
||
_chColorFileName = os.path.join(_current_date, f"{_current_time}_1")
|
||
ret = self.camera.MV3D_RGBD_SaveImage(pointer(stFrameData.stImageData[i]), FileType_BMP, _chColorFileName)
|
||
|
||
if MV3D_RGBD_OK == ret:
|
||
print(f"Save color image success: {_chColorFileName}")
|
||
# self.camera_image_finish.emit(f"{_chColorFileName}.bmp")
|
||
return _chColorFileName
|
||
else:
|
||
print("保存图片失败.")
|
||
except Exception as e:
|
||
print(f"保存图片异常: {e}")
|
||
return None
|
||
else:
|
||
print("相机拍照失败!")
|
||
return None
|
||
except Exception as e:
|
||
print(f"保存图片异常: {e}")
|
||
return None
|
||
|
||
def stop(self):
|
||
self.running=False
|
||
self.fetchimg=False
|
||
|
||
# def run(self):
|
||
# """线程运行方法,用于保存当前帧
|
||
# """
|
||
# while self.running:
|
||
# if self.fetchimg:
|
||
# self.fetchimg=False
|
||
# self.update_camera_image.emit(r"Image\032446.bmp")
|
||
# # self.save_frame_path()
|
||
# time.sleep(5)
|
||
|
||
def __del__(self):
|
||
"""关闭
|
||
"""
|
||
self.close_camera()
|
||
|
||
|
||
if __name__ == '__main__':
|
||
camera_img=CameraImg()
|
||
camera_img.save_frame_path() |