open CV_6 Track, HSV


import cv2
import numpy as np

def nothing(x):
    pass

img = np.zeros((400, 600, 3), np.uint8)

cv2.namedWindow('image')
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)
# 색을 조절하는 트랙바 이름 생성
# cv2.createTrackbar(
#trackbar_name, window_name, 초기값, trackbar Max 값, slide 값이 변경 될때 호출 되는 함수)
switch = '0:OFF\n1:On' # ON/ OFF
cv2.createTrackbar(switch, 'image', 1, 1, nothing)

while(1):
#     cv2.imshow('image', img)
    
    if cv2.waitKey(1) & 0xFF == 27: # 종료 키 esc
        break
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')
    # 트랙바 띄우기 
    cv2.imshow('image', img)
    
    
    if s == 0:
        img[:] = 0 # 초기값 검은색 배경
    else:
        img[:] = [b,g,r]
        
cv2.destroyAllWindows()
import cv2
import numpy as np

img = cv2.imread('img.jpg')
img2 = cv2.resize(img,(360, 360))

mask = np.zeros_like(img2) #np.zeros_like( () or [] 들어온 숫자 수 만큼 0 배열을 만들어준다.) ex) np.zeros_like([2, 2, 2]) = [0, 0, 0]
cv2.circle(mask, (240, 220), 70, (255, 255, 255), -1)
                # (x, y), 반지름, (뒷배경), 속 채우기
masked = cv2.bitwise_and(img2, mask)# bitewise_(연산자) and, or, xor, not 
# 이미지, 마스크에 동인한 부분만 출력
cv2.imshow('original', img2)
cv2.imshow('mask', mask)
cv2.imshow('masked', masked)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2

src = cv2.imread('ball.png', cv2.IMREAD_COLOR)
src = cv2.resize(src, (200, 360))
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV) # cv2,COLOR_BGR2HSV -> 색상공간을 활용해서 빠르게 특정 색상을 검출하고 분리함.
h, s, v = cv2.split(hsv)
#HSV(Hue, Saturation, Value)
    #색상,    채도    , 명도 
cv2.imshow('img', src)
cv2.imshow("h", h)
cv2.imshow('s', s)
cv2.imshow('v', v)
cv2.waitKey(0)
cv2.destroyAllWindows()
---------------------------# 첫번째 이미지
import cv2

src = cv2.imread('ball.png', cv2.IMREAD_COLOR)
src = cv2.resize(src, (300, 360))
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
# hsv로 바꾸기
h, s, v = cv2.split(hsv)

h = cv2.inRange(h, -1, 10) # -1이 들어가면 배경요소 원본
# 이미지의 낮은 범위에서 높은 범위 사이의 요소를 추출
# 주황색은 약 cv2.inRange(h, 8, 20)
color = cv2.bitwise_and(hsv, hsv, mask=h)
color = cv2.cvtColor(color, cv2.COLOR_HSV2BGR)
# 다시 BGR로 바꿔 출력

cv2.imshow("color", color)
cv2.waitKey()
cv2.destroyAllWindows()

import cv2

key = cv2.imread('chroma-key.jpg')
room = cv2.imread('room.jpg')

key = cv2.resize(key, (500, 500))
room = cv2.resize(room, (500, 500))

height1, width1 = key.shape[:2] # channel 제외 ex) (853, 1280, 3) -> (853, 1280)
height2, width2 = room.shape[:2]
x = (width2 - width1) // 2
y = height2 - height1
w = x + width1
h = y + height1

#크로마키 영역을 10 픽셀로 지정
chromakey = key[:10, :10, :] # (10, 10, 3)
offset = 20

#HSV(Hue, Saturation, Value)
    #색상,    채도    , 명도 
hsv_chroma = cv2.cvtColor(chromakey, cv2.COLOR_BGR2HSV)
hsv_room = cv2.cvtColor(key, cv2.COLOR_BGR2HSV)

chroma_h = hsv_chroma[:, :, 0]
lower = np.array([chroma_h.min() - offset, 100, 100])
upper = np.array([chroma_h.max() + offset, 255, 255])

mask = cv2.inRange(hsv_room, lower, upper)
mask_inv = cv2.bitwise_not(mask)

roi = room[y:h, x:w]

fg = cv2.bitwise_and(key, key, mask=mask_inv)
bg = cv2.bitwise_and(roi, roi, mask=mask)
room[y:h, x:w] = fg + bg

cv2.imshow('chromakey', key)
cv2.imshow('add', room)
cv2.waitKey(0)
cv2.destroyAllWindows()