def Work_thread(self):
# ch:创建显示的窗口 | en:Create the window for display
cv2.namedWindow(str(self.n_win_gui_id),0)
cv2.resizeWindow(str(self.n_win_gui_id), 500, 500)
stFrameInfo = MV_FRAME_OUT_INFO_EX()
img_buff = None
while True:
ret = self.obj_cam.MV_CC_GetOneFrameTimeout(byref(self.buf_cache), self.n_payload_size, stFrameInfo, 1000)
if ret == 0:
#获取到图像的时间开始节点获取到图像的时间开始节点
self.st_frame_info = stFrameInfo
print ("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (self.st_frame_info.nWidth, self.st_frame_info.nHeight, self.st_frame_info.nFrameNum))
self.n_save_image_size = self.st_frame_info.nWidth * self.st_frame_info.nHeight * 3 + 2048
if img_buff is None:
img_buff = (c_ubyte * self.n_save_image_size)()
if True == self.b_save_jpg:
self.Save_jpg() #ch:保存Jpg图片 | en:Save Jpg
if self.buf_save_image is None:
self.buf_save_image = (c_ubyte * self.n_save_image_size)()
stParam = MV_SAVE_IMAGE_PARAM_EX()
stParam.enImageType = MV_Image_Bmp; # ch:需要保存的图像类型 | en:Image format to save
stParam.enPixelType = self.st_frame_info.enPixelType # ch:相机对应的像素格式 | en:Camera pixel type
stParam.nWidth = self.st_frame_info.nWidth # ch:相机对应的宽 | en:Width
stParam.nHeight = self.st_frame_info.nHeight # ch:相机对应的高 | en:Height
stParam.nDataLen = self.st_frame_info.nFrameLen
stParam.pData = cast(self.buf_cache, POINTER(c_ubyte))
stParam.pImageBuffer = cast(byref(self.buf_save_image), POINTER(c_ubyte))
stParam.nBufferSize = self.n_save_image_size # ch:存储节点的大小 | en:Buffer node size
stParam.nJpgQuality = 80; # ch:jpg编码,仅在保存Jpg图像时有效。保存BMP时SDK内忽略该参数
if True == self.b_save_bmp:
self.Save_Bmp() #ch:保存Bmp图片 | en:Save Bmp
else:
continue
#转换像素结构体赋值
stConvertParam = MV_CC_PIXEL_CONVERT_PARAM()
memset(byref(stConvertParam), 0, sizeof(stConvertParam))
stConvertParam.nWidth = self.st_frame_info.nWidth
stConvertParam.nHeight = self.st_frame_info.nHeight
stConvertParam.pSrcData = self.buf_cache
stConvertParam.nSrcDataLen = self.st_frame_info.nFrameLen
stConvertParam.enSrcPixelType = self.st_frame_info.enPixelType
# Mono8直接显示
if PixelType_Gvsp_Mono8 == self.st_frame_info.enPixelType:
numArray = CameraOperation.Mono_numpy(self,self.buf_cache,self.st_frame_info.nWidth,self.st_frame_info.nHeight)
# RGB直接显示
elif PixelType_Gvsp_RGB8_Packed == self.st_frame_info.enPixelType:
numArray = CameraOperation.Color_numpy(self,self.buf_cache,self.st_frame_info.nWidth,self.st_frame_info.nHeight)
#如果是黑白且非Mono8则转为Mono8
elif True == self.Is_mono_data(self.st_frame_info.enPixelType):
nConvertSize = self.st_frame_info.nWidth * self.st_frame_info.nHeight
stConvertParam.enDstPixelType = PixelType_Gvsp_Mono8
stConvertParam.pDstBuffer = (c_ubyte * nConvertSize)()
stConvertParam.nDstBufferSize = nConvertSize
ret = self.obj_cam.MV_CC_ConvertPixelType(stConvertParam)
if ret != 0:
tkinter.messagebox.showerror('show error','convert pixel fail! ret = '+self.To_hex_str(ret))
continue
cdll.msvcrt.memcpy(byref(img_buff), stConvertParam.pDstBuffer, nConvertSize)
numArray = CameraOperation.Mono_numpy(self,img_buff,self.st_frame_info.nWidth,self.st_frame_info.nHeight)
#如果是彩色且非RGB则转为RGB后显示
elif True == self.Is_color_data(self.st_frame_info.enPixelType):
nConvertSize = self.st_frame_info.nWidth * self.st_frame_info.nHeight * 3
stConvertParam.enDstPixelType = PixelType_Gvsp_RGB8_Packed
stConvertParam.pDstBuffer = (c_ubyte * nConvertSize)()
stConvertParam.nDstBufferSize = nConvertSize
ret = self.obj_cam.MV_CC_ConvertPixelType(stConvertParam)
if ret != 0:
tkinter.messagebox.showerror('show error','convert pixel fail! ret = '+self.To_hex_str(ret))
continue
cdll.msvcrt.memcpy(byref(img_buff), stConvertParam.pDstBuffer, nConvertSize)
numArray = CameraOperation.Color_numpy(self,img_buff,self.st_frame_info.nWidth,self.st_frame_info.nHeight)
cv2.resizeWindow(str(self.n_win_gui_id), 500, 500)
cv2.imshow(str(self.n_win_gui_id),numArray)
cv2.waitKey(1)
if self.b_exit == True:
cv2.destroyAllWindows()
if img_buff is not None:
del img_buff
if self.buf_cache is not None:
del buf_cache
break