어제 오늘 회사 프로젝트의 OpenCV 버전 변경 작업을 수행했다.
개발자들이 가장 싫어한다는 외부 라이브러리 버전 변경 작업을 이번에 처음으로 수행하게 되었다.
OpenCV버전 변경의 제일 중요하고 어려웠던 작업은 IplImage를 cv::Mat으로 대체하는 것이었다.
IplImage 객체 하나를 변경할 때마다 빌드 오류가 50~100개는 발생했다.
작업을 더 어렵게 했던 점은 코드의 반복이 너무 많았다는 점이다.
예를 들면, 단순히 이미지를 저장하는 코드가 함수, 클래스의 메소드화 되지 않고 하드코딩되어 있었는데, 그냥이 100개는 되었다. 이 모든 이미지 저장 코드를 일일히 하나하나 찾아가며 변경하는 작업은 매우 노동집약적이었다.
또한 깃/깃허브를 사용하지 않은 프로젝트여서 버전 관리 및 공동작업이 어려웠다.
결국 나 혼자 OpenCV를 업그레이드 해야 했고, 소스가 빌드되도록 하는데 까지 어제 오늘 약 20시간이 소요되었다.
물론 공부는 많이 되었다. OpenCV의 CAPI와 IplImage와 Mat객체, 그리고 Opencv라이브러리의 구조를 파악하는데는 이번 작업이 큰 공을 세웠다.
이번 OpenCV 버전 업데이트를 통해 얻은 점은 아래와 같다.
- OpenCV의 CAPI와 IplImage에 대한 이해를 얻었다.
- 프로젝트의 IplImage의 의존성 제거. 향후 해당 소스를 사용하는 다른 프로젝트는 IplImage와 Mat을 혼용하여 사용하지 않고 Mat만 사용하여 코드의 효율성을 증대할 수 있다.
- 향후 프로젝트를 새로 시작할때 더 쉽게 유지보수가 가능할 것이다.
- CMake를 사용하여 X86버전 최신 소스를 빌드하는 방법을 알았다.
- Visual Studio의 모두 바꾸기 기능을 알게 되었다.
- 최신 버전의 OpenCV에서 레거시 코드를 지원하는 방법을 알게 되었다.
이번 OpenCV버전 업데이트를 통해 느낀 점은 아래와 같다.
- 반복되는 코드가 유지보수성과 버그 발생에 있어서 얼마나 중대한 위협이 되는지 알게 되었다.(사실 이건 기존에 코드를 짯던 사람들이 알았어야 한다. 그들은 앞으로도 그렇게 반복되는 코드를 작성할 것이다.)
- 깃, 깃허브를 회사의 모든 사람들이 사용하도록 반복적으로 어필해야 한다. 단 한사람이라도 깃/깃허브를 사용하지 않으면 의미가 없다.
- 제때 제때 버전 업그레이드를 하지 않으면 나중에 크게 피를 본다.(물론 이를 유발한 사람은 남을 시키거나 회사를 탈주했을 가능성이 높다.)
- 코드 정리는 필수다. 어디에 사용하는지 아무도 모르는 코드가 곳곳에 산재해 있어 빌드 속도와 의존성을 발생시킨다.
- 그럼에도 버전업그레이드를 완료하니 매우 보람찼다.
앞으로 할것
- 동료들에게 iplImage대신 Mat을 사용하도록 설득한다.
- 깃, 깃허브를 더 잘 사용할 수 있는 방법을 공유한다.(행동으로 보여주는 것이 좋을 것이다.)