【OpenCV】 기억해 두면 얻은 생각이 들었던 작은 것 : cv2.WaitKey()

지금까지 무심코 루틴 워크가 된 처리가, 약간의 궁리입니다 매우 사용하기 쉬워져 눈으로부터 비늘, 같은 것이 때때로 있습니다. 매번 기억해 두려고 생각합니다.

OpenCV 창 트랙 바의 움직임을 원활하게



이미지 처리하고 있어, 파라미터를 윈도우에 붙인 트랙 바로 움직이면서 리얼타임에 거동을 본다, 라고 하는 것은 잘 합니다. 이 때, 화상 처리가 무겁다고 트랙 바의 움직임이 어색해져, 스트레스를 느낍니다. 조금 궁리하고 개선해 보았습니다.

실행 환경



2020년 12월 현재, 일반적인 환경이라고 말해도 좋다고 생각합니다.Python 3.7.4OpenCV 4.4.0MacOS 11.0.1

트랙바 이동의 지연에 스트레스를 느끼는 예



무엇이든 괜찮습니다. 무거운 이미지 처리의 예로 Lookup Table을 사용하지 않고 for 루프에서 감마 보정을 적용하는 것을 시도해 보겠습니다. 소재는 lena.png실제로하지는 않지만 어디 까지나 알기 쉬운 예로 ...

먼저 이미지를 그레이스케일로 로드하고 이를 표시하는 창을 만듭니다.
import cv2

def nothing(x):
    pass

img_gray = cv2.imread('lena.png',0)

cv2.namedWindow('lena gamma',cv2.WINDOW_NORMAL)
cv2.createTrackbar('gamma','lena gamma',200,300,nothing)

createTrackbar의 인수로 지정하는 콜백 함수를 nothing로 정의합니다. 아무것도 하지 않습니다.

그런 다음 트랙 바에 지정된 감마 값으로 이미지에 감마 보정을 적용합니다.
while(cv2.getWindowProperty('lena gamma',cv2.WND_PROP_VISIBLE)>0):
    gamma = cv2.getTrackbarPos('gamma','lena gamma') / 100
    if gamma == 0:
        gamma = 1/100
    img_gamma = img_gray.copy()

    for i in range(img_gamma.shape[0]):
        for j in range(img_gamma.shape[1]):
            img_gamma[i,j] = int(255 * (pow(img_gamma[i,j]/255,1/gamma)))

모처럼의 numpy의 고속도가 엉망인 느낌이 잘 나와 있습니다.
gamma 의 값은, 외형을 잘 하기 위해(때문에), 트랙 바로 지정하는 것은 100 배치로 했습니다. 그래서, getTrackgbarPos 로 취해 왔을 때에, 100분의 1로 하고 있습니다.

그리고 결과를 표시합니다. while 루프의 계속이군요.
    cv2.imshow('lena gamma',img_gamma)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break

cv2.destroyAllWindows()

같은 디렉토리에 lena.png 를 두고 실행하면, 이런 느낌의 윈도우가 나옵니다.

아래쪽의 트랙 바에서 감마의 값을 0.01 ~ 3.00의 범위에서 지정할 수 있어, 리얼타임으로 화상이 갱신되는 것이군요.
다만, 화상 처리가 너무 무겁고, 트랙 바가 좀처럼 잘 움직여 주지 않습니다. 정신적 좌절감이 붙어, 사용할 수 있었던 것이 아닙니다・・・

약간의 개선책



이 예에서는, 근본적인 개선은, 룩업 테이블등 사용하면 간단합니다만, 경우에 따라서는 알고리즘의 고속화가 어려운 경우라고 하고 있습니다. 그런 때의 절충안적인 개선책입니다.

이 예에서는

key = cv2. waitKey(1) & 0xFF

라고 while 루프를 고속 회전시키고 있습니다만, 이것을 저속 회전으로 하면, 단위 시간당의 화상 처리의 횟수가 줄어 CPU가 트랙 바의 이동에 머무를 여력을 할 수 있는 것 같습니다.

예를 들어,

key = cv2. waitKey(200) & 0xFF

라고 주면, 뭐 용서할 정도로는 트랙 바가 부드럽게 움직여 주게 되었습니다.
  • 그러나 이미지 업데이트 빈도는 0.001초에서 0.2초로 크게 떨어졌습니다. 하지만 인간의 감각으로는 충분히 허용할 수 있는 범위라고 생각합니다.

  • 요약



    OpenCV에서 윈도우 트랙 바의 움직임이 둔했을 때, 일단 간단하게 그 자리에서 벗어나는 방법이었습니다. 처리에 리얼타임성이 엄격히 요구되는 경우는 사용할 수 없습니다만, 현실해로서는 없잖아라고 생각합니다.

    좋은 웹페이지 즐겨찾기