๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[v0.14]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ์ ์ฌ๋ ๋น๊ต ์ธ ์ค์ต ๋ณธ๋ฌธ
[v0.14]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ์ ์ฌ๋ ๋น๊ต ์ธ ์ค์ต
์ง์ง์ํ์นด 2022. 1. 5. 02:02220105 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ๊ทํ์ด ์์ฌ๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
OpenCV - 12. ์ด๋ฏธ์ง ์ ์ฌ๋ ๋น๊ต, ์ฌ๋ ์ผ๊ตด๊ณผ ํด๊ณจ ํฉ์ฑ, ๋ชจ์ ๊ฐ์ง CCTV
์ด๋ฒ ํฌ์คํ ์์๋ ์ฌ๋ฌ ๊ฐ์ง ์ค์ต์ ํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ ํฌ์คํ ์ญ์ 'ํ์ด์ฌ์ผ๋ก ๋ง๋๋ OpenCV ํ๋ก์ ํธ(์ด์ธ์ฐ ์ )'๋ฅผ ์ ๋ฆฌํ ๊ฒ์์ ๋ฐํ๋๋ค. ์ฝ๋: github.com/BaekKyunShin/OpenCV_Project_Python/tree/m.
bkshin.tistory.com
1. ์ด๋ฏธ์ง ์ ์ฌ๋ ๋น๊ต ์ค์ต
: ํฝ์ ๊ฐ์ ๋ถํฌ๊ฐ ์๋ก ๋น์ทํ๋ค๋ฉด ์ ์ฌํ ์ด๋ฏธ์ง์ผ ํ๋ฅ ์ด ๋์
: ๋ถํฌ๊ฐ ์๋ก ๋ค๋ฅด๋ค๋ฉด ์๋ก ๋ค๋ฅธ ์ด๋ฏธ์ง์ผ ํ๋ฅ ์ด ๋์
cv2.compareHist(hist1, hist2, method)
: ํ์คํ ๊ทธ๋จ์ ๋น๊ตํ์ฌ ๋ ์ด๋ฏธ์ง๊ฐ ์ผ๋ง๋ ์ ์ฌํ์ง ํ๋จ
- hist1, hist2 : ๋น๊ตํ ๋ ๊ฐ์ ํ์คํ ๊ทธ๋จ, ํฌ๊ธฐ์ ์ฐจ์์ด ๊ฐ์์ผ ํจ
- method : ๋น๊ต ์๊ณ ๋ฆฌ์ฆ
- cv2.HISTCMP_CORREL : ์๊ด๊ด๊ณ (1 : ์์ ์ผ์น, -1 : ์์ ๋ถ์ผ์น, 0 : ๋ฌด๊ด๊ณ)
- cv2.HISTCMP_CHISQR : ์นด์ด์ ๊ณฑ (0 : ์์ ์ผ์น, ๋ฌดํ๋ : ์์ ๋ถ์ผ์น)
- cv2.HISTCMP_INTERSECT : ๊ต์ฐจ (1 : ์์ ์ผ์น, 0 : ์์ ๋ถ์ผ์น - 1๋ก ์ ๊ทํํ ๊ฒฝ์ฐ)
# ํ์คํ ๊ทธ๋จ ๋น๊ต
import cv2, numpy as np
import matplotlib.pylab as plt
img1 = cv2.imread('img/hobbang.jpeg')
img2 = cv2.imread('img/hobbang1.jpg')
img3 = cv2.imread('img/hobbang2.jpeg')
img4 = cv2.imread('img/jadu.jpg')
# ----------img resize---------------------
img2 = cv2.resize(img2, dsize = (197, 256))
img3 = cv2.resize(img3, dsize = (197, 256))
img4 = cv2.resize(img4, dsize = (197, 256))
cv2.imshow('query', img1)
imgs = [img1, img2, img3, img4]
hists = []
for i, img in enumerate(imgs) :
plt.subplot(1,len(imgs),i+1)
plt.title('img%d'% (i+1))
plt.axis('off')
plt.imshow(img[:,:,::-1])
#---โ ๊ฐ ์ด๋ฏธ์ง๋ฅผ HSV๋ก ๋ณํ
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
#---โก H,S ์ฑ๋์ ๋ํ ํ์คํ ๊ทธ๋จ ๊ณ์ฐ
hist = cv2.calcHist([hsv], [0,1], None, [180,256], [0,180,0, 256])
#---โข 0~1๋ก ์ ๊ทํ
cv2.normalize(hist, hist, 0, 1, cv2.NORM_MINMAX)
hists.append(hist)
query = hists[0]
methods = {'CORREL' :cv2.HISTCMP_CORREL, 'CHISQR':cv2.HISTCMP_CHISQR,
'INTERSECT':cv2.HISTCMP_INTERSECT,
'BHATTACHARYYA':cv2.HISTCMP_BHATTACHARYYA}
for j, (name, flag) in enumerate(methods.items()):
print('%-10s'%name, end='\t')
for i, (hist, img) in enumerate(zip(hists, imgs)):
#---โฃ ๊ฐ ๋ฉ์๋์ ๋ฐ๋ผ img1๊ณผ ๊ฐ ์ด๋ฏธ์ง์ ํ์คํ ๊ทธ๋จ ๋น๊ต
ret = cv2.compareHist(query, hist, flag)
if flag == cv2.HISTCMP_INTERSECT: #๊ต์ฐจ ๋ถ์์ธ ๊ฒฝ์ฐ
ret = ret/np.sum(query) #๋น๊ต๋์์ผ๋ก ๋๋์ด 1๋ก ์ ๊ทํ
print("img%d:%7.2f"% (i+1 , ret), end='\t')
print()
plt.show()
- ํ์คํ ๊ทธ๋จ์ ๋น๊ตํ ๋ ํฌ๊ธฐ์ ์ฐจ์์ด ๊ฐ์์ผ ํด์ img1 ์ ์ด๋ฏธ์ง ํฌ๊ธฐ์ ๋ง์ถฐ์ resize ํจ
- ์๊ด ๊ด๊ณ์์๋ ์.. ์๋๊ฐ ๋์ง?
- ์นด์ด ์ ๊ณฑ์์๋ ์๋๊ฐ .. ๋ ์ ์ฌํ๋ค? ๋ฌดํ๋๋ก ๊ฐ๋ ๋ง๋ฆฌ์!
- ๊ต์ฐจ ์์๋ ๊ทธ๋๋ง ๋ฎ๋ค ใ ใ
2. ํด๊ณจ ์ผ๊ตด๊ณผ ์ฌ์ ํฉ์ฑ ์ค์ต
# ํด๊ณจ ์ผ๊ตด๊ณผ ์ฌ์ ํฉ์ฑํ๊ธฐ
import cv2
import numpy as np
# ์์์ 15%๋ฅผ ์ํ ๋ธ๋ ๋ฉ์ ๋ฒ์๋ก ์ง์
alpha_width_rate = 15
# ํฉ์ฑํ ๋ ์์ ์ฝ๊ธฐ
img_bone = cv2.imread('img/bone.jpg')
img_rion = cv2.imread('img/rion.jpg')
# ----------img resize---------------------
img_rion = cv2.resize(img_rion, dsize = (728, 607))
# ์
๋ ฅ ์์๊ณผ ๊ฐ์ ํฌ๊ธฐ์ ๊ฒฐ๊ณผ ์์ ์ค๋น
img_comp = np.zeros_like(img_bone)
# ์ฐ์ฐ์ ํ์ํ ์ขํ ๊ณ์ฐ
height, width = img_bone.shape[:2]
middle = width//2 # ์์์ ์ค์ ์ขํ
alpha_width = width * alpha_width_rate // 100 # ์ํ ๋ธ๋ ๋ฉ ๋ฒ์
start = middle - alpha_width//2 # ์ํ ๋ธ๋ ๋ฉ ์์ ์ง์
step = 100/alpha_width # ์ํ ๊ฐ ๊ฐ๊ฒฉ
# ์
๋ ฅ ์์์ ์ ๋ฐ์ฉ ๋ณต์ฌํด์ ๊ฒฐ๊ณผ ์์์ ํฉ์ฑ
img_comp[:, :middle, : ] = img_bone[:, :middle, :].copy()
img_comp[:, middle:, :] = img_rion[:, middle:, :].copy()
cv2.imshow('half', img_comp)
# ์ํ ๊ฐ์ ๋ฐ๊พธ๋ฉด์ ์ํ ๋ธ๋ ๋ฉ ์ ์ฉ
for i in range(alpha_width+1 ):
alpha = (100 - step * i) / 100 # ์ฆ๊ฐ ๊ฐ๊ฒฉ์ ๋ฐ๋ฅธ ์ํ ๊ฐ (1~0)
beta = 1 - alpha # ๋ฒ ํ ๊ฐ (0~1)
# ์ํ ๋ธ๋ ๋ฉ ์ ์ฉ
img_comp[:, start+i] = img_bone[:, start+i] * \
alpha + img_rion[:, start+i] * beta
print(i, alpha, beta)
cv2.imshow('half bone', img_comp)
cv2.waitKey()
cv2.destroyAllWindows()
- ์ํ๊ฐ ์กฐ์ ํด์ ๋ฐ์ชฝ์ ํฉ์ฑํ๋ค
- ๋งค์ฐ ๋ง์กฑ์ค๋ฝ๊ฒ ํฉ์ฑ์ด ๋์ด์ ๋ฟ๋ฏ ^^
- ์ด๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฏธ์ง ํฌ๊ธฐ์ ์ฐจ์ ๋๊ฐ์ด ํด์ค์ผ ํจ
3. ์์ง์ ๊ฐ์ง CCTV ๋ง๋ค๊ธฐ ์ค์ต
: ๋ชจ์ ๊ฐ์งํ๊ธฐ ์ํด์๋ ์ ํ ์์์ ์ฐจ์ด ๊ตฌํ๋ฉด ๋๋ค
: ์ธ ๊ฐ์ ํ๋ ์ a, b, c๋ฅผ ์์ฐจ์ ์ผ๋ก ์ป์ด์ a์ b์ ์ฐจ์ด ๊ทธ๋ฆฌ๊ณ b์ c์ ์ฐจ์ด๊ฐ ๋ชจ๋ ๋ฐ๊ฒฌ๋๋ ๊ฒฝ์ฐ!
์์ง์์ด ์๋ ๊ฒ์ผ๋ก ํ๋จ
# ๋ชจ์
๊ฐ์ง CCTV
import cv2
import numpy as np
# ๊ฐ๋ ์ค์ (์นด๋ฉ๋ผ ํ์ง์ ๋ฐ๋ผ ์กฐ์ ํ์)
thresh = 35 # ๋ฌ๋ผ์ง ํฝ์
๊ฐ ๊ธฐ์ค์น ์ค์
max_diff = 10 # ๋ฌ๋ผ์ง ํฝ์
๊ฐฏ์ ๊ธฐ์ค์น ์ค์
# ์นด๋ฉ๋ผ ์บก์
์ฅ์น ์ค๋น
a, b, c = None, None, None
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) # ํ๋ ์ ํญ์ 480์ผ๋ก ์ค์
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 320) # ํ๋ ์ ๋์ด๋ฅผ 320์ผ๋ก ์ค์
if cap.isOpened():
ret, a = cap.read() # a ํ๋ ์ ์ฝ๊ธฐ
ret, b = cap.read() # b ํ๋ ์ ์ฝ๊ธฐ
while ret:
ret, c = cap.read() # c ํ๋ ์ ์ฝ๊ธฐ
draw = c.copy() # ์ถ๋ ฅ ์์์ ์ฌ์ฉํ ๋ณต์ ๋ณธ
if not ret:
break
# 3๊ฐ์ ์์์ ๊ทธ๋ ์ด ์ค์ผ์ผ๋ก ๋ณ๊ฒฝ
a_gray = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
b_gray = cv2.cvtColor(b, cv2.COLOR_BGR2GRAY)
c_gray = cv2.cvtColor(c, cv2.COLOR_BGR2GRAY)
# a-b, b-c ์ ๋ ๊ฐ ์ฐจ ๊ตฌํ๊ธฐ
diff1 = cv2.absdiff(a_gray, b_gray)
diff2 = cv2.absdiff(b_gray, c_gray)
# ์ค๋ ์ํ๋๋ก ๊ธฐ์ค์น ์ด๋ด์ ์ฐจ์ด๋ ๋ฌด์
ret, diff1_t = cv2.threshold(diff1, thresh, 255, cv2.THRESH_BINARY)
ret, diff2_t = cv2.threshold(diff2, thresh, 255, cv2.THRESH_BINARY)
# ๋ ์ฐจ์ด์ ๋ํด์ AND ์ฐ์ฐ, ๋ ์์์ ์ฐจ์ด๊ฐ ๋ชจ๋ ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ
diff = cv2.bitwise_and(diff1_t, diff2_t)
# ์ด๋ฆผ ์ฐ์ฐ์ผ๋ก ๋
ธ์ด์ฆ ์ ๊ฑฐ ---โ
k = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
diff = cv2.morphologyEx(diff, cv2.MORPH_OPEN, k)
# ์ฐจ์ด๊ฐ ๋ฐ์ํ ํฝ์
์ด ๊ฐฏ์ ํ๋จ ํ ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
diff_cnt = cv2.countNonZero(diff)
if diff_cnt > max_diff:
nzero = np.nonzero(diff) # 0์ด ์๋ ํฝ์
์ ์ขํ ์ป๊ธฐ(y[...], x[...])
cv2.rectangle(draw, (min(nzero[1]), min(nzero[0])), \
(max(nzero[1]), max(nzero[0])), (0,255,0), 2)
cv2.putText(draw, "Motion Detected", (10,30), \
cv2.FONT_HERSHEY_DUPLEX, 0.5, (0,0,255))
# ์ปฌ๋ฌ ์ค์ผ์ผ ์์๊ณผ ์ค๋ ์ํ๋ ์์์ ํตํฉํด์ ์ถ๋ ฅ
stacked = np.hstack((draw, cv2.cvtColor(diff, cv2.COLOR_GRAY2BGR)))
cv2.imshow('motion sensor',stacked )
# ๋ค์ ๋น๊ต๋ฅผ ์ํด ์์ ์์ ์ ๋ฆฌ
a = b
b = c
if cv2.waitKey(1) & 0xFF == 27:
break
- ์ฒ์์ ์์ง์์ ๊ฐ์ง ๋ชปํด์ ๊ธฐ์ค์น๋ฅผ ์ข๋ ๋์์
- ๋์ฌ์ ๊ทธ๋ฐ์ง, ์๋ ๋ด๊ฐ ์ฒ์์ ์ ๋๋ก ์ํ๋ค์๋์ง ํผ ์์ ํ๋๊น ์์ง์์ด ์กํ๋ค
- ์ ์ ๊ธฐํ๋ค
์ค๋์ ์ ๊ธฐํ๊ฑฐ
์ ๋ง๋ํจ ><
'๐ฉโ๐ป IoT (Embedded) > Image Processing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[v0.16]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ๋คํ๊ธฐ (0) | 2022.01.07 |
---|---|
[v0.15]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ์ด๋, ํ๋/์ถ์, ํ์ (0) | 2022.01.06 |
[v0.13]์์์ฒ๋ฆฌ_2์ฐจ์ ํ์คํ ๊ทธ๋จ๊ณผ ์ญํฌ์ (0) | 2022.01.05 |
[v0.12]์์์ฒ๋ฆฌ_ํ์คํ ๊ทธ๋จ(Histogram) (0) | 2022.01.05 |
[v0.11]์์์ฒ๋ฆฌ_์ด๋ฏธ์ง ์ฐ์ฐ (ํฉ์ฑ, ์ํ ๋ธ๋ ๋ฉ, ๋ง์คํน) (0) | 2022.01.02 |