기존에 사용하던 Opencv 보정함수는
단순히 cv2.Undistortion 함수였는데 UndistortImageOptimal 함수에 대해서도 알아보게 되었음.
또한 배경의 장애물들로 인한 cv2.FindChessboardCorners 인식이 저하되어
해당 이미지들의 ChessboardCorner를 강제로 찾아내는 과정에 대해서도 알게되었음.
기존에는 FOV 800mm의 크지않은 ChessBoard를 사용하였기 때문에
큰 무리없이 이미지 촬영을 진행하였는데
이번 프로젝트에서는 FOV 3000mm의 넓은 CheckerBoard를 제작하여
사용하였기 때문에 이미지 촬영이 쉽지 않았음.
위 이미지를 보면 알 수 있듯이 센터에서 촬영하는건 줄을 매달고 올라가지 않는 이상 불가능 하였음.
따라서 위 이미지를 사용하여 cv2. FindChessboardCorners 하게되면 34장의 이미지 중
15장의 이미지만 인식이 되는 결과가 발생함.
위 문제를 CheckerBoard의 영역만 ROI를 지정해 준 뒤
픽셀값 0의 Mask 이미지를 하나 생성하고 해당 ROI에 해당하는 부분을 255로 변환
및 해당 Mask 이미지위에 이미지를 and연산하여
ROI의 영역만 보이는 새로운 이미지에서 FindChessboardCorners 를 실행
위 이미지 처리 방법을 사용하여 기존 15/34 => 44%의 인식률을 24/34 => 70%의 인식률까지 개선 하였음.
위 왜곡보정 데이터를 사용하여 실제 렌즈의 왜곡률을 개선하고
개선된 이미지를 사용하여 Motor와의 위치값을 통일시키는 Calibration 을 진행하는데
실제 사용해야하는 이미지를
cv2.Undistortion 과 getOptimalNewCameraMatrix 이후의 cv2.Undistortion 중 선택하여 사용해야 함.
위 매서드의 차이점을 CluadeAI를 통해 알아 보았음.
-
-
1. 일반적인 cv2.undistort 사용
pythonCopydst = cv2.undistort(img, camera_matrix, dist_coeffs)- 원본 이미지의 모든 픽셀을 왜곡 계수를 사용하여 보정합니다
- 보정 후 이미지 가장자리에 검은색 영역이 생길 수 있습니다
- 출력 이미지의 크기가 입력 이미지와 동일합니다
- 간단하지만 이미지 가장자리의 정보 손실이 발생할 수 있습니다
2. cv2.getOptimalNewCameraMatrix 적용 후 cv2.undistort 사용
pythonCopynew_camera_matrix, roi = cv2.getOptimalNewCameraMatrix( camera_matrix, dist_coeffs, imageSize, alpha) dst = cv2.undistort(img, camera_matrix, dist_coeffs, None, new_camera_matrix)- 왜곡 보정 후 최적의 새로운 카메라 행렬을 계산합니다
- alpha 매개변수를 통해 출력 이미지의 특성을 조절할 수 있습니다:
- alpha=0: 불필요한 픽셀을 모두 제거 (검은 영역 최소화)
- alpha=1: 모든 픽셀을 유지 (원본 이미지의 모든 정보 보존)
- 0<alpha<1: 두 경우의 절충안
- ROI(Region of Interest) 정보를 얻을 수 있어 불필요한 영역을 크롭할 수 있습니다
주요 차이점 정리
- 이미지 품질:
- 일반 undistort: 단순 보정으로 가장자리 왜곡이나 정보 손실이 발생할 수 있음
- getOptimalNewCameraMatrix 사용: 최적화된 보정으로 더 나은 이미지 품질 제공
- 유연성:
- 일반 undistort: 매개변수 조정 불가
- getOptimalNewCameraMatrix 사용: alpha 값 조정으로 결과 이미지 특성 제어 가능
- 활용성:
- 일반 undistort: 간단한 보정이 필요한 경우 적합
- getOptimalNewCameraMatrix 사용: 전문적인 컴퓨터 비전 응용에 더 적합
- 출력 이미지:
- 일반 undistort: 항상 원본과 같은 크기
- getOptimalNewCameraMatrix 사용: ROI를 통해 필요한 영역만 선택 가능
사용 권장 사항
- 일반 cv2.undistort 사용 시나리오:
- 간단한 왜곡 보정이 필요한 경우
- 실시간 처리가 필요한 경우
- 이미지 크기 유지가 중요한 경우
- getOptimalNewCameraMatrix 사용 시나리오:
- 고품질의 왜곡 보정이 필요한 경우
- 이미지 가장자리의 품질이 중요한 경우
- 유연한 출력 이미지 조정이 필요한 경우
- 정밀한 컴퓨터 비전 작업이 필요한 경우
-
좀 더 이해한 내용을 바탕으로 정리하면
일반 cv2.Undistortion 의 경우 기존의 카메라가 갖고 있는 Matrix 를 사용한 이미지에 단순 왜곡 계수를 사용하여
( * 여기서 Opencv의 Mat과 헷갈렸는데 카메라 내부 파라메타를 가지고 있는 3x3 행렬의 카메라 매트릭스를 의미 )
이미지를 보정하지만
getOptimalNewCameraMatrix 는 왜곡 계수를 사용하여 새로운 카메라 특성의 Matrix를 생성하고
해당 Matrix를 사용하여 원본 이미지를 왜곡 보정하는 것임.
개인적인 생각으로 getOptimalNewCameraMatrix를 사용하면 가장자리에 있는 이미지 보정이 좀 더 미세하게 가능하지만
만약 이미지의 가장자리 보정이 중요하지 않다면 단순 Undistortion을 사용하여도 무방할 것 같음.
결과 이미지를 첨부하고 글을 마침.
'Program > OPEN_CV' 카테고리의 다른 글
[Open CV] 딥러닝활용 _ Mask-RCNN 영역 분할 (0) | 2022.07.30 |
---|---|
[Open CV] 객체추척과 모션벡터 _ OpenCV 트래커 (0) | 2022.07.04 |
[Open CV] 객체추척과 모션벡터 _ 밀집 옵티컬플로우 (0) | 2022.07.03 |
[Open CV] 객체추척과 모션벡터 _ 카나데옵티컬플로우 (0) | 2022.07.02 |
[Open CV] 객체추척과 모션벡터 _ 캠시프트 알고리즘 (0) | 2022.06.30 |