๐Ÿ“– Theory/Computer Vision

[CV] ์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ & ์นด๋ฉ”๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ | 2D ์ด๋ฏธ์ง€์™€ 3D ์›”๋“œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ญ…์ฆค 2022. 3. 28. 15:33
๋ฐ˜์‘ํ˜•
์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ (Camera Calibration)

 

์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜(camera calibration)์€ ์นด๋ฉ”๋ผ์˜ ๋ฌผ๋ฆฌ์  ํŠน์„ฑ์„ ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด 3D ๊ณต๊ฐ„์—์„œ์˜ ๋ฌผ์ฒด์˜ ์œ„์น˜๋‚˜ ํ˜•ํƒœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •์ด์—์š”. ์ด ๊ณผ์ •์€ ์นด๋ฉ”๋ผ๊ฐ€ ์ฐ์€ 2D ์ด๋ฏธ์ง€์™€ ์‹ค์ œ 3D ์›”๋“œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•˜๊ณ , ์ด๋ฏธ์ง€์—์„œ ์™œ๊ณก๋œ ๋ถ€๋ถ„์„ ๋ณด์ •ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ฆฌ์—์…˜ ํ›„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ์˜ˆ์‹œ

 

์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜์˜ ์ฃผ์š” ๊ณผ์ •์€ ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”์ •ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Ÿฌํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ์ฆˆ ์™œ๊ณก์„ ์ˆ˜์ •ํ•˜๊ณ  ์นด๋ฉ”๋ผ ์œ„์น˜๋ฅผ ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

 


 

1. ์นด๋ฉ”๋ผ ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ (Intrinsic camera parameters)

1.1. ์ดˆ์  ๊ฑฐ๋ฆฌ(focal length)

  • ์นด๋ฉ”๋ผ ๋ Œ์ฆˆ์˜ ์ดˆ์  ๊ฑฐ๋ฆฌ๋กœ, ์ด๋ฏธ์ง€ ์„ผ์„œ(CCD, CMOS ๋“ฑ)์™€ ๋ Œ์ฆˆ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ
  • ์นด๋ฉ”๋ผ ๋ชจ๋ธ์—์„œ ์ดˆ์ ๊ฑฐ๋ฆฌ(f)๋Š” ํ”ฝ์…€ ๋‹จ์œ„๋กœ ํ‘œํ˜„(์˜์ƒ์—์„œ์˜ ๊ธฐํ•˜ํ•™์  ํ•ด์„์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ)
  • ์ฃผ๋กœ fx, fy๋กœ ํ‘œํ˜„
  • fx,fy๊ฐ€ ๋”ฐ๋กœ ์žˆ๋Š” ์ด์œ ๋Š” ์ด๋ฏธ์ง€ ์„ผ์„œ์˜ ๋ฌผ๋ฆฌ์ ์ธ ์…€ ๊ฐ„๊ฒฉ์ด ๊ฐ€๋กœ ๋ฐฉํ–ฅ๊ณผ ์„ธ๋กœ ๋ฐฉํ–ฅ์ด ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

 

1.2. ์ฃผ์ (principal point)

  • ์ด๋ฏธ์ง€ ์„ผ์„œ์˜ ์ค‘์‹ฌ์ ์œผ๋กœ, ๋ณดํ†ต ์ด๋ฏธ์ง€์˜ ์ค‘์‹ฌ๊ณผ ์ผ์น˜ํ•จ
  • ์นด๋ฉ”๋ผ ๋ Œ์ฆˆ์˜ ์ค‘์‹ฌ์—์„œ ์ด๋ฏธ์ง€ ์„ผ์„œ์— ๋‚ด๋ฆฐ ์ˆ˜์„ ์˜ ๋ฐœ์˜ ์˜์ƒ ์ขŒํ‘œ
  • ์˜์ƒ ์ค‘์‹ฌ์ ๊ณผ๋Š” ๋‹ค๋ฅธ ์˜๋ฏธ (์นด๋ฉ”๋ผ ์กฐ๋ฆฝ๊ณผ์ •์—์„œ ๋ Œ์ฆˆ์™€ ์ด๋ฏธ์ง€ ์„ผ์„œ๊ฐ€ ์ˆ˜ํ‰์ด ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ)
  • ์ฃผ๋กœ cx, cy๋กœ ํ‘œํ˜„

 

1.3. ์™œ๊ณก ๊ณ„์ˆ˜(distortion coefficients)

  • ๋ Œ์ฆˆ ์™œ๊ณก์œผ๋กœ ์ธํ•œ ์ด๋ฏธ์ง€ ์™œ๊ณก์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฉ์‚ฌ ์™œ๊ณก(radial distortion)๊ณผ ์ ‘์„  ์™œ๊ณก(tangential distortion)์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ
  • ์š”์ฆ˜ ์นด๋ฉ”๋ผ๋“ค์€ ์ด๋Ÿฌํ•œ skew ์—๋Ÿฌ๊ฐ€ ๊ฑฐ์˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์นด๋ฉ”๋ผ ๋ชจ๋ธ์—์„œ ๋ณดํ†ต ๋น„๋Œ€์นญ ๊ณ„์ˆ˜๊นŒ์ง€ ๊ณ ๋ คํ•˜์ง€๋Š” ์•Š์Œ
  • skew_c = tana

 

2. ์นด๋ฉ”๋ผ ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ (Extrinsic camera parameters)

์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์นด๋ฉ”๋ผ์˜ ์œ„์น˜์™€ ๋ฐฉํ–ฅ์„ 3D ๊ณต๊ฐ„์—์„œ ์ •์˜ํ•˜๋ฉฐ, ์ฃผ๋กœ ํšŒ์ „ ํ–‰๋ ฌ๊ณผ ์ด๋™ ๋ฒกํ„ฐ๋กœ ๊ตฌ์„ฑ๋ผ์š”. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์€ ์›”๋“œ ์ขŒํ‘œ๊ณ„์—์„œ ์นด๋ฉ”๋ผ ์ขŒํ‘œ๊ณ„๋กœ์˜ ๋ณ€ํ™˜์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ฃ . ๋˜ํ•œ ์นด๋ฉ”๋ผ ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์นด๋ฉ”๋ผ์˜ ์œ„์น˜์™€ ๋ฐฉํ–ฅ(6-DoF)์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ณ  ์›”๋“œ ์ขŒํ‘œ๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ์„œ๋„ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด์š”.

 

Rotation & Translation

 

2.1. ํšŒ์ „ ํ–‰๋ ฌ(Rotation matrix)

  • ํšŒ์ „ ํ–‰๋ ฌ์€ ์นด๋ฉ”๋ผ์˜ ํšŒ์ „ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์›”๋“œ ์ขŒํ‘œ๊ณ„์—์„œ ์นด๋ฉ”๋ผ ์ขŒํ‘œ๊ณ„๋กœ 3D ๊ณต๊ฐ„์„ ํšŒ์ „์‹œํ‚ค๋Š” ์—ญํ• 
  • 3x3 ํฌ๊ธฐ์˜ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์นด๋ฉ”๋ผ๊ฐ€ ์›”๋“œ ์ขŒํ‘œ๊ณ„์—์„œ ์–ด๋–ป๊ฒŒ ํšŒ์ „๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ

 

 2.2. ์ด๋™ ๋ฒกํ„ฐ(Translation vector)

  • ์ด๋™ ๋ฒกํ„ฐ๋Š” ์นด๋ฉ”๋ผ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์›”๋“œ ์ขŒํ‘œ๊ณ„์—์„œ ์นด๋ฉ”๋ผ ์ขŒํ‘œ๊ณ„๋กœ์˜ ํ‰ํ–‰ ์ด๋™์„ ์„ค๋ช…
  • 3D ๊ณต๊ฐ„์—์„œ ์นด๋ฉ”๋ผ์˜ ์›์ ์„ ํŠน์ • ์œ„์น˜๋กœ ์ด๋™์‹œํ‚ค๋Š” ์—ญํ• 

 

2.3. ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ™œ์šฉ

2.3.1. ์›”๋“œ ์ขŒํ‘œ๊ณ„์—์„œ ์นด๋ฉ”๋ผ ์ขŒํ‘œ๊ณ„๋กœ์˜ ๋ณ€ํ™˜

 

  • ์›”๋“œ ์ขŒํ‘œ๊ณ„์—์„œ ์ฃผ์–ด์ง„ 3D ์  Pw๋ฅผ ์นด๋ฉ”๋ผ ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด, ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์™€ ๊ฐ™์ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Œ
  • Pc๋Š” ์นด๋ฉ”๋ผ ์ขŒํ‘œ๊ณ„์—์„œ์˜ ํฌ์ธํŠธ ์œ„์น˜์ž„

 

 

2.3.2. ์นด๋ฉ”๋ผ ์ขŒํ‘œ๊ณ„์—์„œ ์ด๋ฏธ์ง€ ํ‰๋ฉด์œผ๋กœ์˜ ํˆฌ์˜

  • ๋ณ€ํ™˜๋œ ์  Pc๋ฅผ ์ด๋ฏธ์ง€ ํ‰๋ฉด์œผ๋กœ ํˆฌ์˜ํ•˜๋ ค๋ฉด, ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ ์šฉ
  • ์ด ๊ณผ์ •์€ ์นด๋ฉ”๋ผ ๋ชจ๋ธ์˜ ํ•ต์‹ฌ์ด๋ฉฐ, ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ด ๊ณผ์ •์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰

 

3. ์นด๋ฉ”๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

3.1. ๋Œ€์‘์  ์ถ”์ถœ

์นด๋ฉ”๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, 3D ๊ณต๊ฐ„์˜ ์ ๋“ค๊ณผ ์ด ์ ๋“ค์ด 2D ์ด๋ฏธ์ง€์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋Œ€์‘์ ์ด ํ•„์š”ํ•ด์š”. ์ด๋Ÿฌํ•œ ๋Œ€์‘์ ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด์š”.

  • ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ํŒจํ„ด ํ™œ์šฉ: ์ฒด์ปค๋ณด๋“œ๋‚˜ ์›ํ˜• ๊ทธ๋ฆฌ๋“œ์™€ ๊ฐ™์€ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ, ๊ทธ ํŒจํ„ด์˜ 3D ์ขŒํ‘œ์™€ 2D ์ด๋ฏธ์ง€์—์„œ์˜ ์ขŒํ‘œ ๊ฐ„์˜ ๋Œ€์‘์„ ์ถ”์ถœ
  • ํŠน์ง•์  ๋งค์นญ: ์ด๋ฏธ์ง€์—์„œ ์ถ”์ถœํ•œ ํŠน์ง•์ ๋“ค(์˜ˆ: ์ฝ”๋„ˆ, ์—์ง€ ๋“ฑ)์„ 3D ๋ชจ๋ธ์ด๋‚˜ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€์˜ ํŠน์ง•์ ๋“ค๊ณผ ๋งค์นญํ•˜์—ฌ ๋Œ€์‘์ ์„ ์ถ”์ถœ
  • ์ž์—ฐ ํ™˜๊ฒฝ ํ™œ์šฉ
    • ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ํŒจํ„ด ์—†์ด, ์ฃผ๋ณ€ ํ™˜๊ฒฝ์˜ 3D ๊ตฌ์กฐ์™€ ์ด๋ฏธ์ง€์—์„œ์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€์‘์ ์„ ์ถ”์ถœํ•  ์ˆ˜๋„ ์žˆ์Œ
    • ์ด ๊ฒฝ์šฐ, ์‚ฌ์ „์— ํ™˜๊ฒฝ์˜ 3D ๋ชจ๋ธ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ SLAM (Simultaneous Localization and Mapping)๊ณผ ๊ฐ™์€ ๊ธฐ๋ฒ•์ด ํ•„์š”

 

3.2. ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”์ •

๋Œ€์‘์ ๋“ค์„ ์–ป์€ ํ›„, ์นด๋ฉ”๋ผ์˜ ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋น„์„ ํ˜• ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ์š”. ์ด ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”.

  • ํ•€ํ™€ ์นด๋ฉ”๋ผ ๋ชจ๋ธ ์ ์šฉ: ๋Œ€์‘์ ๋“ค์„ ํ†ตํ•ด ์นด๋ฉ”๋ผ์˜ ๊ธฐ๋ณธ ํˆฌ์˜ ๋ชจ๋ธ(ํ•€ํ™€ ๋ชจ๋ธ)์„ ์ ์šฉํ•˜์—ฌ 3D ์ขŒํ‘œ๊ฐ€ 2D ์ด๋ฏธ์ง€๋กœ ์–ด๋–ป๊ฒŒ ํˆฌ์˜๋˜๋Š”์ง€๋ฅผ ์ˆ˜ํ•™์ ์œผ๋กœ ๋ชจ๋ธ๋ง
  • ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ
    • ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”์ •์€ ๋ณดํ†ต Levenberg-Marquardt ๊ฐ™์€ ๋น„์„ ํ˜• ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰๋จ
    • ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชจ๋ธ์ด ์˜ˆ์ธกํ•œ 2D ์œ„์น˜์™€ ์‹ค์ œ 2D ์ด๋ฏธ์ง€์—์„œ ์ธก์ •๋œ ์œ„์น˜ ๊ฐ„์˜ ์˜ค์ฐจ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์กฐ์ •

 

3.3. ์™œ๊ณก ๋ณด์ •

์นด๋ฉ”๋ผ ๋ Œ์ฆˆ์˜ ์™œ๊ณก์œผ๋กœ ์ธํ•ด ์ด๋ฏธ์ง€๊ฐ€ ์™œ๊ณก๋  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ์ถ”์ •๋œ ์™œ๊ณก ๊ณ„์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋ณด์ •ํ•˜์—ฌ ์‹ค์ œ 3D ๊ตฌ์กฐ์™€ ์ผ์น˜ํ•˜๋Š” ์กฐ๊ธˆ ๋” ์ •ํ™•ํ•œ 2D ์ด๋ฏธ์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”.

 

 

[์นด๋ฉ”๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ ํ™œ์šฉ ์˜ˆ์‹œ]

 

์นด๋ฉ”๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ์ถ”์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 3D ์›”๋“œ ์ขŒํ‘œ์™€ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” 2D ์˜์ƒ ์ขŒํ‘œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์ฃ ? ์ฒด์ปค๋ณด๋“œ์™€ ๊ฐ™์ด ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ํŒจํ„ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ฌ๋Ÿฌ ์˜์ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋Œ€์‘์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , ๋Œ€์‘์ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์นด๋ฉ”๋ผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ์นด๋ฉ”๋ผ ์˜์ƒ์€ 3D ๊ณต๊ฐ„์ƒ์˜ ์ ๋“ค์„ 2D ์ด๋ฏธ์ง€ ํ‰๋ฉด์— ํ”„๋กœ์ ์…˜ํ•˜์—ฌ ์–ป์–ด์ง€๊ณ , ํ•€ํ™€ ์นด๋ฉ”๋ผ ๋ชจ๋ธ์—์„œ ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜ ๊ด€๊ณ„๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ชจ๋ธ๋ง๋ผ์š”

  • X, Y, Z  : ์›”๋“œ ์ขŒํ‘œ๊ณ„ ์ƒ์˜ 3D ์ 
  • [R|t] : ์›”๋“œ ์ขŒํ‘œ๊ณ„๋ฅผ ์นด๋ฉ”๋ผ ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํšŒ์ „/์ด๋™ ๋ณ€ํ™˜ ํ–‰๋ ฌ - Extrinsic camera parameters
  • A : ์นด๋ฉ”๋ผ ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ ํ–‰๋ ฌ - Intrinsic camera parameters

* A์™€ [R|t]๋ฅผ ํ•ฉ์ณ camera matrix ๋˜๋Š” projection matrix ๋ผ ๋ถ€๋ฆ„

 

3. ์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์˜ˆ์ œ ์ฝ”๋“œ

import numpy as np
import cv2 as cv
import glob

# ์ข…๋ฃŒ ์กฐ๊ฑด ์„ค์ •: epsilon ๋˜๋Š” ์ตœ๋Œ€ ๋ฐ˜๋ณต ํšŸ์ˆ˜(30)์— ๋„๋‹ฌํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ข…๋ฃŒ
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# ์ฒด์ปค๋ณด๋“œ์˜ 3D ๊ณต๊ฐ„ ์ƒ์˜ ์ขŒํ‘œ ์ค€๋น„
# ์˜ˆ: (0,0,0), (1,0,0), (2,0,0), ..., (6,5,0)
objp = np.zeros((6*7, 3), np.float32)
objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)

# ๋ชจ๋“  ์ด๋ฏธ์ง€์—์„œ ๊ฐ์ฒด ์ขŒํ‘œ์™€ ์ด๋ฏธ์ง€ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด
objpoints = []  # ์‹ค์ œ 3D ๊ณต๊ฐ„์—์„œ์˜ ์ ๋“ค
imgpoints = []  # ์ด๋ฏธ์ง€ ํ‰๋ฉด์—์„œ์˜ 2D ์ ๋“ค

# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  jpg ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ด
images = glob.glob('*.jpg')

# ๊ฐ ์ด๋ฏธ์ง€๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌ
for fname in images:
    # ์ด๋ฏธ์ง€๋ฅผ ์ฝ๊ณ  ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ๋กœ ๋ณ€ํ™˜
    img = cv.imread(fname)
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    # ์ฒด์ปค๋ณด๋“œ ์ฝ”๋„ˆ๋ฅผ ์ฐพ์Œ
    ret, corners = cv.findChessboardCorners(gray, (7, 6), None)

    # ์ฝ”๋„ˆ๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด, ๊ฐ์ฒด ์ขŒํ‘œ์™€ ์ด๋ฏธ์ง€ ์ขŒํ‘œ๋ฅผ ์ถ”๊ฐ€
    if ret == True:
        objpoints.append(objp)  # ๊ฐ์ฒด ์ขŒํ‘œ ์ถ”๊ฐ€
        # ์ฝ”๋„ˆ ์œ„์น˜๋ฅผ ๋” ์ •๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •
        corners2 = cv.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
        imgpoints.append(corners2)  # ์ด๋ฏธ์ง€ ์ขŒํ‘œ ์ถ”๊ฐ€

        # ์ฒด์ปค๋ณด๋“œ ์ฝ”๋„ˆ๋ฅผ ์ด๋ฏธ์ง€์— ๊ทธ๋ ค์„œ ํ‘œ์‹œ
        cv.drawChessboardCorners(img, (7, 6), corners2, ret)
        cv.imshow('img', img)  # ์ด๋ฏธ์ง€๋ฅผ ์ฐฝ์— ํ‘œ์‹œ
        cv.waitKey(1000)  # 1์ดˆ ๋™์•ˆ ๋Œ€๊ธฐ

cv.destroyAllWindows()  # ๋ชจ๋“  ์ฐฝ ๋‹ซ๊ธฐ

# ์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์ˆ˜ํ–‰
ret, mtx, dist, rvecs, tvecs = cv.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

# ๊ฒฐ๊ณผ ์ถœ๋ ฅ
print(ret, mtx, dist, rvecs, tvecs, sep='\n')

 

  • criteria ์„ค์ •
    • criteria๋Š” ์ฝ”๋„ˆ ๊ฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉํ•  ์ข…๋ฃŒ ์กฐ๊ฑด
    • ์—ฌ๊ธฐ์„œ๋Š” ์ตœ๋Œ€ 30๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ์ •ํ™•๋„๊ฐ€ 0.001 ์ดํ•˜๋กœ ๋‚ฎ์•„์ง€๋ฉด ์ข…๋ฃŒ
  • ์ฒด์ปค๋ณด๋“œ์˜ 3D ์ขŒํ‘œ ์ƒ์„ฑ
    • objp๋Š” ์ฒด์ปค๋ณด๋“œ์˜ ๊ฐ ๊ต์ฐจ์ ์˜ 3D ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • Z๊ฐ’์€ ๋ชจ๋‘ 0์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ, 7x6 ์ฒด์ปค๋ณด๋“œ์˜ ํ‰๋ฉด ์ขŒํ‘œ๋ฅผ ์ •์˜
  • ์ด๋ฏธ์ง€์—์„œ ์ฒด์ปค๋ณด๋“œ ์ฝ”๋„ˆ ๊ฐ์ง€
    • cv.findChessboardCorners๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ด๋ฏธ์ง€์—์„œ ์ฒด์ปค๋ณด๋“œ ์ฝ”๋„ˆ๋ฅผ ๊ฒ€์ถœ
    • ์ฝ”๋„ˆ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ํ•ด๋‹น ์ฝ”๋„ˆ์˜ ์œ„์น˜๋ฅผ ์ •๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•˜์—ฌ corners2์— ์ €์žฅ
  • ์ฝ”๋„ˆ๋ฅผ ์ฐพ์€ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ
    • objpoints ๋ฆฌ์ŠคํŠธ์—๋Š” 3D ๊ฐ์ฒด ์ (์‹ค์ œ ์ขŒํ‘œ)์„ ์ถ”๊ฐ€ํ•˜๊ณ 
    • imgpoints ๋ฆฌ์ŠคํŠธ์—๋Š” ํ•ด๋‹น ์ ์— ๋Œ€์‘ํ•˜๋Š” ์ด๋ฏธ์ง€ ํ‰๋ฉด์˜ 2D ์ขŒํ‘œ๋ฅผ ์ถ”๊ฐ€
  • ์ฝ”๋„ˆ๋ฅผ ์ด๋ฏธ์ง€์— ํ‘œ์‹œ
    • cv.drawChessboardCorners๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ง€๋œ ์ฝ”๋„ˆ๋ฅผ ์ด๋ฏธ์ง€ ์œ„์— ๊ทธ๋ฆผ
  • ์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์ˆ˜ํ–‰
    • cv.calibrateCamera ํ•จ์ˆ˜๋Š” ๋ชจ์€ 3D ๊ฐ์ฒด ์ขŒํ‘œ์™€ 2D ์ด๋ฏธ์ง€ ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์นด๋ฉ”๋ผ์˜ ๋‚ด๋ถ€ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์™œ๊ณก ๊ณ„์ˆ˜(dist), ๊ฐ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ํšŒ์ „ ๋ฒกํ„ฐ(rvecs)์™€ ๋ณ€ํ™˜ ๋ฒกํ„ฐ(tvecs)๋ฅผ ๊ณ„์‚ฐ
  • ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    • ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ถ”์ •๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์ด ์ถœ๋ ฅ๋จ
    • ret์€ ์ตœ์ ํ™” ๊ฒฐ๊ณผ์˜ ์žฌํˆฌ์˜ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, mtx๋Š” ์นด๋ฉ”๋ผ ๋งคํŠธ๋ฆญ์Šค, dist๋Š” ์™œ๊ณก ๊ณ„์ˆ˜, rvecs๋Š” ํšŒ์ „ ๋ฒกํ„ฐ, tvecs๋Š” ๋ณ€ํ™˜ ๋ฒกํ„ฐ๋ฅผ ํ‘œํ˜„

 

 

cv.calibrationCamera() ๊ฒฐ๊ณผ

 


 

์นด๋ฉ”๋ผ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ์ถ”์ •์€ ์ปดํ“จํ„ฐ ๋น„์ „์—์„œ ํ•„์ˆ˜์ ์ธ ๊ณผ์ •์œผ๋กœ, ์ •ํ™•ํ•œ 3D ์ •๋ณด๋ฅผ ์–ป๊ณ  ์™œ๊ณก์„ ๋ณด์ •ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ด์š”. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์†Œ๊ฐœํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ, ์—ฌ๋Ÿฌ๋ถ„๋„ ์ž์‹ ์˜ ์นด๋ฉ”๋ผ๋ฅผ ์ •ํ™•ํžˆ ์„ค์ •ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋น„์ „ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ™œ์šฉํ•ด ๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ดํ•ด๊ฐ€ ์–ด๋ ต๋‹ค๋ฉด ์‹ค์Šต์„ ํ†ตํ•ด ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”! ์ €๋„ ๊ทธ๋žฌ์œผ๋‹ˆ๊นŒ์š” ๐Ÿ˜ข

 

๋ฐ˜์‘ํ˜•