Knowhow 105

TBB 팁

1) TBB는 install 하고 나서 CMakeLists.txt 내에 find_package(TBB REQUIRED)만 추가해준다면 못 찾는 경우가 빈번함. 아래에 적힌 2개의 문장처럼 뭔 오류인지 모르겠는 말이 계속 나온다면 TBB를 못찾고 있는게 맞다. undefined reference to `tbb::interface7::internal::task_arena_base~~~ tbb::interface9::global_control::global_control(tbb::interface9::global_control::parameter, unsigned long) ~~~ 해결법은 미리 cmake되어서 모듈화되어있는 TBB를 연결해주는 방법이다. https://github.com/justusc/Fin..

Boost serialization 팁들

Tips 1) shared_ptr 와 같이 쓴 변수들은 A에 serialize() overriding을 해줬더라도 오류가 난다. 다음 include 필수. 세트로 도 잊지 말자. #include #include 2) 다음와 같은 오류명이 잔뜩 뜰 수 있음 [build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::detail::basic_iarchive::next_object_pointer(void*)' [build] /usr/bin/ld: ../core/libsfm.so: undefined reference to `boost::archive::basic_binary_oprimitive::init()' [build] /u..

Boost serialization

c++에서 새로운 클래스를 정의하고 이로 만든 객체를 저장하고 싶을 경우가 있다. 나는 대표적으로 Frame이라는 클래스 내에 이미지, 이미지 경로, 이미지 feature, intrinsic parameters 등 전부 담아둔 뒤, 모든 입력 이미지를 Frame 객체로 만들어두는 작업에서 필요성을 느꼈다. 이 경우 저장을 어떻게 할지 멤버 변수마다 하나하나 지정해줘서 저장 함수를 구현해야 하기 마련인데 이게 도통 귀찮은 일이 아니기 때문에 이를 지원하는 기능이 boost에 있었다. boost의 serialization 기능을 이용해 객체 자체를 직렬화해버리고 그냥 파일에 써버리는 것이다. 당연히 human readable 형태는 아니지만 deserialization 기능을 이용해 다시 원복했을 때 저장했..

CMake 백과사전

CMake를 다룰 때 개념을 잡기 위해 반드시 보면 좋을 문서를 찾았다. 제목이 쪼오오금 도움이 되는 문서지만 실제로 도움이 많이 된다. 내용을 옮겨적기에 방대한 양이지만 다 쓸모있는 내용들로 길어진 것이어서 다 읽어볼만 하다. https://gist.github.com/luncliff/6e2d4eb7ca29a0afd5b592f72b80cb5c CMake 할때 쪼오오금 도움이 되는 문서 CMake 할때 쪼오오금 도움이 되는 문서. GitHub Gist: instantly share code, notes, and snippets. gist.github.com

Ubuntu terminal 분할해서 사용하기

Ubuntu에서 작업하면 전부 다 터미널을 사용하게 되는데, 매 작업마다 새로운 터미널을 쓰면 관리가 힘들다. 여러 개의 터미널을 쓰는 건 동일하지만 터미널끼리 붙어있기만 해도 보기가 편한데 이 때 딱 좋은 프로그램이 있다. 이름이 거창하게 터미네이터(Terminator) (ㅋㅋ)인데 설치도 쉽고 사용도 쉽다. 설치 sudo apt-get install terminator 완료되면 새 터미널 열 때부터 자동 적용된다. 사용법 터미널 위아래로 쪼개기 : Ctrl + Shift + O 터미널 좌우로 쪼개기 : Ctrl + Shift + E 터미널 넘나들기 : Ctrl + Tab 현재 터미널만 끄기 : Ctrl + Shift + W 주의 사항 터미널 좌우로 쪼개는 Ctrl + Shift + E 커맨드가 안 먹..

Knowhow/Linux 2023.09.07

이미지 회전에 맞추어 intrinsic/extrinsic calibration 값 회전시키기

실제 카메라를 설치할 때 공간적 제약 혹은 화각의 문제로 카메라를 돌려서 설치하는 경우가 있다. 시계 방향으로 90도 혹은 반시계 방향으로 90도가 가장 흔한 경우인데 이 때 이미지는 또 똑바로 보고 싶을 때도 많다. 이미지만 사용할 경우에야 간단히 cv2.rotate를 쓰든 numpy를 쓰든 돌리면 끝이지만 만약 카메라 캘리브레이션 값도 같이 써야할 경우는 귀찮은 일이 많이 생긴다. 90도 돌린 경우에 intrinsic parameter는 focal length, fx, fy를 서로 스위칭해주어야 하고 principal point는 회전 방향에 따라 값을 재계산해주어야 한다. 또한 extrinsinc parameter 역시 yaw rotation을 가해주어야 한다. 계산하는 것이 어렵지는 않다만 귀찮고..

Knowhow/Vision 2023.08.17

Shell script 기본 사용법 정리

쉘 스크립트를 잘 사용하지 않았는데, 커맨드를 자동으로 넣어주도록 하는 작업이 꽤 빈번하게 필요해서 한 번 정리해보고자 한다. 복잡한 스크립트를 짜기 위함이라기보다 반복 실험이나 반복 실행처럼 단순 노가다성 작업이나 argument만 바뀔 뿐 커맨드는 같은 작업을 최소화하는 수준을 익히는데 초점을 두고 정리했다. 기본 세팅 shell script를 작성할 때, 기본적으로 첫줄에 #!/bin/bash를 적어두는 것이 일반적이다. 또한, shell script 실행 권한을 부여하는 작업을 해두어야 한다. 777은 읽고 쓰기 모두 부여하는 권한이므로 만약 write를 막아두고 싶다면 다른 숫자를 부여하면 된다. sudo chmod 777 YOUR_SCRIPT.sh 권한 번호 세자리는 파일 소유자/파일 그룹/다..

Knowhow/Linux 2023.08.07

Docker 이미지/태그 명 바꾸기, private server에 push하기

제목 그대로 로컬에 갖고 있는 docker 이미지를 이름 변경하여 private server에 올리는 과정을 적는다. Docker 이미지 이름, 태그 이름 바꾸기 docker tag [원래 이미지 이름]:[원래 태그 이름] [새로운 이미지 이름]:[새로운 태그 이름] 명령어는 간단하다. 위 명령어를 사용하면 로컬에 이미 만들어둔 이미지의 이름만 새로 생긴다. 실제로 docker images를 통해 리스트를 띄워보면, 새롭게 생성된 이미지의 ID가 이전과 같은 것을 볼 수 있다. 내용물 전체를 똑같이 복사한다기 보다 이름만 새로 만들고 주소를 공유하는 식 같다. Docker private server 로그인 docker login -u [USER ID] -p [PASSWORD] [SERVER URL OR ..

Knowhow/Docker 2023.07.03

DockerFile 내부에서 github private repository clone 하기

DockerFile을 작성할 때, git clone 명령어를 포함해야 하는 경우가 종종 있다. 생성할 도커 이미지가 단순히 환경 구축용이고 컨테이너를 띄울 때 필요한 코드나 폴더들을 volume mount를 통해 연결해서 사용한다면 해당사항이 없겠지만, 도커 이미지를 이용해 환경+코드가 다 포함되어 있고 1회 실행용 컨테이너를 띄우고자 할 때는 자주 마주하게 된다. 다른 말로 volume mount로 이것저것 덕지덕지 붙이는 것없이 도커 컨테이너를 이미 모든 것을 포함한 형태로 띄우고 싶으면 높은 확률로 DockerFile 내에 이런저런 git clone 명령어를 포함하게 된다. 문제는 open source일 경우, 권한 문제가 없기 때문에 그냥 RUN git clone 명령어가 오류없이 동작하지만 gi..

Knowhow/Docker 2023.06.22

python에서 yaml 다루기, PyYAML vs ruamel.yaml

python에서 yaml을 쓰거나 읽을 때 일반적으로 PyYAML을 사용한다. 검색하면 제일 먼저 나오고 import도 직관적이어서 애용한다. 그리고 웬만한 경우에는 PyYAML로 다 해결되기 때문에 효과적이기도 하다. pip install PyYAML ### import yaml PyYAML을 쓰다가 가끔 오류가 나는 경우가 있는데 바로 yaml 최상단에 버전(+ 주석)이 명시된 경우다. camodocal 같은 과거 c++ 기반 툴들을 쓰다보면 이렇게 저장되는 yaml 파일을 볼 수 있는데 이 파일들은 PyYAML로 못 연다. (버전 1.0 이전 같다.) 예를 들어, 다음과 같이 yaml 파일이 바로 contents로 시작하지 않고 버전이 명시돼있거나 주석이나 splitter 같은 표기가 들어가있을 경..