ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Qt] GUI with Qt : Visualization
    임베디드/Qt for python 2024. 5. 13. 06:10

     

    그래프 그리기 with matplotlib

     

    import matplotlib.pyplot as plt

     

     show() : 그래프 그린 뒤 show() 를 해야 출력된다.

     

    ▶ plot(xvalues, yvalues) : 꺾은선 그래프 그리기

     

     

    Qt + Matplotlib

     

    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg

    •  matplotlib 에서 지원하는 Qt 포팅용 패키지

     

     

     

     

    그래프 생성 - 방법1

    pyplot.Figure() : 그래프 정보를 담고 있는 객체생성

     

    FigureCanvasQTAgg(pyplot.Figure객체) : 그래프를 Qt에 출력하는 Widget 객체 생성

    • 인자로 Qt에 출력하고자 하는 figure 객체를 전달한다.
    • CanvasQTAgg 객체.draw() : plot후에, 완성된 그래프를 canvas에 그리기 위해 호출함.
      => figure객체에 add된 그래프들이 현재 설정 값에 따라 다시 그려짐

    ▶ figure 객체.add_subplot() : 다단 그래프용 그래프 생성하고 반환 => 반환된 그래프를 원하는 형태로 plot한다.

    • [그래프 종류]
      • 그래프.plot( xvalue, yvalues, linestye="종류", marker="종류" ) : 꺾은 선 그래프 그리기
      • 그래프 .legend(범례list) : 범례 추가 (plot 순서대로 범례 정해짐)
      • 그래프.bar(xvalue, yvalues: 막대 그래프 그리기
      • 그래프.scatter(xvalue, yvalues) : 점 그래프 그리기

     

    💡방법1은 pyplot.Figure() & add_subplot()함수를 각각 이용해 객체 생성 + 그래프 생성을 각각 해준다면,

    방법2는 subplots()함수를 이용해 객체 생성 + 그래프 생성을 한 번에 함

     

     

    그래프 생성 - 방법2

     

    plt.subplots(nrowsncols, figsize=(width, height), sharex=T/F, sharey=T/F )

    • 입력값
      • nrows: 생성할 서브플롯 그리드의 행 수
      • ncols: 생성할 서브플롯 그리드의 열 수
      • figsize: 생성될 전체 그림의 크기 (인치 단위)
      • sharex: 서브플롯 간에 x 축을 공유할지 여부를 지정. 기본값은 False.
      • sharey: 서브플롯 간에 y 축을 공유할지 여부를 지정. 기본값은 False
    • 반환값 
      • fig: 전체 그림을 나타내는 Figure 객체
      • axs: 생성된 서브플롯들을 담고 있는 Axes(Subplot) 객체의 배열이나 행렬로, 배열의 크기는 nrows x ncols와 동일 => 반환된 axs에 bar, scatter, plot 등의 메서드를 통해 그래프를 그려준다!

     

     

     

    Qt의 이미지 출력 => QLabel을 통해 이미지를 Qt 위젯에 출력 할 수 있다.

     

        def main(self):
            img = QImage('burger.png')
            pixmap_img = QPixmap(img)
            self.lbl = QLabel()
            self.lbl.setPixmap(pixmap_img)
            self.lbl.adjustSize()
    • cv2 (ndarray) : 이미지 정보가 numpy의 ndarray 객체에 담겨져 있다.
    • QImage(이미지파일경로) : 이미지 파일을 읽어서 메모리에 올려주는 역할을 한다. 픽셀 편집이 가능하다.
    • QPixmap(QImgae객체) : 메모리에 있는 이미지 파일을 화면에 출력하는 역할
    • 라벨객체.setPixmap( QPixmap객체) : PySide에서 QLabel 위젯에 이미지를 표시할 때 사용되는 매서드. 

     

     

     

    Qt의 이미지 처리 with cv2

     

    ⭐openCV의 python biding = cv2 

    => cv2를 이용하여 파이썬으로 이미지 처리 가능

     

     

    ■  blur 필터 함수

    blur()

        def blur(self):
            self.openCV_img = cv2.imread('burger.png')
            self.blurImg = cv2.blur(self.openCV_img, (55,55))
            self.printImage(self.blurImg)
            print('blur')copy
    • cv2.imread(이미지경로) : cv2를 이용해 image 파일 읽기
    • cv2.blur(이미지, (가로, 세로) ) :  (가로,세로) 값으로 blur 처리

     

     

    ■  gray 필터 함수

    gray()

        def gray(self):
            self.openCV_img = cv2.imread('burger.png')
            self.grayImg = cv2.cvtColor(self.openCV_img, cv2.COLOR_BGR2GRAY)
            self.printImage(self.grayImg)
            print('gray')copy
    • cv2.imread( 이미지경로 ) : cv2를 이용해 image 파일 읽기
    • cv2.cvtColor(이미지, color ) :  이미지 파일 변환
      • (color) cv2.COLOR_BGR2GRAY  BGR → GRAY로 변환

     

     

     

    ■  morpho 필터 함수

    morpho()

        def morpho(self):
            self.openCV_img = cv2.imread('burger.png')
            self.grayImg = cv2.cvtColor(self.openCV_img, cv2.COLOR_BGR2GRAY)
            kernel = numpy.ones((3,3))
            self.morphoImg = cv2.morphologyEx(self.grayImg, cv2.MORPH_GRADIENT, kernel)
            self.printImage(self.morphoImg)
            print('morphology')copy
    • cv2.imread( 이미지경로 ) : cv2를 이용해 image 파일 읽기
    • cv2.cvtColor(이미지, color ) :  이미지 파일 변환
      • (color) cv2.COLOR_BGR2GRAY  BGR 을 GRAY로 변환
        => morphologyEx는 흑백이미지만 가능하므로 gray 필터를 적용해준다! 
    • numpy.ones( (n, m) ) : 1로 채워진 nxm 배열 만드는 함수
    • morphologyEx() : 모폴로지(형태학) 연산 함수
      • 영상 분야에서 노이즈 제거, 구멍 채우기, 끊어진 선 이어 붙이기 등에 쓰이는 연산 기법
      • 0/1로 구성된 바이너리 이미지에 적용 가능 ( 흑백 이미지 )
      • [참고] 침식/팽창/열림/닫힘 4가지 기법이 있음

     

     

    ■  thresh 필터 함수

    thresh()

        def thresh(self):
            self.openCV_img = cv2.imread('burger.png')
            self.grayImg = cv2.cvtColor(self.openCV_img, cv2.COLOR_BGR2GRAY)
            ret, self.thresholdImg = cv2.threshold(self.grayImg, 120, 255, cv2.THRESH_BINARY)
            self.printImage(self.thresholdImg)
            print('threshold')copy
    • cv2.imread() : cv2를 이용해 image 파일 읽기
    • cv2.cvtColor(이미지, color ) :  이미지 파일 변환
      • (color) cv2.COLOR_BGR2GRAY  BGR 을 GRAY로 변환
    • threshold(이미지, 기준값, 설정값, cv2.THRESH_BINARY) : 이미지 이진화 함수
      • 이미지를 기준값에 도달하지 못하면 흑 / 크면 백 전환
      • 기준값보다 크면 설정값으로 설정

     

     

    ■  canny 필터 함수

    canny()

     

        def canny(self):
            self.openCV_img = cv2.imread('burger.png')
            self.grayImg = cv2.cvtColor(self.openCV_img, cv2.COLOR_BGR2GRAY)
            self.cannyImg = cv2.Canny(self.grayImg, 50, 200)
            self.printImage(self.cannyImg)
            print('canny')copy
    • cv2.imread() : cv2를 이용해 image 파일 읽기
    • cv2.cvtColor(이미지, color ) :  이미지 파일 변환
      • (color) cv2.COLOR_BGR2GRAY  BGR 을 GRAY로 변환
    • Canny(이미지, th1, th2) : 테두리 감지 알고리즘
      • th1: 하이스레시스(강한 가장자리)의 최소 임계값으로, 가장자리 후보로 선정되기 위한 임계값
      • th2: 하이스레시스의 최대 임계값으로, 강한 가장자리가 가장자리로 인식되고 약한 가장자리가 버려진다.
        => 즉, th1~th2 사이으 값을 가장자리로 인식한다.
      • 가장자리를 감지한 바이너리 이미지를 반환.
      • 가장자리에 해당하는 픽셀은 흰색(255)으로 표시되며, 나머지는 검은색(0)으로 표시된다.

     

     

    ■  이미지 출력 함수 정의

    printImage(self, cv2 에서 가공한 image (BGR))

        def printImage(self, imgBGR):
            imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)
            h, w, byte = imgRGB.shape
            img = QImage(imgRGB, w, h, byte*w, QImage.Format_RGB888)
            self.openCV_lbl.setPixmap(QPixmap(img))
    • 기능 : BGR이미지를 전달받아서 RGB로 변환하고 QLabel로 화면에 출력한다.
    • cvtColor() : cv2 에서 가공한 image ( BGR ) 을 RGB로 변환하여 반환
    • .shape : img 객체의 정보 return
    • QImage() : QImage() 객체로 변환
    • setPixmap() : 레이블에 출력

     

     

     

    '임베디드 > Qt for python' 카테고리의 다른 글

    [Qt] GUI with Qt : QWidget  (0) 2024.05.13
    [Qt] GUI with Qt : QTimer, QThread  (0) 2024.05.13
    [Qt] GUI with Qt : Text Editor, Qt Designer, Qt API  (0) 2024.05.13
    [Qt] GUI with Qt : QMainWindow  (0) 2024.05.13
    [Qt] GUI with Qt : Qwidget  (0) 2024.05.12
Designed by Tistory.
-->