99 lines
4.0 KiB
Python
99 lines
4.0 KiB
Python
import configparser
|
|
|
|
from pypylon import pylon
|
|
from PyQt5.QtGui import QImage, QPixmap
|
|
from PyQt5.QtWidgets import QFileDialog, QApplication, QTableWidgetItem, QHeaderView, QHBoxLayout
|
|
import cv2
|
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
from PyQt5.QtCore import QThread, pyqtSignal, QObject
|
|
class Camera(QThread):
|
|
FreeRun = pyqtSignal()
|
|
def __init__(self):
|
|
super().__init__()
|
|
try:
|
|
self.ExposureTime_List = list()
|
|
self.GetExposureTime()
|
|
self.cam = self.search_get_device()
|
|
self.cam.Open()
|
|
# self.cam.Width = 5472
|
|
# self.cam.Height = 3648
|
|
self.cam.Width = 3400
|
|
self.cam.Height = 1852
|
|
self.Width = self.cam.Width.GetValue()
|
|
self.Height = self.cam.Height.GetValue()
|
|
# self.cam.OffsetX = 0#936
|
|
# self.cam.OffsetY = 0#542
|
|
self.cam.OffsetX = 936#936
|
|
self.cam.OffsetY = 542#886
|
|
self.cam.Gain = 14.95698
|
|
self.cam.StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
|
|
self.converter = pylon.ImageFormatConverter()
|
|
self.converter.OutputPixelFormat = pylon.PixelType_BGR8packed
|
|
self.converter.OutputBitAlignment = pylon.OutputBitAlignment_MsbAligned
|
|
|
|
|
|
self.Image_RealTime = []
|
|
self.Camera_isOpen = True
|
|
# self.Image_RealTime = cv2.imread(r"D:\ScrewdriverData\1201TranningSetAI\origin\2023_12_01_15_44_18.png", cv2.IMREAD_COLOR)
|
|
except Exception as e:
|
|
print('相機連線失敗')
|
|
print(e)
|
|
self.Camera_isOpen = False
|
|
|
|
def Recipe_Change(self, recipe):
|
|
config = configparser.ConfigParser()
|
|
config.read('ScrewDrive.ini')
|
|
number_list = config['Camera_Offset'][f'{recipe}'].split(',')
|
|
int_numbers = [int(number) for number in number_list]
|
|
self.cam.OffsetX = int_numbers[0] # 936
|
|
self.cam.OffsetY = int_numbers[1] # 886
|
|
print(f'Camera_Offset_Change--> {int_numbers}')
|
|
# if recipe == 'KleinTool':
|
|
# self.cam.ReverseX.SetValue(True)
|
|
|
|
|
|
def Get_CameraTemperature(self):
|
|
node_map = self.cam.GetNodeMap()
|
|
# 获取温度节点
|
|
temperature_node = node_map.GetNode('DeviceTemperature')
|
|
temperature = temperature_node.GetValue()
|
|
# print(f"Camera temperature: {temperature} °C")
|
|
return temperature
|
|
def run(self):
|
|
while self.cam.IsGrabbing():
|
|
grabResult = self.cam.RetrieveResult(5000, pylon.TimeoutHandling_ThrowException)
|
|
if grabResult.GrabSucceeded():
|
|
# Access the image data.
|
|
image = self.converter.Convert(grabResult)
|
|
self.Image_RealTime = image.GetArray()
|
|
self.FreeRun.emit()
|
|
grabResult.Release()
|
|
self.cam.Close()
|
|
def search_get_device(self):
|
|
tl_factory = pylon.TlFactory.GetInstance()
|
|
for dev_info in tl_factory.EnumerateDevices():
|
|
print("DeviceClass", dev_info.GetDeviceClass())
|
|
if dev_info.GetDeviceClass() == "BaslerUsb":
|
|
print(f"ModelName:{dev_info.GetModelName()}\n",f"IP:{dev_info.GetIpAddress()}")
|
|
camera = pylon.InstantCamera(tl_factory.CreateDevice(dev_info))
|
|
break
|
|
else:
|
|
raise EnvironmentError("no BaslerUsb device found")
|
|
return camera
|
|
|
|
def Grab(self):
|
|
grabResult = self.cam.RetrieveResult(5000, pylon.TimeoutHandling_ThrowException)
|
|
weld_img = []
|
|
if grabResult.GrabSucceeded():
|
|
image = self.converter.Convert(grabResult)
|
|
weld_img = image.GetArray()
|
|
return weld_img
|
|
|
|
def SetExposureTime(self, exposuretime):
|
|
self.cam.ExposureTime.SetValue(exposuretime) # 100000 microsecond
|
|
|
|
def GetExposureTime(self):
|
|
config = configparser.ConfigParser()
|
|
config.read('ScrewDrive.ini')
|
|
for key in config['ExposureTime']:
|
|
self.ExposureTime_List.append(config['ExposureTime'][key]) |