๐ ๋ณธ ์์ ๋ Window10์ VSCode, Python3.11.0๋ก ์์ฑ๋์์ต๋๋ค.
OpenCV๋ Computer Vision์ ์์ด ๋์ค์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Python์์ OpenCV์์ ์์์ Numpy Array๋ก ์์ฑ๋์ด ์์ด, Numpy์ ํ๋ ฌ ์ฐ์ฐ์ ํ ์ ์๋ค.
์์ ์ฝ๊ธฐ, ๋ณด๊ธฐ, ์ ์ฅ
OpenCV๋ก ์์์ ์ฝ๋ ๋ฐฉ๋ฒ์ "imread"๋ฅผ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
import cv2
img = cv2.imread("<์ด๋ฏธ์ง ์ฃผ์>",flags)
# flags์ ์ข
๋ฅ
# cv2.IMREAD_COLOR == 1 : ์ด๋ฏธ์ง๋ฅผ Default ๊ฐ(BGR)์ผ๋ก ์ฝ๋๋ค.
# cv2.IMREAD_GRAYSCALE == 0 : ์ด๋ฏธ์ง๋ฅผ GrayScale๋ก ์ฝ๋๋ค.
# cv2.IMREAD_UNCHANCED == -1 : ์ด๋ฏธ์ง๋ฅผ alpha Channel๊น์ง ํฌํจ(RGBA)ํ์ฌ ์ฝ๋๋ค.
์ฝ์ด์จ ์์์ ๋ณด๋ ๋ฐฉ๋ฒ์ "imshow"๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณผ ์ ์๋ค. ์ด๊ฒ๋ง ์ฌ์ฉํ๋ฉด ๋ฐ๋ก ์ฐฝ์ด ๊บผ์ง๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ๋ฉ์๋์ ํจ๊ป ์ฌ์ฉํด์ผ ํ๋ค.
import cv2
img = cv2.imread("test.jpg")
cv2.imshow("color",img) # ์ด๋ฏธ์ง๋ฅผ ๋์ฐ๊ธฐ(GPU ํ๊ฒฝ์์๋ง ๊ฐ๋ฅ)
cv2.waitKey(0) # ํค๋ณด๋์ ์๋ฌด ํค๋ ๋๋ฅผ ๋ ์ข
๋ฃํ๋ค.
cv2.destroyAllWindows() # ๋ชจ๋ ์๋์ฐ๋ฅผ ๋ซ๋๋ค.
์์์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ "imwrite" ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
import cv2
img = cv2.imread("test.jpg",cv2.IMREAD_COLOR)
cv2.imwrite("test.jpg",img)
์์ ์ ์ด
์์์ ํฌ๊ธฐ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์์ ๊ฐ์ฒด์ shape๋ฅผ ํ์ธํ๋ฉด ๋๋ค.
import cv2
img = cv2.imread("color.jpg")
height,width,channel = img.shape
print(f"์ธ๋ก : {height}, ๊ฐ๋ก : {width}, ์ฑ๋(RGB,GRAY,RGBA) : {channel}")
# ์ธ๋ก : 428, ๊ฐ๋ก : 428, ์ฑ๋(RGB,GRAY,RGBA) : 3
์์์ ์์ ๋ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์์ ๊ฐ์ฒด์ "~"(not) ์ฐ์ฐ์ ํ๋ฉด๋๋ค.
import cv2
img1 = cv2.imread("color.jpg")
cv2.imshow("origin",img1)
cv2.imshow("reversed origin",~img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด "resize" ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
import cv2
img = cv2.imread("color.jpg")
height,width,channel = img.shape
print(f"์ธ๋ก : {height}, ๊ฐ๋ก : {width}, ์ฑ๋(RGB,GRAY,RGBA) : {channel}")
# ์ธ๋ก : 428, ๊ฐ๋ก : 428, ์ฑ๋(RGB,GRAY,RGBA) : 3
re_img = cv2.resize(img1,(512,512),interpolation=cv2.INTER_LANCZOS4)
# interpilation ์ธ์ ์ข
๋ฅ
# cv2.INTER_NEAREST - ์ต๊ทผ๋ฐฉ ์ด์ ๋ณด๊ฐ๋ฒ
# cv2.INTER_LINEAR - ์์ ํ ๋ณด๊ฐ๋ฒ(2x2 ์ด์ ํฝ์
์ฐธ์กฐ)
# cv2.INTER_CUBIC - 3์ฐจ ํ์ ๋ณด๊ฐ๋ฒ(4x4 ์ด์ ํฝ์
์ฐธ๋ง์ด)
# cv2.INTER_LANCZOS4 - Lanczos ๋ณด๊ฐ๋ฒ(8x8 ์ด์ ํฝ์
์ฐธ์กฐ)
# cv2.INTER_AREA - ์์ ์ถ์ ์ ํจ๊ณผ์
height,width,channel = re_img.shape
print(f"์ธ๋ก : {height}, ๊ฐ๋ก : {width}, ์ฑ๋(RGB,GRAY,RGBA) : {channel}")
# ์ธ๋ก : 512, ๊ฐ๋ก : 512, ์ฑ๋(RGB,GRAY,RGBA) : 3
resize๋ ์์์ scale์ ๋ฐ๊พธ๋ ๊ฒ์ผ๋ฏ๋ก interpolation์ ์ ์ค์ ํด์ผ, ์ด๋ฏธ์ง ์์ค์ด ์ ์ด์ง๋ค.
- cv2.INTER_NEAREST - ์ต๊ทผ๋ฐฉ ์ด์ ๋ณด๊ฐ๋ฒ, ๊ฐ์ฅ ๋น ๋ฅด๋ ๊ฐ์ฅ ํ๋ฆฌํฐ๊ฐ ๋จ์ด์ง.
- cv2.INTER_LINEAR - ์์ ํ ๋ณด๊ฐ๋ฒ(2x2 ์ด์ ํฝ์ ์ฐธ์กฐ), ํจ์จ์ฑ์ด ๊ฐ์ฅ ์ข์(์ ๋นํ ๋น ๋ฅด๊ณ ์ ๋นํ ์ข์ ๊ฒฐ๊ณผ)
- cv2.INTER_CUBIC - 3์ฐจ ํ์ ๋ณด๊ฐ๋ฒ(4x4 ์ด์ ํฝ์ ์ฐธ๋ง์ด), LINEAR ๋ณด๋จ ๋๋ฆฌ๋ ๋ ์ข์ ํ๋ฆฌํฐ
- cv2.INTER_LANCZOS4 - Lanczos ๋ณด๊ฐ๋ฒ(8x8 ์ด์ ํฝ์ ์ฐธ์กฐ), ๊ฐ์ฅ ๋๋ฆฌ๋ ํ๋ฆฌํฐ๋ ์ ์ผ ์ข์
- cv2.INTER_AREA - ์์ ์ถ์ ์ ํจ๊ณผ์ , ์์ญ์ ์ธ ์ ๋ณด๋ฅผ ์ถ์ถํจ.
์์์ ์์ ๊ณต๊ฐ์ ๋ฐ๊พธ๋ ค๋ฉด "cvtColor"๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
import cv2
img = cv2.imread("test.jpg")
bgr_img = cv2.cvtColor(img,cv2.COLOR_RGB2BGR)
# ์์ ๊ณต๊ฐ ๋ณ๊ฒฝ Flags
# cv2.COLOR_<๊ธฐ์กด๊ณต๊ฐ>2<๋ณ๊ฒฝ ๊ณต๊ฐ>
cv2.imshow("bgr",bgr_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
์์ ๊ณต๊ฐ ์ข ๋ฅ
- BGR(Blue-Green-Red) : OpenCV ๊ธฐ๋ณธ ์ปฌ๋ฌ ์คํ์ด์ค, ์ปดํจํฐ ๋น์ ์์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ.
- RGB(Red-Green-Blue) : ๋น์ ์ผ์์์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ปฌ๋ฌ ์คํ์ด์ค, ์ปดํจํฐ ๊ทธ๋ํฝ์ด๋ ๋์คํ๋ ์ด์ ๋ง์ด ์ฌ์ฉ.
- Grayscale : ํ๋ฐฑ ์ด๋ฏธ์ง๋ก ๋ณํธ๋ ํ๋๋ฐ ์ฌ์ฉํ๋ ์ปฌ๋ฌ ์คํ์ด์ค, ์ฃผ๋ก ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์์ ๋ ธ์ด์ฆ ์ ๊ฑฐ๋ ๋ชจ์๋ฆฌ ๊ฒ์ถ๋ฑ์ ์ฌ์ฉ.
- HSV(Hue-Saturation-Value) : ์์, ์ฑ๋, ๋ช ๋๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํํํ๋ ์ปฌ๋ฌ์ค ํ์ด์ค, ์ปฌ๋ฌ ๊ธฐ๋ฐ ๊ฐ์ฒด ๊ฒ์ถ์ด๋ ์์ ํํฐ๋ง์ ์ ์ฉํจ.
์์์ ์์์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ RGB(๋๋ BGR, RGBA, BGRA)์์ ํฝ์ ๋จ์๋ก ์์๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
# ์์ ๋ณ๊ฒฝ
cv2.imshow("original",img1)
img1[30:40] = [255,0,255] # ์ธ๋ก์ 30 ~ 39 ์์น์ ์์ (255,0,255)๋ก ๋ณ๊ฒฝ
img1[:,10:20] = [0,255,0] # ๊ฐ๋ก์ 10 ~ 19 ์์น์ ์์ (0,255,0)๋ก ๋ณ๊ฒฝ
cv2.imshow("color change",img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
๋น๋์ค ์คํธ๋ฆผ
Opencv์์ ๋น๋์ค ์คํธ๋ฆผ์ ์ฌ๋ ๋ฐฉ๋ฒ์ "VideoCapture"๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋งค๊ฐ๋ณ์๋ก ์ซ์๋ฅผ ์ค ๊ฒฝ์ฐ ์นด๋ฉ๋ผ ์์์ ๋ณผ ์ ์๋ค.
๋์์์ ๋ณด๋ ค๋ฉด ๋์์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
import cv2
retval = cv2.VideoCapture("v1.mp4",apiPreference=None)
# 0 : ๊ธฐ๋ณธ ์นด๋ฉ๋ผ
# 1~ : ์ฅ์น ๊ด๋ฆฌ์์ ์ฐ๊ฒฐ๋ ์์๋๋ก
# retval
# ์ฑ๊ณต ์ True
# ์คํจ ์ False
# ์นด๋ฉ๋ผ๊ฐ ์ด๋ ธ๋์ง ํ์ธ
if not retval.isOpened():
print("์คํจ!")
import sys
sys.exit()
print("์ด๊ธฐ ์ฑ๊ณต")
๊ทธ ๋ค์์ผ๋ก VideoCapture ๊ฐ์ฒด์ ํ๋ ์์ ๋ฐ์์์ผ ํ๋ค.
ํ๋ ์์ ๋ฐ์์ค๋ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด์ read ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
ret,frame = retval.read()
print(ret) # ์์ ๋ฐํ ์ฑ๊ณต ์ ๋ฌด
print(type(frame)) # ์์์ ํ๋ ์
# ์์ ์ถ๋ ฅ
while True:
ret,frame = retval.read()
if not ret: # ์๋ก์ด ํ๋ ์์ ๋ชป๋ฐ์ ์์ ๋ break
break
# ์์ ์ถ๋ ฅ
cv2.imshow("video",frame)
# ESC ๋๋ฅด๋ฉด ๊ฐ์ ์ข
๋ฃ
if cv2.waitKey(10) == 27:
break
retval.release() # ์ฌ์ฉํ ์์ ํด์
cv2.destroyAllWindows()
get ๋ฉ์๋๋ก ๋น๋์ค ์คํธ๋ฆผ์ ์์ฑ์ ์ฐธ์กฐํ์ฌ ํ์ธํ ์ ์๋ค.
import cv2
retval = cv2.VideoCapture("v1.mp4",apiPreference=None)
# ์์ฑ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
# retval.get(<์ํ๋ ์์ฑ>)
print(f"Width : {retval.get(cv2.CAP_PROP_FRAME_WIDTH)}")
print(f"Height : {retval.get(cv2.CAP_PROP_FRAME_HEIGHT)}")
print(f"FPS : {retval.get(cv2.CAP_PROP_FPS)}")
set ๋ฉ์๋๋ก ๋น๋์ค ์คํธ๋ฆผ์ ์์ฑ์ ์ฐธ์กฐํ์ฌ ๋ณ๊ฒฝํ ์ ์๋ค.
retval = cv2.VideoCapture("v1.mp4",apiPreference=None)
retval.set(cv2.CAP_PROP_FRAME_WIDTH,1024)
retval.set(cv2.CAP_PROP_FRAME_HEIGHT,1024)
'AI > Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Computer Vision] ํ ์คํธ ์ฝ์ ๋ฐ ์ ์ฉํ ๊ธฐ๋ฅ (0) | 2024.08.28 |
---|---|
[Computer Vision] ๊ทธ๋ฆฌ๊ธฐ ํจ์ (0) | 2024.08.27 |
[Computer Vision] Inpainting (0) | 2024.03.25 |
[Computer Vision] DreamBooth (0) | 2024.03.11 |
[Computer Vision] LoRA(Low-Rank Adaptation) (0) | 2024.03.10 |