-
[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(nrows, ncols, 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 필터를 적용해준다!
- (color) cv2.COLOR_BGR2GRAY BGR 을 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