OpenCV์˜ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•๊ณผ Mat ํด๋ž˜์Šค

๋ฐ˜์‘ํ˜•

C++์—์„œ ์‹œ์ž‘ํ•˜๋Š” OpenCV์— ์ด์–ด์„œ, ์˜ค๋Š˜์€ OpenCV์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


OpenCV๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ปดํ“จํ„ฐ์—์„œ ์˜์ƒ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํฌํ† ์ƒต ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” GRAYSCALEํšจ๊ณผ ๋“ฑ์€ ์ด๋Ÿฐ OpenCV์™€ ๋งค์šฐ ํก์‚ฌํ•˜๋ฉฐ ์ด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด๋ฃŒ๋กœ ์ง์ ‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฐ”๋กœ OpenCV์˜€๋‹ค๋Š” ๊ฒƒ์„ ์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.



Image Processing

์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์งˆ๊นŒ์š”? ๊ทธ ์ „์— ์ปดํ“จํ„ฐ์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€๋ถ€ํ„ฐ ํ•œ ๋ฒˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


์œ„์— ์–ด๋–ค ํ•œ ์‚ฌ์ง„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ทธ๋ƒฅ ๊ทธ์ € ์ด๋ฏธ์ง€์ผ ๋ฟ์ด์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๋””์ง€ํ„ธํ™”๋œ ์ด๋ฏธ์ง€๋ผ๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋””์ง€ํ„ธํ™”๋œ ์ด๋ฏธ์ง€๋ž€, Pixel์ด๋ผ ๋ถ€๋ฅด๋Š” ์ ๋“ค์ด ๋ชจ์—ฌ์„œ ํ˜•์ƒ์„ ๋งŒ๋“  ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ด๋ฏธ์ง€๋Š” ์ด ์ ๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ์ปดํ“จํ„ฐ๋Š” ์ด ์ ๋“ค์˜ ๊ฐ’๋“ค์„ ํ†ตํ•ด ์ด๋ฏธ์ง€์˜ ๋ชจ์Šต์„ ๋ฐ”๊พธ์–ด ํ‘œ์‹œํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ‘œํ˜„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์‰ฝ๊ฒŒ ์˜ˆ์‹œ๋ฅผ ํ•œ ๋ฒˆ ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๋””์ง€ํ„ธํ™”๋œ ์ด๋ฏธ์ง€๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ์œ„์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•„์ฃผ ํ™”๋ คํ•˜๊ณ  ๋ฉ‹์ง„ ์‚ฌ์ง„์ด ๋ณด์ด์ง€๋งŒ, ์ปดํ“จํ„ฐ๋Š” ์ด๋ ‡๊ฒŒ ์ˆซ์ž๋กœ ๋œ ๊ฒƒ์„ ํ™”๋ฉด์— ๋„์šฐ๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ์œ„ ํ™”๋ฉด์— ๋‚˜์˜จ ์ˆซ์ž๋Š” 10 x 10 pixel ํฌ๊ธฐ์˜ ์ž„์˜์˜ ์ด๋ฏธ์ง€๋กœ ์šฐ๋ฆฌ๋Š” ์ด ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Matrix(ํ–‰๋ ฌ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


์œ„ Matrix๋„ ๊ทธ ์œ„์— ์žˆ๋Š” Matrix์™€ ํก์‚ฌํ•˜์ง€๋งŒ ๋ญ”๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ ์˜ ๊ฐฏ์ˆ˜๊ฐ€ 10์นธ์ด ์•„๋‹ˆ์ฃ ? ํ•˜์ง€๋งŒ ์œ„ Matrix๋Š” 10 x 10 Pixel์˜ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์™œ ๊ฐ€๋กœ 30๊ฐœ, ์„ธ๋กœ๊ฐ€ 30๊ฐœ์ธ ๊ฑธ๊นŒ์š”?


์ด๋ฏธ์ง€์—๋Š” ์ฑ„๋„์ด๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ฑ„๋„์€ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์ด ์ด๋ฏธ์ง€๊ฐ€ 1์ฑ„๋„ ์ด๋ฏธ์ง€์ธ์ง€, 3์ฑ„๋„ ์ด๋ฏธ์ง€์ธ์ง€ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์–ด๋–ค ์ฐจ์ด๋ƒ๊ตฌ์š”? ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ž˜ ์•Œ๊ณ  ์žˆ๋Š” RGB์˜ ์ฑ„๋„์ž…๋‹ˆ๋‹ค. 1์ฑ„๋„์ด๋ฉด ํ‘๊ณผ ๋ฐฑ, ์ฆ‰ ํ‘๋ฐฑ ์ด๋ฏธ์ง€์ฒ˜๋ฆฌ์ธ ๊ฒƒ์ด๊ณ , 3์ฑ„๋„์ด๋ฉด RGB ํ˜น์€ RGBA๊นŒ์ง€ํ•ด์„œ ์ด ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘์ƒ‰์œผ๋กœ ์ปฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์ฆ‰, ๋˜‘๊ฒ‰์€ 10 x 10 ํ”ฝ์…€์˜ ์ด๋ฏธ์ง€์ด์ง€๋งŒ ๊ฐ€๋กœ 10์นธ, ์„ธ๋กœ 10์นธ์˜ ํ–‰๋ ฌ์€ 1์ฑ„๋„ ์ด๋ฏธ์ง€(ํ‘๋ฐฑ), 

๊ทธ ์•„๋ž˜์— ์žˆ๋Š” ๊ฒƒ์€ 3์ฑ„๋„ ์ด๋ฏธ์ง€(์ปฌ๋Ÿฌ)์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.



OpenCV ๊ธฐ๋ณธ ํด๋ž˜์Šค

์ž ์ด์ œ ์ปดํ“จํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋””์ง€ํ„ธํ™”๋œ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋… ์„ค๋ช…์ด ์ถฉ๋ถ„ํžˆ ๋˜์–ด์กŒ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ , ์ด์ œ ์‹ค์ „ ์ฝ”๋”ฉ์— ๋“ค์–ด๊ฐ€๊ธฐ ์œ„ํ•ด OpenCV์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ธฐ๋ณธ ํด๋ž˜์Šค ํŒŒํŠธ๋Š” ํฌ์ŠคํŠธ๋ฅผ ๋„์ ๊ฑฐ๋ฆด(?) ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์„ค๋ช…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. OpenCV์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ํ•œ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ , ์‰ฌ์šด ์„ค๋ช…์„ ์œ„ํ•ด์„œ ๊ฐ๊ฐ์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ์–ด๋–จ ๋•Œ ์‚ฌ์šฉ์„ ํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•œ ์ˆ™์ง€๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋Š˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋””์ง€ํ„ธํ™”๋œ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ธ Mat ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ๋งŒ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.



Mat ํด๋ž˜์Šค

Mat ํด๋ž˜์Šค๋Š” C++ STL์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์•„๊นŒ ์œ„์—์„œ ๋ดค๋˜ ์ˆซ์ž๋กœ ๋œ ๋””์ง€ํ„ธํ™”๋œ ๋ฐฐ์—ด๋“ค์€ ๋ชจ๋‘ Mat ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•œ ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค. ์ด Mat ํด๋ž˜์Šค๋กœ๋Š” 1์ฑ„๋„ ๋˜๋Š” ๋‹ค์ฑ„๋„์˜ ์ƒ์ˆ˜, ๋ณต์†Œ์ˆ˜, ํ–‰๋ ฌ, ์˜์ƒ ๋“ฑ์˜ ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” n ์ฐจ์› ํ–‰๋ ฌ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.


์‹ค์ œ๋กœ OpenCV 2.4 ๋ฒ„์ „์—์„œ๋Š” C++ STL์—์„œ ์ •์‹์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” Mat ๋Œ€์‹  CvMat์ด๋ผ๊ณ  ํ•˜๋Š” C ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  3.x ๋ฒ„์ „์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ 3.x ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด C++์˜ ๊ธฐ๋ณธ API ์‚ฌ์šฉ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.


๋˜, ๊ธฐ์กด์— CvMat์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•ด OpenCV 3.x ๋ฒ„์ „์—์„œ๋Š” cvarrToMat์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด CvMat์ด๋‚˜ IplImage ๋“ฑ์„ Mat์œผ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ฃผ๋Š” ๋งค์šฐ ์ข‹์€ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฐจํ›„ ํฌ์ŠคํŠธ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ ์ด์ œ Mat ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…์‹œ๋‹ค.



Mat ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์•„๋ฌด๋Ÿฐ ์ƒ์„ฑ์ž ์—†๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ฑฐ๊ธฐ์— create๋ผ๋Š” ํด๋ž˜์Šค ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •ํ•ด์ง„ ํฌ๊ธฐ์™€ ์ž๋ฃŒํ˜•์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 


์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋Š” at์ด๋ผ๋Š” ํด๋ž˜์Šค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด ์™ธ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ Mat ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์‚ฝ์ž…ํ•  ์ˆ˜๋„ ์žˆ๊ณ , Scalar ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์š”์†Œ ์‚ฝ์ž…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์ฐจํ›„ ํฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ ๋” ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‹ค๋งŒ Mat ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ํ•ด์•ผํ•  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


์œ„ ์ฝ”๋“œ๋Š” Mat ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐ์—ด๋กœ data๋ฅผ ์ฃผ์–ด์ค€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ ๋ฌธ์ œ์ ์€ ์š”์†Œ์˜ ๊ฐฏ์ˆ˜๋Š” 9๊ฐœ์ธ๋ฐ, 10 x 10 ํฌ๊ธฐ์˜ Matrix๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ C++ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ ๋นˆ ์š”์†Œ์˜ ๊ฐ’์€ 0์ด ์•„๋‹Œ ์“ฐ๋ ˆ๊ธฐ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋  ๊ฒฝ์šฐ, ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ 0์˜ ์š”์†Œ๋กœ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹˜์„ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ ๋‹จ์ผ ์ƒ‰๊น”์˜ ์ด๋ฏธ์ง€๋ฅผ ํ‘œํ˜„ํ•ด๋ณด๊ณ , ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.


3 Channel์˜ Matrix 3๊ฐœ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ๊ฐ ์ปฌ๋Ÿญ๊ฐ’์„ ์‚ฝ์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. Scalar์˜ ๊ฒฝ์šฐ, R, G, B๊ฐ€ ์•„๋‹Œ B, G ,R ๊ฐ’์˜ ์ˆœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋นจ๊ฐ„์ƒ‰์„ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด 0๋ฒˆ์งธ Scalar๊ฐ€ ์•„๋‹Œ 2๋ฒˆ์จฐ Scalar์— ์š”์†Œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments