Programming/openCV2024. 5. 23. 12:19

openCV를 파이썬에서 사용할때

highGUI를 쓰면 편하긴 한데..

cv2.imshow()를 쓰려고 하면, cv2.waitKey()를 써서 멈춰줘야만 해서 인터프리터에서 쓰기가 힘들다

 

matplotlib을 plt.ion() 으로 인터랙티브 모드 켜게 되면

matplotlib의 plot이 독립 쓰레드로 작동해서 opencv의 highGUI 처럼 멈추지 않고 작동한다.

plt.imshow()는 단순하게 이미지 포인터를 바꾸어 주고

plt.pause()를 통해 데이터를 실제 GUI에 갱신할 시간을 벌어주고

plt.show()를 통해 이미지를 업데이트 한다.

import matplotlib.pyplot as plt
import cv2

cap = cv2.VideoCapture(0)    
plt.ion()

while (True):
    ret, frame = cap.read()
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    plt.subplot(1,2,1), plt.imshow(frame, interpolation='nearest')  
    plt.pause(0.001)
    plt.show()

[링크 : https://stackoverflow.com/questions/47172219/how-can-i-use-matplotlib-in-real-time]

 

openCV가 v4l로 이미지를 획득할때는 BGR로 받고, matplotlib은 RGB로 표현하니, 위의 예제를 실행하면 사람이 스머프가 된다.

img_cv2 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

[링크 : https://tempdev.tistory.com/32]

 

전체 코드를 보면 아래와 같이 되는데.. cv2.imshow() 보다 많이 느린 느낌.. 딱 테스트용으로만 쓸 수 있을 듯

import cv2
import matplotlib.pyplot as plt

cap = cv2.VideoCapture(0)
plt.ion()

while (True):
    ret, img = cap.read()
    data = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(data)
    plt.pause(0.001)
    plt.show()
Posted by 구차니