๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[v0.23]์˜์ƒ์ฒ˜๋ฆฌ_ ๋ธ”๋Ÿฌ๋งํ™œ์šฉ & ๋ชจ์ž์ดํฌ ์ฒ˜๋ฆฌ, ์ด๋ฏธ์ง€ ์Šค์ผ€์น˜ ํšจ๊ณผ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Image Processing

[v0.23]์˜์ƒ์ฒ˜๋ฆฌ_ ๋ธ”๋Ÿฌ๋งํ™œ์šฉ & ๋ชจ์ž์ดํฌ ์ฒ˜๋ฆฌ, ์ด๋ฏธ์ง€ ์Šค์ผ€์น˜ ํšจ๊ณผ

์ง•์ง•์•ŒํŒŒ์นด 2022. 1. 12. 00:40
728x90
๋ฐ˜์‘ํ˜•

220112 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ๊ท€ํ‰์ด ์„œ์žฌ๋‹˜์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://bkshin.tistory.com/entry/OpenCV-21-%EB%B8%94%EB%9F%AC%EB%A7%81%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%AA%A8%EC%9E%90%EC%9D%B4%ED%81%AC-%EC%B2%98%EB%A6%AC-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%8A%A4%EC%BC%80%EC%B9%98-%ED%9A%A8%EA%B3%BC-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0?category=1148027 

 

OpenCV - 21. ๋ธ”๋Ÿฌ๋ง์„ ํ™œ์šฉํ•œ ๋ชจ์ž์ดํฌ ์ฒ˜๋ฆฌ, ์ด๋ฏธ์ง€ ์Šค์ผ€์น˜ ํšจ๊ณผ ์ ์šฉํ•˜๊ธฐ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ธ”๋Ÿฌ๋ง์„ ํ™œ์šฉํ•œ ๋ชจ์ž์ดํฌ ์ฒ˜๋ฆฌ์™€ ์ด๋ฏธ์ง€์— ์Šค์ผ€์น˜ ํšจ๊ณผ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ… ์—ญ์‹œ 'ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“œ๋Š” OpenCV ํ”„๋กœ์ ํŠธ(์ด์„ธ์šฐ ์ €)'๋ฅผ ์ •๋ฆฌ

bkshin.tistory.com

 

 

 

 

 

1. ๋ธ”๋Ÿฌ๋ง์„ ํ™œ์šฉํ•œ ๋ชจ์ž์ดํฌ ์ฒ˜๋ฆฌ

: ๋งˆ์šฐ์Šค๋กœ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ์„ ํƒํ•œ ๋ถ€๋ถ„์„ ๋ธ”๋Ÿฌ๋ง ํšจ๊ณผ๋กœ ๋ชจ์ž์ดํฌ ์ฒ˜๋ฆฌ

: ๋งˆ์šฐ์Šค ๋“œ๋ž˜๊ทธ ํ›„ ์—”ํ„ฐ๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ๊ธฐ

# ๋ธ”๋Ÿฌ๋ง์„ ํ™œ์šฉํ•œ ๋ชจ์ž์ดํฌ
import cv2

ksize = 30              # ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ•  ์ปค๋„ ํฌ๊ธฐ
win_title = 'mosaic'    # ์ฐฝ ์ œ๋ชฉ
img = cv2.imread('img/taekwonv1.jpg')    # ์ด๋ฏธ์ง€ ์ฝ๊ธฐ

while True:
    x,y,w,h = cv2.selectROI(win_title, img, False) # ๊ด€์‹ฌ์˜์—ญ ์„ ํƒ
    if w > 0 and h > 0:         # ํญ๊ณผ ๋†’์ด๊ฐ€ ์Œ์ˆ˜์ด๋ฉด ๋“œ๋ž˜๊ทธ ๋ฐฉํ–ฅ์ด ์˜ณ์Œ 
        roi = img[y:y+h, x:x+w]   # ๊ด€์‹ฌ์˜์—ญ ์ง€์ •
        roi = cv2.blur(roi, (ksize, ksize)) # ๋ธ”๋Ÿฌ(๋ชจ์ž์ดํฌ) ์ฒ˜๋ฆฌ
        img[y:y+h, x:x+w] = roi   # ์›๋ณธ ์ด๋ฏธ์ง€์— ์ ์šฉ
        cv2.imshow(win_title, img)
    else:
        break
cv2.destroyAllWindows()

๋ธ”๋Ÿฌ๋ง์„ ํ™œ์šฉํ•œ ๋ชจ์ž์ดํฌ

 

 

 

 

 

2. ์ด๋ฏธ์ง€์— ์Šค์ผ€์น˜ ํšจ๊ณผ ์ ์šฉํ•˜๊ธฐ

: ์นด๋ฉ”๋ผ๋กœ ์ฐ์€ ์ด๋ฏธ์ง€์— 2D ์Šค์ผ€์น˜ ํšจ๊ณผ๋ฅผ ์ ์šฉ

# ์Šค์ผ€์น˜ ํšจ๊ณผ
import cv2
import numpy as np

# ์นด๋ฉ”๋ผ ์žฅ์น˜ ์—ฐ๊ฒฐ
cap = cv2.VideoCapture(0)   
while cap.isOpened():
    # ํ”„๋ ˆ์ž„ ์ฝ๊ธฐ
    ret, frame = cap.read()
    # ์†๋„ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์˜์ƒํฌ๊ธฐ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ถ•์†Œ
    frame = cv2.resize(frame, None, fx=0.5, fy=0.5, \
                        interpolation=cv2.INTER_AREA)
    if cv2.waitKey(1) == 27: # escํ‚ค๋กœ ์ข…๋ฃŒ
        break
    # ๊ทธ๋ ˆ์ด ์Šค์ผ€์ผ๋กœ ๋ณ€๊ฒฝ    
    img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # ์žก์Œ ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ๊ฐ€์šฐ์‹œ์•ˆ ํ”Œ๋Ÿฌ ํ•„ํ„ฐ ์ ์šฉ(๋ผํ”Œ๋ผ์‹œ์•ˆ ํ•„ํ„ฐ ์ ์šฉ ์ „์— ํ•„์ˆ˜)
    img_gray = cv2.GaussianBlur(img_gray, (9,9), 0)
    # ๋ผํ”Œ๋ผ์‹œ์•ˆ ํ•„ํ„ฐ๋กœ ์—ฃ์ง€ ๊ฒ€์ถœ
    edges = cv2.Laplacian(img_gray, -1, None, 5)
    # ์Šค๋ ˆ์‹œํ™€๋“œ๋กœ ๊ฒฝ๊ณ„ ๊ฐ’ ๋งŒ ๋‚จ๊ธฐ๊ณ  ์ œ๊ฑฐํ•˜๋ฉด์„œ ํ™”๋ฉด ๋ฐ˜์ „(ํฐ ๋ฐ”ํƒ• ๊ฒ€์€ ์„ )
    ret, sketch = cv2.threshold(edges, 70, 255, cv2.THRESH_BINARY_INV)
    
    # ๊ฒฝ๊ณ„์„  ๊ฐ•์กฐ๋ฅผ ์œ„ํ•ด ์นจ์‹ ์—ฐ์‚ฐ
    kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
    sketch = cv2.erode(sketch, kernel)
    # ๊ฒฝ๊ณ„์„  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋””์–ธ ๋ธ”๋Ÿฌ ํ•„ํ„ฐ ์ ์šฉ
    sketch = cv2.medianBlur(sketch, 5)
    # ๊ทธ๋ ˆ์ด ์Šค์ผ€์ผ์—์„œ BGR ์ปฌ๋Ÿฌ ์Šค์ผ€์ผ๋กœ ๋ณ€๊ฒฝ
    img_sketch = cv2.cvtColor(sketch, cv2.COLOR_GRAY2BGR)

    # ์ปฌ๋Ÿฌ ์ด๋ฏธ์ง€ ์„ ๋ช…์„ ์„ ์—†์• ๊ธฐ ์œ„ํ•ด ํ‰๊ท  ๋ธ”๋Ÿฌ ํ•„ํ„ฐ ์ ์šฉ
    img_paint = cv2.blur(frame, (10,10) )
    # ์ปฌ๋Ÿฌ ์˜์ƒ๊ณผ ์Šค์ผ€์น˜ ์˜์ƒ๊ณผ ํ•ฉ์„ฑ
    img_paint = cv2.bitwise_and(img_paint, img_paint, mask=sketch)
    
    # ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    merged = np.hstack((img_sketch, img_paint))
    cv2.imshow('Sketch Camera', merged)
    
cap.release()
cv2.destroyAllWindows()

๋Š๋‚Œ์žˆ๋Š” ์Šค์ผ€์น˜ ์‚ฌ์ง„~

 

 

 

 

์Šค์ผ€์น˜ ์‚ฌ์ง„ ์™„์ „ ์‘์šฉ๋ฒ”๋ฒ…์ด๋‹น...

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
Comments