[testXJIG QR 코드 인식 고도화 #2-4] IDS 카메라 기반 QT 프로그램 죽는 문제 해결
2023. 7. 17. 20:56ㆍ프로젝트 로그/테스트x솔루션 JIG 개발기
반응형
IDS 카메라의 드라이버 혹은 Library가 살짝 불안하다고 느껴졌다. 프로그램이 동작하면서 이유 없이 QT(PySide2) 프로그램이 갑자기 종료되는 증상이 자주 발생 했다.
다행히 갑자기 종료 되는 증상을 재현 할 수 있는 케이스를 발견 하였으며, 카메라로 이미지 수신 후 QT(PySide2) 버튼 이벤트로 다른 화면을 왔다 갔다 전환하면 QT 프로그램이 아무런 로그 메시지 없이 죽는 현상이 재현되었다.
카메라로 영상을 수신하고, 이를 QT(PySide2)의 QGraphicsView로 출력하는 과정(on_image_recevie() 함수)에서 resetCachedContent() 함수를 불러 줌으로써 프로그램 죽는 문제가 줄어드는 것을 확인 하였다.
class CustomQGraphicsView(QGraphicsView):
def __init__(self, parent: QWidget = None):
super().__init__(parent)
self.__scene = CustomGraphicsScene(self)
self.setScene(self.__scene)
@Slot(QImage)
def on_image_received(self, image: QImage):
self.resetCachedContent()
self.__scene.set_image(image)
self.update()
class CustomGraphicsScene(QGraphicsScene):
def __init__(self, parent: CustomQGraphicsView = None):
super().__init__(parent)
self.__parent = parent
self.__image = QImage()
def set_image(self, image: QImage):
self.__image = image
self.update()
def drawBackground(self, painter: QPainter, rect: QRectF):
# Display size
display_width = self.__parent.width()
display_height = self.__parent.height()
# Image size
image_width = self.__image.width()
image_height = self.__image.height()
# Return if we don't have an image yet
if image_width == 0 or image_height == 0:
return
#print("Display Width : {0}, Display Height : {1}".format(display_width, display_height))
#print("Image Width : {0}, Image Height : {1}".format(image_width, image_height))
# # Calculate aspect ratio of display
# ratio1 = display_width / display_height
# # Calculate aspect ratio of image
# ratio2 = image_width / image_height
# # print("Ratio1 : {0}, Ratio2 : {1}".format(ratio1, ratio2))
# if ratio1 > ratio2:
# # The height with must fit to the display height.So h remains and w must be scaled down
# image_width = display_height * ratio2
# image_height = display_height
# else:
# # The image with must fit to the display width. So w remains and h must be scaled down
# image_width = display_width
# image_height = display_height / ratio2
# print("image_width : {0}".format(image_width))
# print("image_height : {0}".format(image_height))
image_width = display_width
image_height = display_height
image_pos_x = -1.0 * (image_width / 2.0)
image_pox_y = -1.0 * (image_height / 2.0)
# Remove digits after point
image_pos_x = math.trunc(image_pos_x)
image_pox_y = math.trunc(image_pox_y)
rect = QRectF(image_pos_x, image_pox_y, image_width, image_height)
painter.drawImage(rect, self.__image)
resetCachedContent() 역할
- 캐시된 콘텐츠를 재설정
- 이 함수를 호출하면 QGraphicsView의 캐시가 지워 짐
- 현재 캐시 모드가 CacheNone이면 이 함수는 아무 작업도 수행하지 않음
- 이 함수는 backgroundBrush 또는 backgroundBrush 속성이 변경될 때 자동으로 호출됨
- 사용자 정의 배경을 그리기 위해 drawBackground() 또는 drawBackground()를 다시 구현하고 전체 다시 그리기를 트리거 해야 하는 경우에만 이 함수를 호출 하면 됨
참고 자료
반응형
'프로젝트 로그 > 테스트x솔루션 JIG 개발기' 카테고리의 다른 글
[testXJIG QR 코드 인식 고도화 #3-2] 조명 제어 (0) | 2023.07.20 |
---|---|
[testXJIG QR 코드 인식 고도화 #3-1] QR 코드 인식을 위한 S/W 로직 (0) | 2023.07.18 |
[testXJIG QR 코드 인식 고도화 #2-3] uEye XC(U3-36L0XC) 카메라 환경 구축 (0) | 2023.07.14 |
[testXJIG QR 코드 인식 고도화 #2-2] uEye XC(U3-36L0XC) 카메라 환경 구축 (0) | 2023.07.13 |
[testXJIG QR 코드 인식 고도화 #2-1] uEye XC(U3-36L0XC) 카메라 사용 환경 구축 (0) | 2023.07.12 |