【OpenCV】 기억해 두면 얻은 생각이 들었던 작은 것 : cv2.WaitKey()
OpenCV 창 트랙 바의 움직임을 원활하게
이미지 처리하고 있어, 파라미터를 윈도우에 붙인 트랙 바로 움직이면서 리얼타임에 거동을 본다, 라고 하는 것은 잘 합니다. 이 때, 화상 처리가 무겁다고 트랙 바의 움직임이 어색해져, 스트레스를 느낍니다. 조금 궁리하고 개선해 보았습니다.
실행 환경
2020년 12월 현재, 일반적인 환경이라고 말해도 좋다고 생각합니다.Python 3.7.4
OpenCV 4.4.0
MacOS 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
라고 주면, 뭐 용서할 정도로는 트랙 바가 부드럽게 움직여 주게 되었습니다.
2020년 12월 현재, 일반적인 환경이라고 말해도 좋다고 생각합니다.
Python 3.7.4
OpenCV 4.4.0
MacOS 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
라고 주면, 뭐 용서할 정도로는 트랙 바가 부드럽게 움직여 주게 되었습니다.
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)
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)))
cv2.imshow('lena gamma',img_gamma)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()
이 예에서는, 근본적인 개선은, 룩업 테이블등 사용하면 간단합니다만, 경우에 따라서는 알고리즘의 고속화가 어려운 경우라고 하고 있습니다. 그런 때의 절충안적인 개선책입니다.
이 예에서는
key = cv2.
waitKey(1)
& 0xFF라고 while 루프를 고속 회전시키고 있습니다만, 이것을 저속 회전으로 하면, 단위 시간당의 화상 처리의 횟수가 줄어 CPU가 트랙 바의 이동에 머무를 여력을 할 수 있는 것 같습니다.
예를 들어,
key = cv2.
waitKey(200)
& 0xFF라고 주면, 뭐 용서할 정도로는 트랙 바가 부드럽게 움직여 주게 되었습니다.
요약
OpenCV에서 윈도우 트랙 바의 움직임이 둔했을 때, 일단 간단하게 그 자리에서 벗어나는 방법이었습니다. 처리에 리얼타임성이 엄격히 요구되는 경우는 사용할 수 없습니다만, 현실해로서는 없잖아라고 생각합니다.
Reference
이 문제에 관하여(【OpenCV】 기억해 두면 얻은 생각이 들었던 작은 것 : cv2.WaitKey()), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/masami65/items/d6be3f5fd806bccc23a2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【OpenCV】 기억해 두면 얻은 생각이 들었던 작은 것 : cv2.WaitKey()), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/masami65/items/d6be3f5fd806bccc23a2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)