๊ฐœ๋ฐœ Code/์ธ๊ณต์ง€๋Šฅ A.I.

[Python][AI] OpenCV: ์ปดํ“จํ„ฐ ๋น„์ „ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ๊ฐœ

5hr1rnp 2025. 2. 17. 21:58
๋ฐ˜์‘ํ˜•

OpenCV

1. OpenCV๋ž€?


OpenCV(Open Source Computer Vision)๋Š” ์‹ค์‹œ๊ฐ„ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐ ์ปดํ“จํ„ฐ ๋น„์ „ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์ธํ…”์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  2000๋…„ 6์›”์— ๋ฐœํ‘œ๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋Š” ์ธํ…”์ด ์†์„ ๋—€ ์ƒํƒœ๋‹ค. Python, C++, Java ๋“ฑ์„ ์ง€์›ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ(Windows, Linux, macOS)์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.


2. OpenCV์˜ ์ฃผ์š” ๊ธฐ๋Šฅ


OpenCV๋Š” ์ปดํ“จํ„ฐ ๋น„์ „ ๋ฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ.

(1) ์ด๋ฏธ์ง€ ๋ฐ ๋™์˜์ƒ ์ฒ˜๋ฆฌ

  • ์ด๋ฏธ์ง€ ์ฝ๊ธฐ, ์ €์žฅ, ๋ณ€ํ™˜
  • ๋™์˜์ƒ ์žฌ์ƒ ๋ฐ ํ”„๋ ˆ์ž„ ์ฒ˜๋ฆฌ
  • ์ƒ‰๊ณต๊ฐ„ ๋ณ€ํ™˜ (RGB ↔ Grayscale, HSV ๋“ฑ)

(2) ํ•„ํ„ฐ ๋ฐ ๋ณ€ํ™˜

  • ๋ธ”๋Ÿฌ๋ง ๋ฐ ์ƒคํ”„๋‹
  • ์—ฃ์ง€ ๊ฒ€์ถœ (Canny Edge Detection)
  • ๊ธฐํ•˜ํ•™์  ๋ณ€ํ™˜ (ํšŒ์ „, ํฌ๊ธฐ ์กฐ์ •, ์™œ๊ณก ๋ณด์ •)

(3) ๊ฐ์ฒด ํƒ์ง€ ๋ฐ ์ธ์‹

  • ์–ผ๊ตด, ๋ˆˆ, ์‚ฌ๋žŒ, ์ž๋™์ฐจ ๋“ฑ ํƒ์ง€
  • ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ๊ณผ ์—ฐ๊ณ„ํ•œ ๋ฌผ์ฒด ์ธ์‹
  • ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๋ฐ ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜

(4) ํŠน์ง•์  ๊ฒ€์ถœ ๋ฐ ๋งค์นญ

  • SIFT, SURF, ORB ๋“ฑ์„ ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ํŠน์ง•์  ๊ฒ€์ถœ
  • ์ด๋ฏธ์ง€ ๊ฐ„ ์œ ์‚ฌ๋„ ๋น„๊ต ๋ฐ ์ •๋ ฌ

(5) ๋จธ์‹ ๋Ÿฌ๋‹ ๋ฐ ๋”ฅ๋Ÿฌ๋‹ ํ†ตํ•ฉ

  • DNN ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•˜์—ฌ ๋”ฅ๋Ÿฌ๋‹ ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ํƒ์ง€ ์ˆ˜ํ–‰
  • TensorFlow, PyTorch ๋ชจ๋ธ๊ณผ ์—ฐ๋™ ๊ฐ€๋Šฅ

3. OpenCV ์„ค์น˜


OpenCV๋Š” pip์„ ์ด์šฉํ•ด ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Œ.

 

pip install opencv-python
 

๋˜๋Š” ์ถ”๊ฐ€์ ์ธ ํ™•์žฅ ๋ชจ๋“ˆ์ด ํฌํ•จ๋œ opencv-python-headless ์„ค์น˜ ๊ฐ€๋Šฅ.

pip install opencv-python-headless
 

(GUI ๊ธฐ๋Šฅ ์—†์ด ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ opencv-python-headless ์ถ”์ฒœ)


728x90
๋ฐ˜์‘ํ˜•

4. OpenCV ๊ธฐ๋ณธ ์ฝ”๋“œ ์˜ˆ์ œ


(1) ์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋ฐ ํ‘œ์‹œ

 
import cv2

# ์ด๋ฏธ์ง€ ์ฝ๊ธฐ
image = cv2.imread("sample.jpg")

# ์ด๋ฏธ์ง€ ํ‘œ์‹œ
# ์ด๋ฏธ์ง€๊ฐ€ ๋ณ„๋„์˜ ์ฐฝ์œผ๋กœ ๋ณด์—ฌ์ง€๊ณ 
# ์•„๋ฌด ํ‚ค ์ž…๋ ฅ์‹œ ์ข…๋ฃŒ๋จ
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

(2) ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ ๋ณ€ํ™˜

# ์ด๋ฏธ์ง€ gray scale
# ์•„๋ฌด ํ‚ค ์ž…๋ ฅ์‹œ ์ข…๋ฃŒ
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Grayscale", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

(3) ์–ผ๊ตด ํƒ์ง€ (Haar Cascade ์‚ฌ์šฉ)

# ์•„๋ฌด ํ‚ค ์ž…๋ ฅ์‹œ ์ข…๋ฃŒ
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=50, minSize=(300, 300))

for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow("Face Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
 

5. OpenCV์˜ ํ™œ์šฉ ๋ถ„์•ผ

 


  • ์ž์œจ์ฃผํ–‰: ๊ฐ์ฒด ์ธ์‹, ์ฐจ์„  ๊ฐ์ง€, ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธํŒ ์ธ์‹
  • ์˜๋ฃŒ ์˜์ƒ ์ฒ˜๋ฆฌ: CT/MRI ์˜์ƒ ๋ถ„์„, ๋ณ‘๋ณ€ ํƒ์ง€
  • ๋ณด์•ˆ ๋ฐ ๊ฐ์‹œ: ์–ผ๊ตด ์ธ์‹, ์‚ฌ๋žŒ ํƒ์ง€
  • ์Šคํฌ์ธ  ๋ถ„์„: ์„ ์ˆ˜ ์›€์ง์ž„ ์ถ”์ , ๊ฒฝ๊ธฐ ๋ฐ์ดํ„ฐ ๋ถ„์„
  • AR(์ฆ๊ฐ•ํ˜„์‹ค) ๋ฐ VR: ์‹ค์‹œ๊ฐ„ ์˜์ƒ ์ฒ˜๋ฆฌ ๊ธฐ๋ฐ˜ ๊ทธ๋ž˜ํ”ฝ ์˜ค๋ฒ„๋ ˆ์ด

6. ๊ฒฐ๋ก 


OpenCV๋Š” ์ด๋ฏธ์ง€ ๋ฐ ์˜์ƒ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ์šฉ๋˜๊ณ  ์žˆ์Œ. ํŠนํžˆ ๋”ฅ๋Ÿฌ๋‹๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฐ์ฒด ํƒ์ง€ ๋ฐ ์ธ์‹์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, Python์„ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์œ ์šฉํ•จ.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” OpenCV์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” YuNet ๋ชจ๋ธ์„ ์†Œ๊ฐœํ•  ์˜ˆ์ •์ž„.

๋ฐ˜์‘ํ˜•