카메라 캘리브레이션 프로그램 (DarkCamCalibrator)

개발한 것들 2014.07.17 21:14

카메라 캘리브레이션을 할 때 편하게 사용할 목적으로 개발한 프로그램입니다. 필요하신 분은 편하게 가져다 사용하시기 바랍니다 (실행파일 하나로 구성되어 있으며 별도 설치가 필요없고 바로 실행가능합니다).



다운로드:


DarkCamCalibrator.zip




- 'Live Cam' 버튼을 눌러 웹캠과 실시간 연결한 후 스페이스 바를 눌러서 이미지 획득

- 또는 'Load Images..' 버튼을 눌러 캘리브레이션 패턴을 촬영한 이미지들을 불러옴

- 캘리브레이션에 사용된 패턴(체스판)의 형태는 Grid Rows, Grid Cols, Cell Sz(mm)로 설정

- Grid Rows & Cols는 격자패턴의 가로(행), 세로(열) 방향 격자의 개수이며 Cell sz는 하나의 격자 셀의 실제 크기(단위: mm)

- 'SHOW' 버튼을 누르면 Grid Rows, Grid Cols를 제대로 입력했는지 확인할 수 있음

- 'Detect Corners' 버튼을 눌러서 코너점 검출 (검출에 성공한 경우 자동으로 체크됨)

- 'Calibrate (Polynomial)' 또는 'Calibrate (Fisheye)' 버튼을 눌러서 캘리브레이션 수행

- Fisheye 방법의 경우, 어느 정도 결과값이 수렴하는 것처럼 보이면 "Stop" 버튼을 눌러서 캘리브레이션을 종료시켜야 함

- 단, 이미지 목록에서 체크표시된 이미지에 대해서만 캘리브레이션이 수행됨

- 특정 이미지를 캘리브레이션 과정에서 제외하고 싶으면 이미지 목록에서 체크 해제



굳이 직접 구현한 이유


공개된 카메라 캘리브레이션 프로그램으로 이미 GML Camera Calibration Toolbox라는 훌륭한 프로그램이 있습니다. 그럼에도 불구하고 굳이 다시 구현한 이유는 다음과 같습니다.


개발한 프로그램은 아래 그림처럼 fisheye 렌즈왜곡 모델에 대한 캘리브레이션도 가능합니다.




광각렌즈의 왜곡을 펼때 사용될 수 있는 fisheye 렌즈왜곡 모델은 GML Calibration Toolbox 프로그램이나 OpenCV로는 파라미터를 구할수 없기 때문에 직접 구현해 보았습니다. 그리고, 이왕 구현한 김에 일반적으로 많이 사용되는 polynomial 렌즈왜곡 모델(논문: Z. Zhang. “A Flexible New Technique for Camera Calibration”, IEEE Trans. Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000 )도 같이 캘리브레이션이 가능하도록 구현하였습니다.


실제로 해보니 fisheye 모델이 영상 테두리 부분에서 좀더 자연스럽게 왜곡이 펴지는 것 같습니다. 그리고 fisheye 모델은 왜곡보정된 좌표를 atan 함수계산 한번으로 곧바로 구할 수 있다는 장점이 있습니다 (fisheye 모델 논문: F. Devernay and O. D. Faugeras. Straight lines have to be straight. Machine Vision and Applications, 13(1):14–24, 2001.)


카메라 한대로 3차원 공간 매핑 및 위치추적이 가능한 PTAM/PTAMM 기술의 경우 내부적으로 fisheye 모델을 사용하는데, PTAM에서 제공하는 캘리브레이션 프로그램은 너무 버벅대고 사용이 불편합니다. 하지만, 이 프로그램을 이용하면 간단하게 캘리브레이션이 가능합니다.


그리고 또 하나의 이유는 기존 프로그램들은 이미지를 따로 캡쳐한 후 프로그램에서 불러와서 캘리브레이션을 수행해야 하는데, 이게 은근 성가십니다. 그래서 카메라(웹캠)에서 직접 영상을 실시간으로 획득하면서 캘리브레이션을 해 볼수 있도록 프로그램을 구현해 보았습니다.



WebCam + PGR 카메라 지원 버전 다운로드


혹시 필요하신 분이 있을 것 같아서 PGR(Point Grey Research) 카메라 연결을 지원하는 버전도 같이 올립니다. LiveCam 버튼을 누르면 만일 컴퓨터에 PGR 카메라가 연결되어 있으면 웹캠 연결여부와 관계없이 PGR 카메라와 연결되고, PGR 카메라가 없을 경우에는 웹캠과 연결을 시도합니다.


DarkCamCalibratorPGR.zip



참고사항


- Zhang 방법(polynomial 모델)은 opencv의 코드를 그대로 이용한 것이기 때문에 opencv와 성능상의 차이는 없습니다.


- 원래 제가 블로그에 올리는 프로그램들은 windows xp 이상인 모든 pc에서 단독으로 동작하도록 만듭니다만 이번 것은 vista, win 7, ... 이상에서만 동작하고 xp에서는 실행이 안될 수도 있습니다.


- 이미지는 기본적으로 원본 크기로 보여주나 크기가 너무 큰 경우(960 x 720 이상)에는 크기를 줄여서 보여줍니다.


- 최근 일부 모니터의 화면 해상도에서 프로그램의 레이아웃이 이상하게 표시되는 것이 확인되어서 이를 수정한 버전을 2016.7.15일자로 다시 올렸습니다.



by 다크 프로그래머


  • 이전 댓글 더보기
  • 우니 2015.12.06 16:12 신고 ADDR 수정/삭제 답글

    안녕하세요, 오랜만에 다시 들렀습니다.
    궁금한게 생겼는데

    캘리브레이션에 입력이미지로 넣은 axb사이즈 이미지로 얻은 intrinsic, distorsion 파라미터들을 가지고 같은카메라로 촬영한 axb사이즈의 이미지에 어떤 자세로(cvfindextrinsic~~) 물체를 증강시키는건 두말할 필요 없이 잘 됩니다.

    근데 요즘 이미지들(스마트폰만 해도 해상도가 ㄷㄷ) 해상도가 너무 커서 해상도를 줄여서 작업하는데, 위의 axb에서 얻은 intrinsic distorsion 파라미터들을 같은카메라로 찍었지만 해상도를 절반으로 줄인 0.5a x 0.5b이미지에 같은방법으로 extrinsic 파라미터들을 적용하면 증강이 이상하게 되는 현상이 나타납니다. 캘리브레이션 입력이미지도 같이 0.5a x 0.5b로 맞춰주면 해결될것으로 보입니다만,

    한마디로 요약하면 : 똑같은 체스판을 같은위치/방향에서 촬영했지만 이미지 해상도를 변경해서 캘리브레이션을 수행하면 결과로 얻는 파라미터들이 달라질까요? (저는 yes라고 생각합니다) 의견 여줘봅니다!

    • BlogIcon 다크pgmr 2015.12.07 09:14 신고 수정/삭제

      이미지의 크기가 1/2이 되면 fx, fy, cx ,cy도 1/2로 해주면 됩니다.

    • 우니 2015.12.07 21:49 신고 수정/삭제

      (uvw) = k E (xyz)
      여서 uvw가 1/2이면 E가 고정이니 k가 1/2이 되는게 맞나요?
      이론상으로는 그렇게 보이기는 하는데
      캘리브레이션을 할 때 나오는 distorsion coefficients를 고려해서 k 가 계산이 되어서 실제로 원본이미지 캘리브레이션 결과가 1/2이미지 캘리브레이션 결과가 정확하게 절반이 안되는 것 같아 여쭤봅니다.
      비율만큼 줄여서 증강을 시켜보는데도 원본이미지만큼 정확하게 증강이 되질 않네요

    • BlogIcon 다크pgmr 2015.12.08 17:34 신고 수정/삭제

      왜곡 계수는 normalized image 좌표에서 계산되기 때문에 이미지 해상도와는 무관합니다. 아마도 다른 원인이 있을 것으로 생각됩니다..

    • 우니 2015.12.09 09:53 신고 수정/삭제

      다른쪽에도 한번 찾아봤는데,
      실제로 캘리브레이션 계수 f, c에 scale값이 있어서 sf, sc 형태로 있는 것 같습니다. 게다가 scale s가 non linear 형태로 구성되어 있어 다른지 않나 싶네요

  • 갱해이 2016.02.26 01:53 신고 ADDR 수정/삭제 답글

    안녕하세요.
    3D Scanner를 제작하고 있는 대학생입니다.
    스캐닝하기 전에 켈리브레이션을 실행하려고 하는데 별도의 스페이스 바 키 필요없이
    몇초마다 한장씩 찍어서 360도 돌게끔 하고 싶은데요. 방법이 있을까요??

    • BlogIcon 다크pgmr 2016.02.26 10:01 신고 수정/삭제

      윈도우즈 환경이라면 WM_TIMER 메시지를 활용해서 타이머를 설정하시면 되지 않을까요?

  • 롱기 2016.05.01 22:26 신고 ADDR 수정/삭제 답글

    안녕하세요
    프로그램 하면서 궁금한게 있습니다.
    거리에 따라 상관없이 사진을 찍었을때 Focal Length와 principal point 가 똑같이 나와야 하나요??
    거리에 따라 내부파라메터 값은 같다고 생각을 했는데 실제 적용을 해보니 차이가 좀 나서 제가 생각이 잘못 했나 싶어서 질문을 하게 되었습니다.

    • BlogIcon 다크pgmr 2016.05.01 23:20 신고 수정/삭제

      네, 동일해야 합니다만 영상인식 오차(체스판의 꼭지점을 추출하는데 있어서 오차)와 캘리브레이션의 알고리즘의 오차(정확한 해를 구하는 것이 아니라 최적화 기법을 이용해서 해를 근사적으로 탐색) 등으로 인해 결과가 조금씩 달라질 수 있습니다. 체스판이 카메라로부터 멀면 멀수록 꼭지점 추정 오차가 커질 수 있기 때문에 캘리브레이션은 가급적 가까이에서 수행하는 것이 좋습니다. 그리고 만일 그 차이가 생각보다 너무 크다면 혹시 오토 포커싱 기능이 켜져 있는 건 아닌지 확인해 보시기 바랍니다.

  • 연구원 2016.05.02 02:28 신고 ADDR 수정/삭제 답글

    다크님 안녕하세요~
    fisheye 렌즈왜곡 모델에서 추정한 w파라미터(w = 0.029165)가
    의미하는 바가 무엇인지 알려주실 수 있나요? 감사합니당

    • BlogIcon 다크pgmr 2016.05.02 13:31 신고 수정/삭제

      저도 왜곡계수 정도로만 알고 있습니다. w의 의미를 알려면 FOV 왜곡모델의 식이 어떻게 나왔는지 알아야 하는데, 논문에 있는 설명만으로는 알기 어려운 것 같습니다.

  • 누크 2016.06.19 15:12 신고 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님
    캘리브레이션 프로그램을 만드는 중에 궁금한 것이 생겨서 질문드립니다.
    우선 9*6 체스보드에서 좌표를 54개를 찾았습니다.

    x=PX에서
    P = ( a, b, c, d,; e, f, g, h,; i, j, k,l), X(X,Y,Z,1)로 두고
    x= (aX+bY+cZ+d)/(iX+jY+kZ+l)
    y= (eX+fY+gZ+h)/(iX+jY+kZ+i)
    opencv에서 제공하는 svd 클래스를 이용하여 작성하려고 합니다.

    svd를 손으로 몇문제 풀어보고 그 다음
    연립방정식을 구하는 프로그램을 만들어보았습니다.
    연립방정식 AX=B에서 A(2, -1, 1,; 3, 3, 9,;3,3,5)
    B=(1,0,4)를 해서 X값을 구해보는 것 까지는 해봤습니다.

    그런데 문제는 제가 아는 것은 54개의 (x, y) 좌표인데
    x= (aX+bY+cZ+d)/(iX+jY+kZ+l)
    y= (eX+fY+gZ+h)/(iX+jY+kZ+i)
    이것을 어떻게 svd하여서 카메라 매트릭스인 P를 구해야할지 막막하여 질문드립니다...

    • BlogIcon 다크pgmr 2016.06.19 18:45 신고 수정/삭제

      안녕하세요. 체스판을 월드좌표 XY평면으로 보고 한 모서리를 꼭지점으로 생각하면 54개의 (x,y)에 대응하는 (X,Y,Z) 좌표도 알고 있는 셈입니다. 자세한 것은 Z. Zhang의 논문을 보시면 좋지 않을까 싶습니다.

    • 2016.06.19 20:25 수정/삭제

      비밀댓글입니다

    • BlogIcon 다크pgmr 2016.06.19 23:11 신고 수정/삭제

      월드좌표이기 때문에 체스판의 실제 격자 크기를 반영해서 X, Y, Z 값을 적어주면 됩니다. 예를 들어 격자 간격이 30mm라면 원점으로 잡은 꼭지점은 (0,0,0), 그 바로 옆 X축 방향 격자점은 (30, 0, 0), ...와 같이 체스판을 좌표평면처럼 보고 각 격자점들의 실제 좌표를 적어주면 됩니다. 단위는 mm를 사용하던, cm를 사용하던 관계없으며 일관되게만 사용하면 됩니다. 또한 원점, X축, Y축은 체스판에 있는 격자점들을 기준으로 임의로 정하되 모든 이미지에서 일관되게만 정해주면 됩니다.

    • 누크 2016.06.20 00:29 신고 수정/삭제

      정말 감사합니다..ㅠㅠ
      P를 구하는 과정은 완벽히 이해되었습니다.
      하지만 x와 X좌표를 알고도...
      SVD 처리 과정을 아직까지 이해하지 못하여
      손으로라도 마무리 짓도록 해야겠습니다.

  • 태크닉 2016.07.14 14:04 신고 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님 블로그 보며 많은 공부를 하고 있습니다.
    calibration 결과에서 rms가 정확히 무엇을 의미 하는지 궁금합니다.

    • BlogIcon 다크pgmr 2016.07.14 14:33 신고 수정/삭제

      안녕하세요. rms는 root mean square의 약자로서 평균오차 정도로 해석하시면 됩니다. 캘리브레이션을 하면 카메라 모델이 얻어지는데 얻어진 카메라 모델로 계산한 픽셀위치와 영상에서 실제 관측된 픽셀 위치 사이의 오차입니다. 캘리브레이션이 정확할수록 rms는 작은 값을 갖게 됩니다.

    • 태크닉 2016.07.15 17:41 신고 수정/삭제

      아 그러면 다크프로그래머님께서 개발하신 캘리브레이션 툴에서의 rms값은 다른 GML 툴이나 매틀랩 툴에서의 fixel error 값과 동일한 것인가요??
      다크님 툴을 사용해서 구했을때 rms는 0.265 정도의 값이 나오며 GML이나 매틀랩에서 계산한 결과로는 fixel error값이 [0.17 0.18] 수준으로 동일합니다.

    • BlogIcon 다크pgmr 2016.07.15 18:35 신고 수정/삭제

      네 동일합니다. Zhang 방법의 코드는 opencv의 코드를 이용해서 구현했기 때문에 성능상의 차이는 없습니다. 해당 내용을 명시하지 않아서 괜한 혼동을 드린 것 같습니다..(본문에 추가하였습니다)

  • 태크닉 2016.08.01 20:00 신고 ADDR 수정/삭제 답글

    안녕하세요 캘리브레이션 공부중인 학생입니다.
    다크님께서 개발하신 캘리브레이션 툴을 사용해서 어안렌즈의 내부파라미터를 구하는데요,
    총25장의 사진을 확보하여 캘리브레이션 하면 1.0이 넘는 rms가 나옵니다......
    제가 궁금한 것은 통상적으로 어느정도의 rms값(혹은, fixel error 값)을 기준으로 쓸만하다 쓸만하지못하다라고 판단하나요??
    또한 Fisheye모델 캘리브레이션을 수행하면 rms=-1.#IND00 라고 나오는데 어떠한 문제인가요?

    • BlogIcon 다크pgmr 2016.08.02 18:33 신고 수정/삭제

      안녕하세요. rms에 대한 기준이 있는지는 모르겠습니다. 하지만 rms가 1 이상이면 코너점마다 평균 1 픽셀 이상의 오차가 발생했다는 것인데 그 정도면 오차가 큰 편으로 생각됩니다. 해를 못 구하는 경우(rms=-ind00)는 어떤 경우인지 저도 모릅니다. 다양하게 실험을 해 보면서 원인을 찾아보시면 좋을 것 같습니다 (이미지 개수, 조합 등).

  • 태크닉 2016.08.04 14:15 신고 ADDR 수정/삭제 답글

    다크님 안녕하세요 자주 질문하게 되는데요..
    혹시 수평, 수직 화각이 다른 비대칭 어안렌즈의 경우에는 툴을이용한 캘리브레이션이 힘든가요?

    • BlogIcon 다크pgmr 2016.08.05 18:37 신고 수정/삭제

      그건 저도 잘 모르겠습니다. 비대칭 렌즈는 저도 캘리브레이션 해 본 적이 없는데요, 실제로 본 적이 없어서 비대칭 렌즈란게 어떤건지 잘 감이 안오네요.. 렌즈 자체가 비대칭으로 설계된 것인가요?

  • 주니짱 2016.08.10 15:57 신고 ADDR 수정/삭제 답글

    'Calibrate (Polynomial)' 또는 'Calibrate (Fisheye)' 버튼이 비활성화 되어있는데 활성화는 어떻게 시키나요?

    • BlogIcon 다크pgmr 2016.08.10 16:35 신고 수정/삭제

      캘리브레이션 이미지들이 존재하고, detect corner 버튼으로 체스판 코너점들이 찾아지면 자동으로 활성화됩니다.

  • BlogIcon 너부리이놈 2016.09.01 23:15 신고 ADDR 수정/삭제 답글

    안녕하세요.
    잘문몇가지하려고요

    이미지를 여러개 넣으니 fisheye 는 계산을 계속합니다

    Polynomial의 k1,k2,p1,p2 가 계속 0이 나오는데 왜그런건가요?

    휴대폰 카메라를 데스크탑에 연결해서 하고있습니다.

    • BlogIcon 다크pgmr 2016.09.03 18:30 신고 수정/삭제

      fisheye는 원래 계산을 계속하도록 구현되어 있습니다. 육안으로 확인했을 때 어느 정도 값이 수렴하는 것처럼 보이면 "Stop" 버튼을 눌러서 캘리브레이션을 종료시키면 됩니다 (관련 설명이 누락되어 있어서 본문에 추가했습니다).. polynomial로 했을 때 k1, k2, p1, p2가 0이 나오는 건 저도 모릅니다.. 혹시 프로그램에서 distortion 파라미터 추정 기능을 끄고 캘리브레을 수행한 것은 아닌지요?

  • openmin 2016.10.07 10:25 신고 ADDR 수정/삭제 답글

    안녕하세요
    다크님 블로그를 보고 어떤 사물을 cascade 학습을 통해 detection 가능하게 됬는데

    이 detection 된 물체와 카메라의 거리를 카메라 캘리브레이션을 통해 알수가있을까요??

    카메라 (휴대폰 ) 한대 가지고 가능여부를 알고싶습니다.

    정리를하면
    1. 현재 핸드폰으로 어떤 사물인식이 가능한 상태
    2. 사물이 detection 되면 카메라와 detection 된 사물의 거리를 카메라 캘리브레이션을통해 알수있는지? (오차는 상관없음)
    3. 물체와 거리재는 다른 방법이있는지?

    이상입니다.. 가능하다면 시도해볼려고하는데 아직 확신이없어서 문의드립니다.
    답변주시면 감사하겠습니다.

    • BlogIcon 다크pgmr 2016.10.08 05:24 신고 수정/삭제

      저도 잘은 모르지만 카메라의 포커스를 이용해서 거리를 재는 방법이 있는 것 같습니다. Fast Depth from Defocus with Your Mobile Phone for Synthetic Defocus 논문을 한번 참조하시기 바랍니다.

  • 안녕하세요 2017.06.01 14:12 신고 ADDR 수정/삭제 답글

    코너점은 찾아지고 화면에 표시되는데, calibrate 버튼들이 비활성화되어 있는데,
    win7 32bit도 문제없나요?

    • BlogIcon 다크pgmr 2017.06.01 14:33 신고 수정/삭제

      혹시 이미지의 개수가 너무 적어서 그런건 아닌지 모르겠습니다. 이미지를 좀더 추가해 보시기 바랍니다.

  • BlogIcon DRAGONITE 2017.07.18 14:38 신고 ADDR 수정/삭제 답글

    감사합니다. 컴공과 대학생입니다. 응용 프로그램에 opencv 예제 코드를 어떻게 적용했는지가 궁금해요. 소스 코드를 분석해보고 싶은데, 코드를 볼 수 있을까요?

    • BlogIcon 다크pgmr 2017.07.18 20:20 신고 수정/삭제

      소스코드는 gui 등 의존성이 있고 여러가지로 번거로운 문제들이 있기 때문에 공개하지 않습니다. opencv의 samples 폴더에 있는 calibration.cpp 예제코드를 보시면 캘리브레이션 함수 사용법이 있으니 구현에 참고하시면 좋을 것 같습니다.

  • BlogIcon DRAGONITE 2017.11.21 16:19 신고 ADDR 수정/삭제 답글

    좋은 글 감사합니다!!! 클릭하고 하는 상자같은 것은 어떻게 만드나요? 어떤 키워드로 검색해야 할까요?
    MFC application 인가요?

    • BlogIcon 다크pgmr 2017.11.21 16:46 신고 수정/삭제

      네, MFC 프로그램이며 'CButton 사용법' 등으로 검색하시면 됩니다.

  • JeenQ 2018.01.25 12:24 신고 ADDR 수정/삭제 답글

    안녕하세요~ 항상 도움 많이 받고 있습니다
    2가지 정도 여쭤볼게 있는데요
    먼저 Zhang이랑 FOV 결과가 focal length나 principal point에서 차이가 많이 나던데요
    인풋은 fisheye camera였구요 어느 것이 더 신뢰할 만한 결과일까요?
    그리고 프로그램에서 corner detect를 opencv의 findChessboardCorners 함수로 하신건가요?
    프로그램에서는 코너가 잘 잡혔던 인풋을 직접 opencv 함수에 넣었더니 잘 안 잡히네요
    추가적인 처리가 있었나요?

    • BlogIcon 다크pgmr 2018.01.25 13:38 신고 수정/삭제

      안녕하세요. 어느 것이 정확한 결과를 내는지는 저도 모릅니다. 딱히 테스트해본 적이 없어서.. 한번 직접 테스트해 보시면 좋을 것 같습니다. 물체의실제크기:영상에서의크기 = 렌즈와물체의실제거리:focal_length 비례식을 이용하면 손쉽게 초점거리를 측정할 수 있습니다. 그리고 코너점 추출은 opencv의 함수를 이용한 것으로 동일합니다.

  • 333 2018.02.04 13:44 신고 ADDR 수정/삭제 답글

    rms의 단위가 픽셀단위를 의미하나요?
    rms=1.0 이면 1픽셀의 오차
    rms=0.14 이면 14/100 픽셀오차를 말하는것인지요..?
    만약에 픽셀단위가 맞다면
    mm 단위로 변환하려면 어떻게 해야될까요..?

    • BlogIcon 다크pgmr 2018.02.04 17:17 신고 수정/삭제

      네, rms의 단위는 픽셀입니다. rms 에러는 검출된 체스판 코너점 좌표와 캘리브레이션을 통해 추정한 코너점 좌표와의 오차입니다. 그렇기 때문에 이 값은 mm 단위로 변환이 어렵습니다. 카메라에 가까운 체스판 영상에서 1 픽셀 오차와, 멀리 떨어진 체스판에서의 1 픽셀 오차는 물리적으로 다른 값입니다. 하지만 계산된 rms는 단지 영상에서의 픽셀 오차만 계산한 값이기에 이를 mm으로 해석하는 것은 어렵습니다.

  • 123 2018.03.02 20:16 신고 ADDR 수정/삭제 답글

    === Intrinsic ===
    1035.864369 0.000000 957.141841
    0.000000 1042.945022 573.941262
    0.000000 0.000000 1.000000
    === Distortion ===
    -0.045250 0.245970 0.008613 -0.004737
    === Position ===
    0.0 0.0 0.0
    === Extrinsic ===
    0.994814 0.017689 0.100160 38.336694
    -0.023037 -0.919980 0.391287 -511.266933
    0.099067 -0.391565 -0.914802 845.825798
    0.000000 0.000000 0.000000 1.000000
    식으로 나오는데 혹시 이 파라미터로 카메라의 실제 좌표계를 -(R^-1)*t로 생각해도 될까요?

    • BlogIcon 다크pgmr 2018.03.05 09:47 신고 수정/삭제

      '좌표계'는 원점, 좌표축, 단위로 이루어지는 것으로서, 좌표를 정의하는 시스템을 의미합니다. 하지만 -(R^-1)*t는 하나의 좌표이니 질문이 뭔가 균형이 맞지 않는 것 같습니다.. 카메라의 intrinsic은 고정된 값이지만 extrinsic은 기준에 따라 변하는 상대적인 값이기 때문에 반환받은 extrinsic이 어떤 것을 기준으로 한 값인지 확인해 보셔야 합니다. 그래서 만일 그 기준이 사용하고자 하시는 월드좌표계와 일치한다면 그걸 그대로 이용하시면 됩니다.

  • vraifluss 2018.03.07 05:11 신고 ADDR 수정/삭제 답글

    calibration 이미지를 캡처해 만들때 프로그램에서 설정될 col/row 픽셀이 모두 존배하게 이미지를 만들어야 하는지요? 아니면 일부만 보여도 되는지? 만약 부분만 보여도 상관없다면 그 물체와의 거리는 어떤 의미가 있나요?

    • BlogIcon 다크pgmr 2018.03.07 15:24 신고 수정/삭제

      네, 체스판의 격자들이 모두 카메라 시야에 보이도록 영상을 캡쳐해야 합니다. 거리는 큰 관계없고 그냥 가까이에서 다양한 각도로 영상을 찍으면 됩니다.

  • vraifluss 2018.03.29 07:06 신고 ADDR 수정/삭제 답글

    늘 좋은 글 감사하게 읽고 있습니다.
    카메라 캘리브레이션은 Intrinsic parameters과 Extrinsic Parameters를 찾는 과정이라고 설명하셨는데... 실제 DarkCamCaribration Tool 은 내부 파라메터만 결과로 보여주는 거 같습니다. 만약 외부 파라메터가 카메라 위치나 월드좌표에 따라 바뀌는 것이라면 내부 파라메터만을 보통 camera calibration이라고 할 수 있는지요?

    하나 더 궁금한것은 외부 파라메터를 구하기 위해 "미리 알고 있는 또는 샘플로 뽑은 3D월드좌표–2D영상좌표 매칭 쌍" 이라고 설명하셨는데, 만약 두개 다른 각도의 캘리브레이션용 chessboard 이미지에서 모서리의 2D 좌표를 셈플좌표로써 픽셀 좌표로 선택할 수 는 있다고 생각하는데
    그 매칭되는 모서리에 해당하는 월드좌표들을 선택한다는 설명은 이해가 되지 않습니다.
    어떻게 2D이미지의 모서리들에 매치되는 3D좌표들을 얻을 수 있나요? 가능하면 수식이나 OpenCV 함수보다는 직관적인 이해를 하고 싶습니다. 이 부분 답변을 부탁드려도 될까요...

    • BlogIcon 다크pgmr 2018.03.29 17:35 신고 수정/삭제

      CCTV처럼 카메라가 고정된 경우에는 외부 파라미터를 구하는 것이 의미가 생깁니다. 보통은 말씀하신 것처럼 내부 파라미터를 구하는 것을 말합니다.
      두번째 질문하신 부분은 예전에 비슷한 댓글을 단 적이 있어서 그대로 다시 적어 봅니다.
      --
      월드좌표이기 때문에 체스판의 실제 격자 크기를 반영해서 X, Y, Z 값을 적어주면 됩니다. 예를 들어 격자 간격이 30mm라면 원점으로 잡은 꼭지점은 (0,0,0), 그 바로 옆 X축 방향 격자점은 (30, 0, 0), ...와 같이 체스판을 좌표평면처럼 보고 각 격자점들의 실제 좌표를 적어주면 됩니다. 단위는 mm를 사용하던, cm를 사용하던 관계없으며 일관되게만 사용하면 됩니다. 또한 원점, X축, Y축은 체스판에 있는 격자점들을 기준으로 임의로 정하되 모든 이미지에서 일관되게만 정해주면 됩니다.
      --
      어떤 식으로든 이렇게 월드 좌표를 정해주고 외부 파라미터를 구하면, 자신이 정한 월드 좌표계를 기준으로 한 카메라의 자세(3d 위치 및 방향)가 얻어집니다.

  • 종일웃음 2018.05.25 11:12 신고 ADDR 수정/삭제 답글

    안녕하세요, 언제나 많이 도움받고 있습니다.
    다크 프로그래머님께서 올려주신 파일을 다운받아 실행해보았는데, live cam을 눌러도 제대로 된 웹캠 화면이 나오지 않았습니다. 아마 일반적인 웹캠은 cv2.VideoCapture(0)으로 불러올 수 있는데, 제 웹캠은 이상하게도 값을 cv2.VideoCapture(1)로 넣어야 불러와지는 것 때문에 발생한 오류인 것 같습니다.
    이 버그를 고치려면 어떻게 해야 하나요??
    혹시 제가 컴퓨터 설정으로 웹캠을 불러오는 값을 다르게 바꿔줄 수 있나요?? (cv2.VideoCapture(1)으로 기존에 불러오던 것을 cv2.VideoCapture(0)으로 불러오도록 바꾸는 것을 의미합니다.)

    • BlogIcon 다크pgmr 2018.05.25 11:36 신고 수정/삭제

      노트북처럼 컴퓨터에 내장된 카메라가 있는 경우에 그러한 현상이 발생하는 것으로 알고 있습니다. 이 경우, 컴퓨터의 장치관리자에서 내장카메라를 비활성화시킨 후 컴퓨터를 재부팅하고 외부 카메라를 연결한 후에 다시 내장카메라를 활성화시키면 장치의 우선순위가 변경되어서 그 이후부터는 외부 카메라를 0번으로 인식하게 됩니다. 만일, 내장 카메라가 없는 경우라 하더라도 시스템 장치관리자에서 이미징장치 카테고리에 카메라로 의심되는 디바이스가 있으면 유사하게 시도해 보셔도 좋을 것 같습니다.

    • 종일웃음 2018.05.25 11:57 신고 수정/삭제

      감사합니다!!