임베디드/Qt for python

[Qt] GUI with Qt : Visualization

KimuGamJa 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() : 레이블에 출력