一、安装驱动程序和测试软件(IC Capture)
本文章记录在windows系统下如何使用python打开IMAGSOURCE工业相机,项目中使用的是DFK 33UX250型号相机,为USB3.0彩色工业相机。这个是它的官网介绍:https://www.theimagingsource.cn
在window下打开相机需要安装相应的驱动软件,并安装它的测试软件,如下图所示:
网页链接在这:https://www.theimagingsource.cn/%E6%94%AF%E6%8C%81/%E8%BD%AF%E4%BB%B6%E4%B8%8B%E8%BD%BD-windows/
这里驱动程序选择usb33u即可,测试程序可以下载IC capture软件,下载网页链接:https://www.theimagingsource.cn/%E4%BA%A7%E5%93%81/%E8%BD%AF%E4%BB%B6/%E7%BB%88%E7%AB%AF%E7%94%A8%E6%88%B7%E8%BD%AF%E4%BB%B6/
成功下载并安装后,将相机插到电脑的usb3.0的口,打开IC Capturer软件,观察是否能找寻到接入的设备,成功打开即可。
二、使用python程序打开多个33ux250相机
话不多说,官方在github上给出了示例程序,地址:https://github.com/TheImagingSource/IC-Imaging-Control-Samples
它包含c#,java等语言的示例程序,找到它的关于python的示例,如下图所示:
示例中给出了如何打开设备,枚举设备等等的方法。主要是利用tisgrabber.py文件,它去调用底层链接库,将sample中下图中的文件放在你的文件目录中即可调用。
以下是我参考我修改的程序后使用的代码,用于同时打开三个摄像头并显示它们的模型:
import cv2
import ctypes
import tisgrabber as tis
ic = ctypes.cdll.LoadLibrary("./tisgrabber_x64.dll")
tis.declareFunctions(ic)
class list_device(object):
def __init__(self):
ic.IC_InitLibrary(0)
self.devicecount = ic.IC_GetDeviceCount()
self.grabbers = []
self.name=[]
for i in range(0, self.devicecount):
print("Device {}".format(tis.D(ic.IC_GetDevice(i))))
self.uniquename = tis.D(ic.IC_GetUniqueNamefromList(i))
print("Unique Name : {}".format(self.uniquename))
self.g = ic.IC_CreateGrabber()
ic.IC_OpenDevByUniqueName(self.g, tis.T(self.uniquename))
self.name.append(self.uniquename)
self.grabbers.append(self.g)
print(self.name)
print(self.grabbers)
def select_device_demo(self,num):
grabber=self.grabbers[num]
if (ic.IC_IsDevValid(grabber)):
ic.IC_SetVideoFormat(grabber, tis.T("RGB32 (1216x1024)"))
ic.IC_SetFrameRate(grabber, ctypes.c_float(25.0)) # set FrameRate
ic.IC_StartLive(grabber, 1)
ic.IC_MsgBox(tis.T("Click OK to stop"), tis.T("Simple Live Video"))
ic.IC_StopLive(grabber)
else:
ic.IC_MsgBox(tis.T("No device opened"), tis.T("Simple Live Video"))
ic.IC_ReleaseGrabber(grabber)
def all_device_demo(self):
for grabber in self.grabbers:
if (ic.IC_IsDevValid(grabber)):
ic.IC_SetVideoFormat(grabber, tis.T("RGB32 (1216x1024)"))
ic.IC_SetFrameRate(grabber, ctypes.c_float(25.0)) # set FrameRate
ic.IC_StartLive(grabber, 1)
ic.IC_MsgBox(tis.T("Stop'em all!"), tis.T("Live Video"))
for grabber in self.grabbers:
if (ic.IC_IsDevValid(grabber)):
ic.IC_StopLive(grabber)
for grabber in self.grabbers:
if (ic.IC_IsDevValid(grabber)):
ic.IC_ReleaseGrabber(grabber)
# def eval_clarity(image):
# return cv2.Laplacian(image, cv2.CV_64F).var()
if __name__ == '__main__':
device=list_device()
#device.select_device_demo(2)#指定打开一台相机
device.all_device_demo()#打开所有连接的相机
#下面是我之前用opencv去打开相机,可以打开但相机显示图像会有问题,而且可设置的参数也少
#后来还是使用了官方给的sdk去打开相机,将下面代码删除即可。
# video_capture = cv2.VideoCapture(0)
# video_capture.set(3,960)
# video_capture.set(4,720)
# video_capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1279)
# video_capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1024)
# video_capture.set(cv2.CAP_PROP_FPS,50)
# while True:
# ret, image=video_capture.read()
# if ret is True:
# # image = cv2.resize(image,dsize=(2448,2048))
# clarity = eval_clarity(image)
# image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# cv2.putText(image, ("clarity = %1.1f" % (clarity)), (20, 50), cv2.FONT_HERSHEY_SIMPLEX,
# 0.5, 255, 1)
# cv2.imshow("camera", image)
# print(image.shape)
# #print(image.size)
# #print(image.shape[:2])
# if cv2.waitKey(30) & 0xFF==ord('q'):
# break
# video_capture.release()
# cv2.destroyAllWindows()
注意:同时打开多台相机需要考虑你的电脑usb接口是否有这么大的带宽,不能将一个usb3.0的接口直接连一个扩展接口出来。
这是官方的tisgrabber.py程序,也放在这里:
import ctypes
from enum import Enum
class SinkFormats(Enum):
Y800 = 0
RGB24 = 1
RGB32 = 2
UYVY = 3
Y16 = 4
class FRAMEFILTER_PARAM_TYPE(Enum):
eParamLong = 0
eParamBoolean = 1
eParamFloat = 2
eParamString = 3
eParamData = 4
ImageFileTypes = {'BMP': 0, 'JPEG': 1}
IC_SUCCESS = 1
IC_ERROR = 0
IC_NO_HANDLE = -1
IC_NO_DEVICE = -2
IC_NOT_AVAILABLE = -3
IC_NO_PROPERTYSET = -3
IC_DEFAULT_WINDOW_SIZE_SET = -3
IC_NOT_IN_LIVEMODE = -3
IC_PROPERTY_ITEM_NOT_AVAILABLE = -4
IC_PROPERTY_ELEMENT_NOT_AVAILABLE = -5
IC_PROPERTY_ELEMENT_WRONG_INTERFACE = -6
IC_INDEX_OUT_OF_RANGE = -7
IC_WRONG_XML_FORMAT = -1
IC_WRONG_INCOMPATIBLE_XML = -3
IC_NOT_ALL_PROPERTIES_RESTORED = -4
IC_DEVICE_NOT_FOUND = -5
IC_FILE_NOT_FOUND = 35
class HGRABBER(ctypes.Structure):
This class is used to handle the pointer to the internal
Grabber class, which contains the camera.
A pointer to this class is used by tisgrabber DLL.
_fields_ = [('unused', ctypes.c_int)]
class HCODEC(ctypes.Structure):
This class is used to handle the pointer to the internal
codec class for AVI capture
A pointer to this class is used by tisgrabber DLL.
_fields_ = [('unused', ctypes.c_int)]
class FILTERPARAMETER(ctypes.Structure):
This class implements the structure of a frame filter
parameter used by the HFRAMEFILTER class
_fields_ = [
('Name', ctypes.c_char*30),
('Type', ctypes.c_int)
class HFRAMEFILTER(ctypes.Structure):
This class implements the structure of a frame filter used
by the tisgrabber.dll.
_fields_ = [
('pFilter', ctypes.c_void_p),
('bHasDialog', ctypes.c_int),
('ParameterCount', ctypes.c_int),
('Parameters', ctypes.POINTER(FILTERPARAMETER))
def declareFunctions(ic):
Functions returning a HGRABBER Handle must set their restype to POINTER(HGRABBER)
:param ic: The loaded tisgrabber*.dll
ic.IC_ShowDeviceSelectionDialog.restype = ctypes.POINTER(HGRABBER)
ic.IC_ReleaseGrabber.argtypes = (ctypes.POINTER(ctypes.POINTER(HGRABBER)),)
ic.IC_LoadDeviceStateFromFile.restype = ctypes.POINTER(HGRABBER)
ic.IC_CreateGrabber.restype = ctypes.POINTER(HGRABBER)
ic.IC_GetPropertyValueRange.argtypes = (ctypes.POINTER(HGRABBER),
ctypes.c_char_p,
ctypes.c_char_p,
ctypes.POINTER(ctypes.c_long),
ctypes.POINTER(ctypes.c_long), )
ic.IC_GetPropertyValue.argtypes = (ctypes.POINTER(HGRABBER),
ctypes.c_char_p,
ctypes.c_char_p,
ctypes.POINTER(ctypes.c_long), )
ic.IC_GetPropertyAbsoluteValue.argtypes = (ctypes.POINTER(HGRABBER),
ctypes.c_char_p,
ctypes.c_char_p,
ctypes.POINTER(ctypes.c_float),)
ic.IC_GetPropertyAbsoluteValueRange.argtypes = (ctypes.POINTER(HGRABBER),
ctypes.c_char_p,
ctypes.c_char_p,
ctypes.POINTER(ctypes.c_float),
ctypes.POINTER(ctypes.c_float),)
ic.IC_GetPropertySwitch.argtypes = (ctypes.POINTER(HGRABBER),
ctypes.c_char_p,
ctypes.c_char_p,
ctypes.POINTER(ctypes.c_long), )
ic.IC_GetImageDescription.argtypes = (ctypes.POINTER(HGRABBER),
ctypes.POINTER(ctypes.c_long),
ctypes.POINTER(ctypes.c_long),
ctypes.POINTER(ctypes.c_int),
ctypes.POINTER(ctypes.c_int),)
ic.IC_GetImagePtr.restype = ctypes.c_void_p
ic.IC_SetHWnd.argtypes = (ctypes.POINTER(HGRABBER), ctypes.c_int)
# definition of the frameready callback
ic.FRAMEREADYCALLBACK = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.POINTER(HGRABBER), ctypes.POINTER(ctypes.c_ubyte), ctypes.c_ulong, ctypes.py_object)
ic.DEVICELOSTCALLBACK = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.POINTER(HGRABBER), ctypes.py_object)
ic.IC_SetFrameReadyCallback.argtypes = [ctypes.POINTER(HGRABBER), ic.FRAMEREADYCALLBACK, ctypes.py_object]
ic.IC_SetCallbacks.argtypes = [ctypes.POINTER(HGRABBER),
ic.FRAMEREADYCALLBACK,
ctypes.py_object,
ic.DEVICELOSTCALLBACK,
ctypes.py_object]
ic.IC_Codec_Create.restype = ctypes.POINTER(HCODEC)
ic.ENUMCODECCB = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p, ctypes.py_object)
ic.IC_enumCodecs.argtypes = (ic.ENUMCODECCB, ctypes.py_object)
ic.IC_GetDeviceName.restype = ctypes.c_char_p
ic.IC_GetDevice.restype = ctypes.c_char_p
ic.IC_GetUniqueNamefromList.restype = ctypes.c_char_p
ic.IC_CreateFrameFilter.argtypes = (ctypes.c_char_p, ctypes.POINTER(HFRAMEFILTER))
def T(instr):
''' Helper function
Encodes the input string to utf-8
:param instr: Python string to be converted
:return: converted string
return instr.encode("utf-8")
def D(instr):
''' Helper function
Decodes instr utf-8
:param instr: Python string to be converted
:return: converted string
return instr.decode('utf-8', 'ignore')
def openDevice(ic):
''' Helper functions
Open a camera. If a file with a device state exists, it will be used.
If not, the device selection dialog is shown and if a valid devices
was selected, the device state file is created.
:return: a HGRABBER
hGrabber = ic.IC_LoadDeviceStateFromFile(None, T("device.xml"))
if not ic.IC_IsDevValid(hGrabber):
hGrabber = ic.IC_ShowDeviceSelectionDialog(None)
except Exception as ex:
hGrabber = ic.IC_ShowDeviceSelectionDialog(None)
if(ic.IC_IsDevValid(hGrabber)):
ic.IC_SaveDeviceStateToFile(hGrabber, T("device.xml"))
return hGrabber
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
2022年4月1日
opencv 不支持旋转模板匹配详解
2022年3月18日
matlab进行拟合
2023年3月28日
基于Pytorch的Transform翻译模型前期数据处理方法
2022年5月13日
YOLO-V3-SPP 训练时正样本筛选源码解析之build_targets
2022年2月15日
【swinUnet官方代码测试自己的数据集(已训练完毕)】
2023年2月23日
主成分分析(PCA)算法模型实现及分析(MATLAB实现)PCA降维
2023年3月8日
无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
2023年3月6日
手把手教你win10下安装Anaconda
2023年2月25日
Anaconda3安装与配置教程(2022.11)
2023年2月26日
【Pytorch项目实战】之语义分割:U-Net、UNet++、U2Net
2023年2月23日
线性回归python实现详解(附公式推导)
2023年3月29日
tensorflow之session_options/ConfigProto
2022年5月19日
Python基于OpenCV的人脸表情识别系统[源码&部署教程]
2023年4月6日
Python中groupby函数详解(非常容易懂)
2023年3月10日
【已解决】安装cv2时Building wheel for opencv-python终端卡死
2023年3月8日