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

개발한 것들 2014. 7. 17. 21:14

카메라 캘리브레이션용 프로그램입니다. 별도 설치없이 실행파일 하나로 바로 실행됩니다 

  • 3가지 캘리브레이션 방법 제공
  • 왜곡보정, topview 변환
  • 다양한 캘리브레이션 옵션
  • windows only


※ 이 프로그램은 코드서명을 하지 않았기 때문에 Windows 및 웹브라우져에 위해 다운로드 및 실행이 차단될 수 있습니다. 100% 안전한 프로그래이긴 합니다만 필요한 분들만 사용하시기 바랍니다..

※ Since this program is not code-signed, download and execution may be blocked by Windows and web browsers. This is a personally created program and a 100% safe program, but only for those who need it.



Ver1.1 다운로드 (last updated: 2020.10.10) :


direct download: DarkCamCalibrator1.1.zip

github: https://github.com/darkpgmr/DarkCamCalibrator

previous versions: check Version History below



< 5x8 체스보드를 이용한 캘리브레이션 예 >


유투브 동영상: https://youtu.be/QrCXTf0gwBk


사용법 (How to use)


- 'Load Images..' 버튼을 눌러 캘리브레이션 패턴(체스보드)을 촬영한 이미지들을 불러옴

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

- 캘리브레이션에 사용된 체스보드의 Grid Rows, Grid Cols, Cell Sz(mm)를 입력

- 'Detect Corners' 버튼을 눌러서 코너점 검출

- 캘리브레이션 옵션 설정 (왜곡보정 여부, fx=fy 여부 등)

- 원하는 방법의 캘리브레이션 수행하고 결과 확인 ('Calib Zhang', 'Calib FOV', ...)

  (각 캘리브레이션 방법은 아래의 설명 참조)

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

- Undistort Image: 이미지 목록에서 선택된 이미지에 대해 왜곡보정 결과 출력

- Save Images..: 이미지 목록의 이미지들을 파일(png 포맷)로 저장

- Save Settings: 현재의 사용자 설정을 저장 (다음 번 프로그램 실행시 저장된 설정이 유지됨)


※ rms (root mean square error): average reprojection pixel error



1. Calib Zhang (opencv) 방법


컴퓨터 비전 분야에서 사용되는 대표적인 카메라 모델인 Z. Zhang 캘리브레이션 방법. opencv 구현을 그대로 사용하였으며 성능은 opencv와 동일


Z. Zhang. “A Flexible New Technique for Camera Calibration”, IEEE Trans. Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000



2. Calib FOV (coupled) 방법


F. Devernay 논문의 FOV 왜곡모델을 이용한 카메라 캘리브레이션 방법. Levenberg–Marquardt 최적화 기법을 이용하여 직접 구현함. Z. Zhang 모델과 달리 왜곡 파라미터가 w 하나이며 왜곡보정된 좌표를 atan 함수로 한번에 구할 수 있다는 장점이 있음


F. Devernay and O. D. Faugeras. Straight lines have to be straight. Machine Vision and Applications, 13(1):14?24, 2001



3. Calib FOV (decoupled) 방법


F. Devernay 논문의 FOV 왜곡모델을 이용한 카메라 캘리브레이션 방법. 단, 왜곡 파라미터(w)를 정규 이미지 좌표가 아닌 픽셀 좌표에서 계산한 것이 차이점임. decoupled라고 이름을 붙인 이유는 왜곡 파라미터를 focal length와 무관하게 추정할 수 있기 때문 (컴퓨터 비전 분야에서는 왜곡 모델을 정규 이미지 좌표에서 계산하는 것이 일반적이며, 이로 인해 왜곡 파라미터 추정과 focal length 추정 문제가 서로 coupling되는 문제점이 있음)


☞ coupled/decoupled는 나름 용어를 만들어 본 것으로서 카메라 캘리브레이션에서 일반적으로 사용되는 용어는 아닙니다.



버전 히스토리 (Version History)


*DarkCamCalibrator 1.1 (2020.10.4)

- FOV 캘리브레이션을 LM 최적화 기법을 적용하여 직접 구현

- FOV decoupled 방법을 추가

- 체스보드의 가로, 세로 격자수에 대한 짝수,홀수 제한을 제거

- 영상왜곡 보정 기능을 추가


*DarkCamCalibrator 1.0 (2014.7.17)

- 초기 버전

DarkCamCalibrator.zip

DarkCamCalibratorPGR.zip



by 다크 프로그래머


  • 이전 댓글 더보기
  • 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 와 같은 영상처리 라이브러리 함수들을 이용하면 가능은 합니다만, 공부가 조금 필요합니다.

  • Hoo 2019.02.07 10:58 ADDR 수정/삭제 답글

    좋은 프로그램 감사합니다. 질문이 있어 문의드려요.

    포인트그레이의 Ladybug5를 사용하는 사람입니다.

    360 카메라의 내부 파라미터를 구하고자 하는경우 체크보드를 모든 렌즈 앞에놓고 한번씩해서 전부 구해야 하나요?

  • Aaron 2019.03.11 15:02 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님의 블로그를 보고 많은 도움을 받는 영상처리를 공부하는 학생입니다.

    다름이 아니라 올려주신 프로그램을 사용하여 캘리브레이션을 진행하려 했는데 격자 사이즈가 even x odd 아니면 odd x even으로 되어야 한다는 조건이 있는데 혹시 특별한 이유가 있는건지 여쭈어도 될까요?

    감사합니다.

    • BlogIcon 다크pgmr 2019.03.12 08:46 신고 수정/삭제

      캘리브레이션에는 필요가 없지만, 체스보드 코너를 찾는 함수에서 그런 조건이 필요한 것으로 생각해서 예전에 그렇게 했던 것 같습니다. 그런데, 지금보니 그런 조건은 필요가 없는 것 같습니다.

  • 공부중 2019.05.07 09:12 ADDR 수정/삭제 답글

    안녕하세요 다크님
    블로그 보면서 공부하는 영상처리 초보 입니다.
    제가 많이 알려져있는 camera calibration code를 pgr 카메라로 돌아가게 (다크님 두번째 프로그램) 수정하려 하는데요

    보통 opencv 에서 VideoCapture 선언후에 capture >> image;

    이런식으로 일반적인 웹캠 캡처 이미지를 Mat에 받아오는데, pgr 카메라의 경우 SDK 에서 정의한 다른 함수들을 이용하는것 같습니다.

    저 부분에 알맞은 함수만 삽입하면 되는건지 아니면 calibration code 전체를 많이 손봐야 하는지 궁금합니다.

    • BlogIcon 다크pgmr 2019.05.17 18:44 신고 수정/삭제

      pgr 카메라를 사용하기 위해서는 PGR에서 제공하는 FlyCapture2 라이브러리를 이용해야 합니다. FlyCapture2 SDK와 설명문서들을 참조해서 직접 구현해야 합니다..

  • 연구원 2019.07.10 15:30 ADDR 수정/삭제 답글

    다크님,
    캘리브레이션을 하다보니 궁금한 점이 생겼습니다.
    opencv FISHeye모델로 쓰고 있는데, 체커보드의 cross-point를 누적했을때 영상 전체에서 고르게 뽑아야 좋은 결과를 얻는것은 당연해 보이는데,

    문제가 체커보드의 row와 col수를 결정하는데 고민이 생겼습니다.

    광각카메라 경우 row, col 수가 너무 많으면 점들이 왜곡이 적은 중앙쪽에 많이 분포되고, 중앙 중심으로 편중되게 intrinsic 및 왜곡 계수가 계산될것 같은데 그렇지 않을까요?

    아니면 그것들을 다 반영해서 계산하기 때문에 점이 많을 수록 유리할 걸까요?

    의견이 어떠신지 궁금합니다.

    • BlogIcon 다크pgmr 2019.07.10 18:44 신고 수정/삭제

      안녕하세요. 격자점이 많아서 나쁠것이 없다는 생각이지만 그렇다고 격자점의 갯수가 너무 적지만 않다면 큰 관계가 없다. 라고 생각됩니다. 7×7 정도면 적당할것 같은데요..그저 느낌상의 의견입니다.^^

  • 서민석 2019.10.23 00:15 ADDR 수정/삭제 답글

    안녕하세요. 다크님.

    툴의 체크보드가 , 둘다 홀수여서 프로그램 실행이 안되는데, 혹시 그 조건을 풀어줄수 있는 방법이 있을까요? odd x even 조건이요 ㅠㅠ 혹시 변경 가능한건가 궁금합니다.

    • BlogIcon 다크pgmr 2020.10.04 19:54 신고 수정/삭제

      이번에 버전 업데이트하면서 조건을 없앴습니다. 불필요한 조건이었는데, 수정이 늦었습니다.

  • 영상초보연구원 2020.05.29 10:26 ADDR 수정/삭제 답글

    안녕하세요, 다크프로그래머님.
    제 분야가 아니라서 예전부터 영상공부 할 일이 있으면, 다크프로그래머님이 올린 글들을 보며 차근차근 공부해나갔던 기억이 있습니다.
    최근에, 내부파라미터를 구할 일이 있어서 위의 DarkCamCalibrator를 설치하고 Load Image를 해서 FoV를 실행하였습니다.
    흠.. 그런데 rms = -1.#IND00 에서 멈추며 다른 값들도 계속해서 구해지지가 않습니다 ㅠㅠ
    체스보드는 12x7에 23mmx23mm이고, 이미지의 크기는 1280x944에 16장을 사용했습니다.
    디텍션과 zhang은 돌아가는데.. ㅠㅠ
    FoV를 하면서 위와같이 멈추게 되는 조건들이 있을까요??

    • BlogIcon 다크pgmr 2020.10.04 19:48 신고 수정/삭제

      저도 비슷한 문제가 있어서 고민하다가 FOV를 새로 구현했는데, 이제는 잘 되는 것 같습니다. 새로 올린 버전을 사용해 보시기 바랍니다.
      예전의 FOV는 PTAM에 구현된 것을 가져다 사용한 것이었는데, 잘 안될 때가 많네요..

  • lopenCV초보 2020.09.02 12:07 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님.
    프로그래머님이 만든 프로그램에서 calibrate(FOV) 기능을 통해서 fisheye 렌즈의 fx,fy,cx,cy,w 값을 구했습니다. 그런데 openCV 에서 fisheye 왜곡보정함수를 보니
    C++: void fisheye::undistortImage(InputArray distorted, OutputArray undistorted, InputArray K, InputArray D, InputArray Knew=cv::noArray(), const Size& new_size=Size())
    상세내용을 보니 K 에레이에 fx,fy,cx,cy 값을 넣으면 되는 거였습니다.
    그런데 그 뒤에 또
    D – Input vector of distortion coefficients (k_1, k_2, k_3, k_4). <- 이와같이 4개의 변수가 더 필요하다는 안내가 나와있습니다.
    (https://docs.opencv.org/3.0-beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#fisheye-undistortimage 를 참조했습니다)
    구한 변수들을 이 함수에 어떤식으로 적용해야할지 알 수 있을까요? k1 에 w를 넣고 나머지를 다 0으로 하면 될까요?
    아니면 다크프로그래머님이 참고하셨다는
    (fisheye 모델 논문: F. Devernay and O. D. Faugeras. Straight lines have to be straight. Machine Vision and Applications, 13(1):14–24, 2001.)
    논문을 참고해서 새로운 코드를 짜야하는건가요??
    좋은 프로그램 만들어주셔서 감사합니다

    • BlogIcon 다크pgmr 2020.09.03 09:32 신고 수정/삭제

      네.. 구한 값들은 F. Devernay and O. D. Faugeras. Straight lines have to be straight. Machine Vision and Applications, 13(1):14–24, 2001 논문의 방법을 이용해야 합니다. 논문에 변환식이 나와 있어서 그렇게 어렵지는 않습니다.

    • BlogIcon lopenCV초보 2020.09.03 09:41 수정/삭제

      감사합니다 시도해보겠습니다

    • BlogIcon lopenCV초보 2020.09.03 11:25 수정/삭제

      다크프로그래머님 그러면 지금 프로그램에서는
      C++: void fisheye::undistortImage(InputArray distorted, OutputArray undistorted, InputArray K, InputArray D, InputArray Knew=cv::noArray(), const Size& new_size=Size())
      라는 함수에 사용가능한 변수는 구할 수 없는 상태인거죠??

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

      opencv에 있는 fisheye가 어떤 모델인지는 저도 잘은 모르는데요, k1, k2, ... 등이 있는 것으로 봐서는 Straight lines have to be straight. Machine Vision and Applications 논문의 모델은 아닌 것 같습니다. (제가 opencv::fisheye를 써본 것은 아니라서 확신은 없습니다.)
      어쨌든 지금 모델로 하시려면 별도로 영상보정 함수도 구현해야 할 것 같습니다. 아니면, opencv에 있는 함수들을 이용하고 싶다면 polynomial 모델로 파라미터를 구하면 될 것 같습니다만..

    • BlogIcon lopenCV초보 2020.09.04 09:16 수정/삭제

      감사합니다 ㅎㅎ

    • BlogIcon lopenCV초보 2020.09.14 18:50 수정/삭제

      덕분에 논문 참조해서 과제를 잘 해결했습니다. 감사합니다 ㅎㅎ

  • 나이키 2020.11.23 14:47 ADDR 수정/삭제 답글

    안녕하세요. 올려주신 프로그램으로 태스트 하면서 궁금한점이 생겨서 문의 드립니다.

    왜곡보정후에 탑뷰로 변환한 체스판 이미지에서 체스판 사각형 1개의 개별 크기가 조금씩 다른 결과물이 나오는 것 같습니다.

    동일한 크기로 만드는 것이 가능한지 궁금 합니다.

    감사합니다.

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

      탑뷰 크기에 차이가 발생했다면 캘리브레이션이 정확히 되지 않은 것으로 생각됩니다. 100% 정확하게는 안되겠지만 캘리브레이션이 정확할수록 좋은 결과가 나오리라 생각됩니다.

  • 개발자? 2021.02.04 17:17 ADDR 수정/삭제 답글

    다크님 블로그를 보고 Pan / Tilt 테스트를 진행해본 결과 만족할 만한 결과가 나와서 우선 감사합니다.
    덕분에 카메라에 대한 이해도가 한층 높아져지고 있습니다 ^^

    Calibration 프로그램 관련 질문이 있습니다.
    제가 일반적인 체스 보드가 아닌 자체적인 타겟 보드를 사용하여 fx, fy, cx, cy 등 내부 파라미터를
    계산하기 위해 구현을 진행하는 중에 있습니다.
    opencv 2.4.11 버전을 연동하여 mfc 기반 calibration 프로그램을 구현하고 테스트 해보기 위해서
    동일한 체스 보드를 사용하여 다크님 프로그램과 비교하기 위해 calibration을 진행하였는데
    내부 파라미터 결과가 조금 다른 결과를 보였습니다.
    (동일한 이미지 / AF 사용하지 않음 / 8x6 체스 보드)
    ==== 다크님 프로그램 (3개의 체크박스는 모두 체크 해제 후)
    fx = 6374.150804
    fy = 6363.539025
    cx = 656.311200
    cy = 432.427358
    k1 = 0.259016
    k2 = -41.482462
    p1 = 0.003541
    p2 = 0.005330
    ==== 테스트 중인 프로그램
    fx = 6420.667773
    fy = 6406.065825
    cx = 598.378755
    cy = 439.740219
    k1 = 0.253662
    k2 = -34.342376
    p1 = 0.002655
    p2 = 0.002275

    위와 같이 비슷하나 주점이 꽤 차이가 나는등의 결과를 나타내었는데
    혹시 단순히 코너 검출 및 calibrateCamera 함수 호출 외에 추가적으로
    (코너 검출 결과 이미지는 육안상으로는 비슷한 결과를 보였습니다)
    사용하신 방법이 있으신지 궁금하여 질문드리게 되었습니다.

    • BlogIcon 다크pgmr 2021.02.05 08:56 신고 수정/삭제

      생각보다 차이가 많이 나네요.. 특별히 다른 방법을 사용한 것은 없습니다. opencv 버전 차이일 수도 있고, 함수 사용법 차이일 수도 있겠네요. 저는 opencv 4.3 버전을 사용하였고, 코너점 찾은 후 cornerSubPix 해줄 때 win_size = 5로 설정하였고, 캘리브레이션 함수로는 calibrateCameraRO를 사용했으며, 캘리브레이션시 행렬분해 방법으로 속도를 빠르게 하기 위해 CALIB_USE_LU 플래그를 사용했습니다.
      그런데, 어떤 게 더 맞는 방법이다라는 기준은 없습니다. 정답은 아무도 모르고요.. 단지, 캘리브레이션 결과로 리턴(return)되는 rms 값이 작을수록 캘리브레이션이 더 잘 되었다고 짐작할 수는 있겠습니다.

  • 개발자? 2021.03.12 12:55 ADDR 수정/삭제 답글

    안녕하세요 다크님 지난번 Calibration 결과 비교 댓글을 보고 개발 환경에 대한 코멘트를 주신 덕분에 이를 반영하여 여러가지 옵션들을 조절한 결과 거의 유사한 결과를 나타내며 rms 값이 낮게 계산되어지는 방향으로 개선 완료 되었다는점에 감사 인사드립니다.

    더불어 카메라 내부 파라미터인 주점과 초점거리와 정규 이미지 좌표계 공간을 이용한 Pan / Tilt angle 계산 방법을 쉽게 잘 설명해주셔서 해당 기술을 개발중인 디바이스에 테스트 해본결과 매우 만족스러운 결과를 얻게 되었습니다.
    추가적으로 AF 기능을 사용하는 센서와 렌즈 조합에서 각 거리 별로 Focal length를 계산하여 Panning 양을 계산하여 실제 동작에 반영한 결과에도 좋은 결과를 보였습니다.

    앞으로도 해당 블로그로 인해 많은 도움을 받을것 같습니다. 감사합니다 ^^

  • 서주영 2021.04.29 10:58 ADDR 수정/삭제 답글

    안녕하세요. 블로그 잘 보고있습니다.
    올려주신 프로그램을 사용해서 캘리브레이션 하려는데,
    Detect Corner를 하면 프로그램이 꺼집니다.
    패턴 크기(190mm)가 너무 커서일까요?

  • 염상돈 2021.05.18 19:11 ADDR 수정/삭제 답글

    안녕하세요 이제막 이미지 처리 공부를 시작했습니다.
    CCTV 를 이용하여 이미지 처리를 하고 있는데 왜곡을 생각하지 못 했었습니다.
    블로그보고 많은 도움 받고 있습니다.
    한가지 질문이 있는데요 RTPS 로 접속 가능한 카메라를 이용중인데, 개발하신 캘리브레이션 툴에 접속은 안되는건가요?

    • BlogIcon 다크pgmr 2021.05.19 23:35 신고 수정/삭제

      webcam0라 쓰인 곳(Live Capture 버튼 밑의 에디트 박스)에 rtsp 주소를 붙여넣기 한 후 Live Capture 버튼을 눌러보시기 바랍니다. 단, 저도 될지 안될지는 잘 모르겠습니다(구현하면서 그런 기능을 넣었던 것 같기도 한데, 확실치 않아서;;). rtsp를 테스트할 카메라가 없다 보니 저는 확인이 안되네요. 그리고, rtsp 주소 넣을 때, 아마도 id, pw 모두 포함된 형태로 넣어야 할 겁니다.

    • BlogIcon 염상돈 2021.05.22 23:38 수정/삭제

      빠른답변 및 프로그램 감사드립니다. rtsp 가 길어서 그러한지 다 들어가지는 않더라고요 캡쳐해서 사용하였습니다. 큰도움 받았습니다 감사합니다.

  • 윤도현 2021.06.22 17:27 ADDR 수정/삭제 답글

    안녕하세요 최근 컴퓨터비전을 공부하기 시작한 대학원생입니다!
    이 프로그램을 통해 제 카메라의 초점거리, 주점등 내부 파라미터 정보를 얻었는데요
    앞서 얻은 파라미터를 이용해 체크보드 이미지가 아닌 다른 이미지들도 왜곡보정 하고 싶은데
    방법이 있을까요? 초보적인 질문 죄송합니다!

    (저 내부 파라미터를 이용해 어떻게 하면 같은 카메라로 찍은 다른 이미지들도 왜곡보정 할 수 있는지 궁금합니다!!)

    • BlogIcon 다크pgmr 2021.06.23 21:57 신고 수정/삭제

      왜곡보정은 직접 한번 구현해 보시면 좋을 것 같은데요, 왜곡보정에 대한 이론적인 부분은 https://darkpgmr.tistory.com/31를 참조하시고, 참고 코드는 https://darkpgmr.tistory.com/37 를 보시면 좋을 것 같습니다.

    • BlogIcon 윤도현 2021.06.24 16:14 수정/삭제

      친절한 답변 감사드립니다.
      정말 큰 도움이 되었습니다
      감사합니다!