라이브 왜곡 보정 프로그램

개발한 것들 2013. 2. 13. 16:47

실시간(라이브)으로 왜곡 보정된 영상을 보여주는 프로그램입니다.

왜곡보정에 관한 이론적인 내용은 [영상처리] - 카메라 왜곡보정 - 이론 및 실제을 참조해 주세요.

 

 

 

프로그램 다운로드 (소스코드 & 샘플동영상 포함)

DistortCorrection.zip
다운로드

☞ 포함된 소스코드는 왜곡보정에 관련된 핵심 코드만 포함되어 있습니다. 사용자 인터페이스 및 파일 입출력 등 전체 프로그램 코드는 포함되어 있지 않습니다.

 

사용법

 

1. 압축을 풀면 아래 그림과 같이 camera_parameters.txt란 파일이 있는데, 먼저 이 파일을 메모장으로 열어서 카메라 파라미터를 이곳에 적어줍니다. 카메라 캘리브레이션은 [영상처리] - 카메라 캘리브레이션 (Camera Calibration)을 참조하세요.

기본값으로 설정되어 있는 파라미터값은 첨부된 sample.avi 동영상 파일을 획득하는데 사용된 카메라의 파라미터 값입니다.

 

 

 

2. 다음으로 DistortCorrection.exe를 실행시키면 다음과 같이 비디오 소스를 선택할 수 있습니다. 컴퓨터에 연결된 웹캠(webcam)을 사용하려면 1 또는 2를 입력하고, avi 파일을 읽어오려면 3을 입력하고 enter키를 누릅니다.

 

 

 

3. 그러면 아래 그림과 같이 실시간으로 왜곡 보정된 영상을 보여줍니다. 플레이 도중에 SPACE 키를 누르면 동적으로 왜곡 보정 기능을 켜고 끌 수 있습니다.

 

 

by 다크 프로그래머

'개발한 것들' 카테고리의 다른 글

걷는 속도와 비를 맞는 양 - 컴퓨터 시뮬레이션  (50) 2013.06.05
라이브 왜곡 보정 프로그램  (86) 2013.02.13
FFT와 모아레 제거 프로그램  (71) 2013.01.28
오목  (50) 2013.01.28
  • 이전 댓글 더보기
  • BlogIcon 안녕하세요 2015.06.30 14:50 ADDR 수정/삭제 답글

    안녕하세요.
    다크프로그래머님 덕분에 원하던 기능을 찾게 되서 잘 공부하고 있습니다.
    여쭤보고 싶은게 있습니다~

    라즈베리파이(리눅스)환경에서 이 프로그램을 돌리고 싶은데 wine이라는 프로그램을
    설치하면 원도우에 실행 프로그램을 리눅스에서 돌릴 수 있다고 알고 있습니다.
    근데 코딩등의 작업이 필요하다는 말이 있어서 아직 까지 해보진 못했는데
    라즈베리파이(리눅스)에서 위의 프로그램을 돌릴 수 있는 것인지 궁금합니다.

    • BlogIcon 다크pgmr 2015.06.30 15:14 신고 수정/삭제

      안녕하세요. 그건 저도 해보지 않은 것이라 알지 못합니다.

    • BlogIcon 안녕하세요 2015.06.30 16:26 수정/삭제

      죄송하고 귀찮으시겠지만 실행 시키는 응용프로그램은 어떻게 만드는 건지 알수있을까요 ㅠㅠ.. 소스를 읽어봐도 응용프로그램이 생성될 만한 부분을 못찾겠어서 부탁드립니다..!

    • BlogIcon 다크pgmr 2015.06.30 16:51 신고 수정/삭제

      네, 제가 가끔 올리는 코드는 참고용으로서 인터페이스 등의 부가적인 부분은 모두 걷어내고 핵심 부분만 올리기 때문에 그 자체로 실행파일이 만들어지지는 않습니다. 실제 실행 가능한 프로그램은 스스로 작성하셔야 합니다. 자신의 개발환경에 맞는 프로그래밍에 대해서는 별도 서적 등을 통해 공부하셔야 합니다.

  • ramones 2015.08.03 11:23 ADDR 수정/삭제 답글

    안녕하세요. 영상처리를 갓 시작한 학생입니다.
    영상처리에 대해 아무것도 모르는 상태에서 시작한 터에 이런 좋은 글을 써주시는 분을 뵙게 되어 감동스럽기까지합니다.
    다름이 아니라 첨부된 소스코드의 UndistortImage에 Mat 형태로 frame과 frame_undistort 두가지가 들어가게 되는데 만약 어안렌즈를 통해 왜곡된 이미지만 가지고 있는 경우에는 어떻게 사용하는 건지 궁금합니다.
    현재 opencv를 이용하고 있는데.. 전체적인 프로그래밍 수준이 낮은지라 헤매고 있습니다ㅠㅠ
    감사합니다.

    • BlogIcon 다크pgmr 2015.08.03 13:42 신고 수정/삭제

      frame에 왜곡된 영상을 입력으로 주면 왜곡 보정된 영상이 frame_undistorted에 저장되는 방식입니다.

    • ramones 2015.08.03 17:44 수정/삭제

      답변 감사합니다!

  • 폰카만쓰는데... 2015.08.05 18:51 ADDR 수정/삭제 답글

    먼저 감사합니다. 이미지가 잘 보정 된줄 알았는데, GML과 결과를 비교하다 보니 마치 화면의 중앙이 아닌 왼쪽하단을 중심으로 보정한 것 처럼 보입니다. 왼쪽 하단은 거의 변동이 없고 우측 상단은 과장되게 축소되었습니다. 사용함수는 작성해주신 DistortPixel입니다. 보정된 이미지 각 좌표(i, j)에 변환된 px, py 좌표에서의 왜곡영상 값을 입력하였습니다. CorrIMGtm[i][j] = OrigIMGtm[px][py];
    좋은 질문은 아니나 혹시 추정되는 오류는 무엇이 있을지 여쭤봐도 될까요?

    • BlogIcon 다크pgmr 2015.08.06 21:12 신고 수정/삭제

      카메라 캘리브레이션을 하지 않았거나 예제코드의 기본값을 그대로 사용한 것으로 추정됩니다.

    • 폰카만쓰는데... 2015.08.07 16:32 수정/삭제

      작성해주신 UndistortImage를 쓰면 해결될 것을...
      따로 Normalize등을 부른 후 찾은 px, py의 입력 방식이 달랐습니다.
      보정이미지에 넣을 각 픽셀위치와 왜곡이미지 해당 픽셀 위치를 px, py 순서로 넣었는데 작성해 주신 코드에는 py, px 순서였습니다.
      감사합니다.

  • 초보 2015.11.23 16:19 ADDR 수정/삭제 답글

    안녕하세요. 우선 덕분에 많은 도움이 되고있습니다. 제가 opencv 도 초보라서 main함수를 작성해서 올려주신 소스코드를 붙이는데에도 애를 조금 먹고있습니다. 소스코드를 만들다가 질문이 있어서 그런데, 조금 어이없고 그래도 답변해주시면 정말 감사하겠습니다 ㅜ
    첫번째로, 제가 생각한건 Mat img 로 영상을 불러와서 , UndistortImage함수를 호출하여 입력영상 img와 결과영상 rst 를 지정해주었는데 이방법은 들린건가요? 그리고 x,y값은 따로 제가 지정해 줄필욘 업는거맞죠?? 조금 초보적이고 그래도 답변해주시면 감사하겟습니다 ㅜ

    • BlogIcon 다크pgmr 2015.11.24 09:36 신고 수정/삭제

      네 맞습니다. 생각하신데로 하시면 됩니다.

  • 영상 2016.04.05 16:48 ADDR 수정/삭제 답글

    UndistortPixel의 역활은 뭐죠?

    또한 코드가 320 240 으로 세팅된것 같은데

    640 480으로 하려면 화면 밑부분이 깨지던데

    수정하는 방법이 있나요?

    • BlogIcon 다크pgmr 2016.04.05 16:42 신고 수정/삭제

      픽셀의 왜곡보정된 좌표를 구해주는 함수입니다. 이론적인 자세한 내용에 대해서는 http://darkpgmr.tistory.com/31 글을 참조하시기 바랍니다.

  • 영상 2016.04.05 16:49 ADDR 수정/삭제 답글

    코드가 320 240 으로 세팅된것 같은데

    640 480으로 하려면 화면 밑부분이 깨지던데

    수정하는 방법이 있나요?

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

      제공된 샘플코드는 어떤 값으로도 세팅되어 있지 않습니다. 사용하고 계신 카메라의 파라미터를 정확히 입력했는지 확인하시기 바랍니다.

  • 대학생 2016.04.12 12:32 ADDR 수정/삭제 답글

    안녕하세요. 어안렌즈 영상관련 프로젝트를 진행중인 학생입니다.
    블로그를 보고 많은 도움을 받고있는데, 현재는 왜곡보정을 진행중입니다.
    샘플코드를 이용하여 어안렌즈영상을 보정시 원본영상에비하여 많이 크롭된 영상이 출력되더라고요. 손실을 최소로 줄일 수 있는 방법은 없을까요 ? 좋은자료 매번감사드립니다~

    • BlogIcon 다크pgmr 2016.04.13 02:52 신고 수정/삭제

      원래는 왜곡을 펴면 불가사리 형태의 영상이 나옵니다. 그래서 보통 테두리를 자르고 보기좋게 crop된 영상을 보여줍니다. crop되지 않은 영상이 필요하다면 그리 어렵지 않으니 직접 구현해 보시면 좋을 것 같습니다.

  • StdAfx.h 2016.05.11 00:34 ADDR 수정/삭제 답글

    안녕하세요 이번글 보면서 많은 도움이 될 것 같습니다! 다름이 아니라 제가 opencv 2.411버전을 쓰고 있는데 stdAfx.h 가 무엇인지 잘 모르겠어서 이렇게 연락 드립니다. 좋은자료 매번 감사드려요!

    • BlogIcon 다크pgmr 2016.05.11 09:54 신고 수정/삭제

      응용 프로그램에서 필요로 하는 공통 헤더파일들을 한꺼번에 포함시키기 위한 파일로 알고 있습니다. 구글에서 검색해 보니 좋은 설명글이 있는것 같습니다. --> http://soyoja.com/372

  • BlogIcon 흰털너부리 2016.06.26 04:35 신고 ADDR 수정/삭제 답글

    안녕하세요
    이거랑 좀 다른것 같은데 여기서 질문합니다.
    이미지 와핑에 대해서 알아보고있는데
    서류를 비스듬하게 찍어서 사다리꼴인것을 보정해서 직사각형으로 만드는 것만있더라구요
    제가 구현하고 싶은건 챡을 펼쳐놓고 찍으면 펼쳐진 페이지가 휘어있는데 그걸 똑바르게 펼쳐서 마치 스캔한것 처럼 만들고잎은데 어떻게 해야하고 뭘 어떻게 찾아봐야할까요(검색어라도,,,)?

    • BlogIcon 다크pgmr 2016.06.27 11:51 신고 수정/삭제

      저도 해 본게 아니라 잘 모르겠지만 쉽지 않은 기술로 생각됩니다. 일반적인 이미지 보간 기법 중에 radial basis function interpolation이란 것이 있는데 적용이 될 지는 모르겠습니다.

  • BlogIcon jykim31337 2016.07.03 09:27 신고 ADDR 수정/삭제 답글

    감사합니다. 대단히 큰 도움이 되었습니다. ^^

  • CardisT 2016.07.31 19:27 ADDR 수정/삭제 답글

    안녕하세요 덕분에 Opencv활용 부분에서 많은 지식을 얻고있습니다. 감사합니다.
    질문이 하나 있는데요. 올려주신 코드를 통해서 보정을 직접 해보려고 하는데, 진행과정에서 main함수를 생성하는 부분에서 단순하게 VideoCapture Original(0)으로 영상을 불러오고 Mat original과 Mat DCorrection을 생성하여 Original>>original로 입력을 해주어서 미리 입력해두었던 카메라 내부 파라미터 클래스의 InnerParameter.DistortImage(original, DCorrection)을 통해서 왜곡이 보정된 영상을 얻으려고 하는데요. 그 부분에서 use_opencv.h의 85번째 라인에서 assert fail이 발생하여 진행이 되지 않는 상황입니다. 혹시 이 부분에 관련해서 어떻게 진행을 해야될지 조언을 해주실순 없으실까요?

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

      안녕하세요. 코드에 대한 디버깅은 다른 사람이 알기 어렵습니다. 디버깅 모드로 실행해 보면서 원인을 찾아보시면 좋을 것 같습니다.

  • CardisT 2016.08.03 18:16 ADDR 수정/삭제 답글

    혹시 그렇다면 어떤 개발환경에서 작업하셨는지 알려주실수 있으신가요?
    운영체제와 visual studio 버전정도 알려주시면 감사하겠습니다.
    제가 윈도우10 visual studio 2015에서 작업을 하는 중에 오류가 발생해서 그렇습니다.

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

      개발환경과는 무관한 에러로 보입니다.. 올린 샘플 코드에서는 unsigned char 형으로 채널당 8비트 이미지를 가정하고 있는데 혹시 16비트 이미지 등 이미지 포맷 문제가 아닌지 확인해 보시기 바랍니다. 그리고 올린 샘플은 일반적으로 동작하는 라이브러리 코드가 아니라 왜곡보정 과정에 대해 이해를 돕기 위한 참고용 코드입니다.. 다양한 이미지 포맷이나 사용자 인터페이스 등은 자신의 환경에 맞게 적절히 수정하여 사용하시기 바랍니다.

  • 다크제자 2016.11.29 20:10 ADDR 수정/삭제 답글

    안녕하세요.
    코드 활용에 있어 질문이 있어서 글을 올리게 되었습니다.
    현재 내부파라미터는 구해놓은 상태이며, for문을 사용하여 보정 된 좌표값을 구하려고 합니다.
    화소 별로 각각 보정 좌표값을 따로 구하고 싶을때는 UndistortPixel함수를 사용해야 할지 DistortPixel함수를 사용해야 할지 헷갈려서 질문드립니다.
    (UndistortImage 함수를 사용하지 않고 왜곡을 보정하는 방법)
    코드를 보면 UndistortPixel함수를 사용해해서 왜곡보정 좌표를 구해야 할 것 같은데 UndistortImage함수에서는 DistortPixel함수를 사용하여 왜곡 보정 좌표를 구하는것 같아 질문드립니다.
    감사합니다.

  • BlogIcon 알바 추천 2017.12.01 18:45 신고 ADDR 수정/삭제 답글

    잘보고갑니다

  • dddd 2019.07.03 18:25 ADDR 수정/삭제 답글

    useopencv 헤더파일에서 &에 대한 에러가 20개 정도 뜨는데 뭔지 아실까요 ㅠㅠ

    • BlogIcon 다크pgmr 2019.07.03 23:40 신고 수정/삭제

      아마도 IplImage 때문에 그런 것 같습니다. 지금은 없어진 구조체라서 사용하는 opencv 버전에 따라서 에러가 날 수 있습니다..

  • BlogIcon 어다프 2020.02.18 13:35 신고 ADDR 수정/삭제 답글

    안녕하세요. 올려주신 소스코드를 적용하여 왜곡 보정을 해보았는데요. 최종 결과물에 물결무늬가 생기길래 보간이 안 되었나보다 하고 작업을 진행하던 중이었습니다. 그런데 우선 여기서 질문드리고 싶은 것이 올려주신 소스코드가 보간이 안 된 단순 왜곡만 보정한 이미지를 출력해내는 것인지요? 올려주신 실행파일로 이미지를 열어보면 (비디오가 아니기에 바로 꺼지긴 하지만) 보간이 다 된 이미지로 보이는데요.. 우선 그 부분만 확인 부탁드립니다. (올려주신 소스코드가 보간까지 되어 결과를 출력하는 것인지...)

    • BlogIcon 어다프 2020.02.18 17:47 신고 수정/삭제

      올려주신 코드는 보간을 따로 할 필요가 없네요! 입력 영상 자체가 잘못된 영상이어서 혼선이 있었습니다. 죄송합니다. 올려주신 자료들 깔끔하고 너무 좋습니다. 감사합니다!!

    • BlogIcon 다크pgmr 2020.02.21 14:46 신고 수정/삭제

      안녕하세요. 올린지 오래되어서 저도 잘 기억은 나지 않습니다만, 따로 보간은 하지 않았던 것 같습니다..

    • BlogIcon 어다프 2020.02.25 10:48 신고 수정/삭제

      네.. 저도 지금 계속 해보는 중인데요. 보간은 따로 안 된 것으로 확인했고.. px, py가 0.5를 더해서 반올림한 int 값이더라고요.. 그래서 결과값을 반올림하지 않고 있는 그대로 double로 반환해서 해당 점 주위의 점을 가지고 보간을 했습니다! 답변주셔서 감사합니다 ㅎ

  • blueriver 2020.10.11 22:26 ADDR 수정/삭제 답글

    안녕하세요, 올려 주신글들로 많은 기본 개념을 잡아 가고 있습니다. 다시 한번 감사드립니다.
    fish-eye 카메라 영상을 펴보려 공부를 하는 중입니다. 아직도 정확히 방향이 안잡혀 질문을 드드립니다. 여기에 올려 놓으신 CameraDistorion.cpp을 이용하여 예제 parameter(내부파라미터 + 렌즈왜곡계수( k1, k2, k3, p1, p2))을 이용하여 sample.avi을 돌려보면 올려 놓으신 exe 파일처럼 동작을 합니다. 그래서 제가 생각하기는 제가 사용하려고 하는 fish-eye camera의 내부파라미터와 렌즈왜곡계수만 구해서 예제 대신 사용하면 영상이 펴지거라 생각하고 확인을 하고 있습니다. 그래서calibration 설명에서 올려주신 DarkCamCalibrator.exe을 이용하여 FOV 을 구하면 위의 k1, k2, k3, p1, p2대신에 w가 나오고, Zhang을 이용하면 k1, k2, k3(0으로가정), p1, p2이 나오는데, 실제로 해보면 아주 약간의 보정이 되는것 처럼 보이지만 Fish-eye을 보정하는것은 아니고 실제로 설명에서도 FOV을 fish-eye 값을 구하는것이라고 설명하신것 같으시고, 논문에 설명한 내용을 참조하면 w으로 k1, k2, p1, p2구하실 수 있다고 설명을 해 놓으신것가고요(제가 본파트가 맞는지 모르게는데 아직은 이해를 못했습니다.). 그래서 두가지가 궁금합니다. 먼저 opencv에서 fisheye.clibration같은 함수를 이용하면 camera_matrix(내부변수), distoriton_coefficents(현재 제가 개인적으로 왜곡렌즈계수로 생각중압니다 ㅠ_ㅠ)구할 수 있는데 이값을 이용하여도 올려 주신 CameraDistorion.cpp을 이용하는데 문제가 없는것인지 혹시 답을 알 수있을까 궁금합니다. 그리고 아님 위의 cpp는 논문을 활용한 calibration을 구현해야만 사용이 가능한것인지 알고 싶습니다. 논문만을 참조해야 한다면 FOV의 w 값과 렌즈왜곡계수(k1,k2, p1, p2)와 외부변수 관계를 애해하려면 어디를 더 봐야 하는지 알 수있을까요? 좀더 올려 놓으신 글을 찾아 봐야하겠지만 제가 헤갈리는데 처음에 내부변수 외부 변수(설치높이, 방향(팬, 틸트등) 를 구하면 왜곡을 보정 할수있다고 알고 있다가, 실제 보정에서 렌즈왜곡계수(k1,k2, p1, p2)을 사용하데, 이 렌즈왜곡계수를 구하는 부분을 파악하지 못해서 w와 관계를 이해를 못하여 헤매고 있습니다. 일단 목표가 CameraDistorion.cpp을 활용하여 제가 가진 fish-eye camera의 영상이나 스틸이지를 보정하는것을 구현하려고 하는 중입니다. 가능 하시면 조언을 좀 부탁 드립니다. 감사합니다. 혹시 너무 몰라소 잘못된 설명이나 질문을 드린것이면 다시 한번 죄송합니다.

    • BlogIcon 다크pgmr 2020.10.11 23:13 신고 수정/삭제

      네, 첨부된 cameradistortion.cpp 파일의 내용을 이용하면 opencv Zhang 모델(k1, k2, p1, p2)에 대한 영상 왜곡 보정이 가능합니다. 만일, 영상이 잘 안펴진다면 구한 카메라 파라미터가 정확하지 않아서일 수 있습니다. 아니면 카메라가 워낙 광각이라서 opencv Zhang 모델로는 왜곡이 잘 모델링되지 않아서일 수도 있을 것 같습니다.

      Zhang 모델 대신에 FOV 모델(w)을 사용하는 것도 한 방법인데, FOV 모델을 사용하려면 왜곡변환 부분을 FOV 모델에 맞게 수정해야 합니다. 해당 FOV 논문에 보면 변환식이 나와 있으니 참고해서 구현하면 그렇게 어렵지는 않습니다.(FOV 논문: F. Devernay and O. D. Faugeras. Straight lines have to be straight. Machine Vision and Applications, 13(1):14?24, 2001)

      https://darkpgmr.tistory.com/31 글에 있는 왜곡보정의 원리와 첨부된 코드를 같이 참조하면 도움이 되리라 생각합니다.

    • BlogIcon blueriver 2020.10.12 11:37 수정/삭제

      답변 너무 감사합니다. 광각이 원인일 수도 있겠습니다. 논문을 열심히 한번 보도록 하겠습니다. 감사합니다.

  • 일반인 2020.12.03 17:22 ADDR 수정/삭제 답글

    안녕하세요. 다크프로그래머님 글보고 영상처리에 대하여 많이 배우고 있습니다. 정말 감사합니다.
    영상왜곡 보정을 하고 싶어 올려주신 프로그램 소스로 진행 해보았는데,
    UndistortImage(const Mat& frame, Mat& frame_undistort) 이 함수를 호출하여 사용하였는데, 함수의 수행시간이 200ms 씩이나 되어서 영상이 딜레이가 있게 동작 하여 실시간 영상처리가 어려운것으로 보여 졌습니다.
    혹시 함수를 잘 못 사용하여 이렇게 동작 시간이 오래 걸리는지 알고 싶습니다.

    • BlogIcon 다크pgmr 2020.12.04 23:12 신고 수정/삭제

      상황에 따라서 시간은 많이 걸릴 수도 있습니다. 이미지 해상도가 클수록 시간이 많이 걸립니다. 저도 직접 시간을 측정해 보지는 않았지만 200ms면 많이 걸리는 것 같네요. opencv에도 undistort 함수가 제공됩니다. 해당 함수로도 한번 적용해 보시면 좋겠네요. 그리고 lookup 테이블을 만들어서 미리 계산된 값을 이용하면 조금 더 빠르게 할 수는 있습니다.

  • Kamien 2021.01.04 12:48 ADDR 수정/삭제 답글

    안녕하세요 프로그램 사용에 있어서 궁금한 점이 있어 문의드립니다
    컴퓨터에 내장된 웹캠이 아닌 다른 소스의 라이브 영상(캡처보드를 통해 연결한 카메라)를 보정하는 방법은 없을까요?

  • ikjunn 2021.04.06 14:36 ADDR 수정/삭제 답글

    안녕하세요 캘리브레이션 공부에 많은 도움이 되었습니다!
    아직 잘 모르겠는 부분이 있어서 댓글남깁니다ㅠㅠ
    지금 시도하고 있는 부분이
    카메라 2대의 각 캘리브레이션 값을 구해 2대의 원점을 일치시켜 실시간으로 동작시키려고 하는데
    각 캘리브레이션 값을 어떻게 대입하면 될까요??
    이 프로그램에서는 텍스트파일에 쓴 파라미터 값이 어떻게 코드에 반영되는지 알아보려고 했으나
    이해가 부족한지 못찾겠네요ㅠㅠ
    감사합니다!

    • BlogIcon 다크pgmr 2021.04.08 09:04 신고 수정/삭제

      안녕하세요 포함된 소스코드는 왜곡보정에 관련된 핵심 코드만 포함되어 있습니다. 사용자 인터페이스 및 파일 입출력 등 전체 프로그램 코드는 포함되어 있지 않습니다. 동영상, 텍스트 파일 입출력 등은 직접 구현하셔야 합니다..