[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()를 다시 구현하고 전체 다시 그리기를 트리거 해야 하는 경우에만 이 함수를 호출 하면 됨

참고 자료

https://wikidocs.net/164461

반응형