카메라 캘리브레이션 프로그램 (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 다크 프로그래머


  • 이전 댓글 더보기
  • 누크 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 신고 수정/삭제

      감사합니다!!

  • 루나 2018.08.07 17:47 신고 ADDR 수정/삭제 답글

    안녕하세요 항상 올려주신 자료들 정말 감사하게 보고있습니다
    다크님이 올려주신 프로그램 사용해보려고 하는데요 몇가지 문의사항이 있어 질문드립니다
    위에 글에서 캡쳐해두신걸 보면 calibrate하고 (polyModel)과 (fisheye)라고 되어있는데 실제 프로그램 받아서 실행해보면 (Zhang)과 (FOV)라고 되어있는데 같은 의미인건가요?
    두번째는 체크박스 부분에도 disable distortion이라고 되어있는데 실제 프로그램 실행해보면 Use Zero Distortion이라고 되어있는데 이거도 같은건지 궁금합니다
    그리고 마지막으로 이 Use Zero Distortion이 체크가 되어있는 상태로 캘리브레이션 버튼을 눌러야 실제 캘리브레이션을 하는건지 아니면 풀어야 하는건지, 저 체크박스를 선택하고 안하고의 의미가 조금 명확하지 않아 질문드립니다. 또한 이 프로그램으로 도출한 캘리브레이션 값으로 undistortion하는 기능은 이 프로그램에 포함이 안되어있는거 같은데 제가 못찾는건가 해서 이것도 문의드립니다
    항상 감사합니다

    • BlogIcon 다크pgmr 2018.08.08 09:12 신고 수정/삭제

      프로그램의 용어만 수정하고 본문의 설명은 수정하지 않았네요. 본문의 내용도 곧 수정해 놓도록 하겠습니다. polyModel->Zhang, fisheye -> FOV이고 use zero distortion을 체크하면 영상왜곡보정은 하지 않는다는 의미이고, 체크하지 않으면 왜곡보정 파라미터도 같이 구한다는 의미입니다. 마지막으로, undistort 기능은 프로그램에 포함되어 있지 않습니다. 포함된다면 좋겠네요.

  • 파란색 2018.08.20 14:35 신고 ADDR 수정/삭제 답글

    안녕하세요 항상 게시물 보며 공부하고 있는 학생입니다.
    한가지 궁금한게 있어 여쭤봅니다.
    동일한 기종의 카메라 20대를 이용하여 캘리브레이션을 진행하고자 할경우
    1번카메라에서 찍힌 체크보드 20장 끼리 하고 2번카메라끼리하고 각각 카메라 별로 캘리브레이션을 해야하는지 아니면 1번카메라 1장 2번카메라 1장 해서 모든 카메라를 동시에 캘리브레이션 해야하는지 모르겠습니다.
    전자의 방법으로 진행한다면 내부파라미터가 동일카메라 임에도 불구하고 다르게 나오는 현상이있습니다. 동일기종이라면 약간의 오차를 제외하곤 내부파라미터가 동일하게 나와야하는거죠?

    • BlogIcon 다크pgmr 2018.08.20 22:58 신고 수정/삭제

      20대의 카메라를 이용하는 연구라니 대박이네요 ^^. 동일한 모델의 카메라라 하더라도 파라미터는 모두 조금씩 다를 수 있습니다. 특히 렌즈를 카메라에 돌려서 끼워야 할텐데 렌즈가 어떻게 돌아가 있느냐(회전각)에 따라서 cx, cy가 달라질 수 있고, 또 초점을 어떻게 맞췄느냐에 따라서 초점거리가 다를 수 있습니다. 동일한 카메라는 없으니 귀찮더라도 각자 캘리브레이션 해줘야 합니다. 물론 동일 모델이라면 차이가 크지는 않을 터이니 약간의 차이를 무시하고 평균값 등을 사용하는 것도 가능은 하겠습니다.

  • 학생99 2018.08.21 10:50 신고 ADDR 수정/삭제 답글

    위에 댓글보고 궁금한 점이 있습니다~
    [동일한 모델의 카메라라 하더라도, 파라미터는 모두 조금씩 다를 수 있다]
    라고 써주셨는데요..
    예를 들어 갤럭시S8 전용앱을 만든다고 가정하였을 경우, S8 몇대정도에 대해서만 캘리브레이션을 진행하여 파라미터를 얻어낸 후, 해당 앱에 undistortion을 진행할때 이 값들을 써도 문제가 없을까요?
    일반적인 카메라가 아니라, 스마트폰에 들어가는 렌즈라 크기나 특성이 좀 다를것 같은데,
    이 경우에는 캘리브레이션을 어떻게 하는것이 undistortion 오차를 줄일 수 있을까요?

    • 파란색 2018.08.22 13:34 신고 수정/삭제

      정답일진 모르겠지만 제생각에는 휴대폰 왜곡같은경우 테스트를 통해 얻은 평균 값을 이용하여 진행 하여도 크게 문제가 될거같진않습니다. 카메라와 다르게 렌즈가 고정이기때문에 따로 줌이나 설정을 건드리지 않는다면 큰차이는 없을것 같네요 ㅎㅎ

  • 학생123 2018.09.30 18:00 신고 ADDR 수정/삭제 답글

    좋은 프로그램 감사합니다!!
    그냥 이 프로그램을 실행해서 코너 찾고 calibrate 버튼 누르면 자동으로 카메라에 calibration이 되는건가요?
    혹시 웹캠 두대로 하는 캘리브레이션은 어떻게 수행해야 할까요? 스테레오로 disparity맵을 구하고싶은데

    • BlogIcon 다크pgmr 2018.10.02 14:51 신고 수정/삭제

      카메라 캘리브레이션은 카메라의 파라미터를 구하는 과정입니다. http://darkpgmr.tistory.com/32 글을 먼저 읽어보시면 좋을 것 같습니다.
      그리고 스테레오 카메라 캘리브레이션은 공개 툴이 있는지는 저도 잘 모르겠습니다. opencv 와 같은 영상처리 라이브러리 함수들을 이용하면 가능은 합니다만, 공부가 조금 필요합니다.