0. 주절주절
프로젝트 초창기에 Teledyne DALSA 카메라를 사용했었다.
굉장히 유명한 산업용 카메라임에도 불구하고 사용하는게 매우 불편했다.
OpenCV 데모 코드도 없고 거래처에서도 OpenCV에서는 사용하기 힘들거라는 답변만 줬던 기억이...
당시 C++로 dll을 만들어서 C#에서 넘겨받아야 하는 상황이였기 때문에
카메라 라이브러리를 내맘대로 제어할 수 있어야 했었다.
그래서 결국은 Hikvision사의 카메라로 변경했다.
Hikvision 카메라는 OpenCV 데모 코드도 있었고 라이브러리 사전이 굉장히 상세하게 구현되어있다.
그래서 카메라를 정말 내맘대로 프로젝트에 맞게 컨트롤할 수가 있다.
이번 포스팅에서는 Hikvision 카메라를 어떻게 OpenCV C++에서 사용하는지 정리해 볼 것이다.
★ [ 전제 조건 ]
1. OpenCV 환경 설정 완료
2. Hikvision 카메라 보유
1. 환경 설정
먼저 MVS라는 프로그램을 설치해야한다. (Hikvision 홈페이지에서 다운로드 가능)
MVS는 SDK를 포함해서 간단하게 카메라를 제어하고 상태를 확인할 수 있는 소프트웨어다.
카메라 확인용 소프트웨어기 때문에 120fps 이상 녹화는 불가능하다.
프로그램을 실행하면 왼쪽에 연결된 USB 리스트가 쫙 뜨게 된다. (이더넷은 리스트 상단)
현재 연결된 카메라 2대가 마지막에 뜨고 있다.
MVS는 그냥 카메라가 잘 연결됐는지 확인하거나 사진 촬영, 노출값 테스트정도로만 사용하자.
설치가 됐으면 C:\Program Files (x86) 경로에 MVS 라는 폴더가 하나 생성된다.
Samples 폴더에는 OpenCV를 포함해서 Halcon이나 DirectShow 같이 여러 영상처리 라이브러리를 연계하여 작성된 데모 프로그램과 소스코드가 있다.
내가 놀랐던 건 여기.
Dalsa는 기본적인 데모 코드만 존재하고 라이브러리 사전도 정말 불친절하다.
그런데 Hikvision은 굉장히 상세하게 사전을 작성해놨다.
그래서 바로 개발에 들어갈 수 있었다.
프로젝트에 맞게 문서를 참고해가면서 개발하면 될 것 같다.
2. 카메라 제어 흐름 이해
카메라를 연결하고 MVS를 설치했다면 카메라 제어 흐름에 대해 알아보자.
산업용 카메라를 한 번이라도 만져본 사람이면 알겠지만 일반 카메라와 제어 방법이 꽤 다르다.
웹캠의 경우 PC에 USB 단자를 꽂으면 자동으로 인식이 되어서 Videocapture(0)과 같은 코드로 바로 이미지 데이터를 쉽게 가져올 수 있다.
하지만 산업용 카메라는 카메라 주소값을 받아오는 것부터 시작해서 프레임 하나를 가져오는 것 까지 일일히 개발자가 설정해주어야 한다.
개발자 입장에서는 처음에는 귀찮지만 본인이 원하는 대로 카메라를 제어할 수 있다는 것이 또 장점이 된다.
MVS SDK Programming Manual에 기재된 카메라 제어 플로우 차트다.
주의해서 봐야할 부분은 파란색 실선 박스다.
차트에는 나와있지 않지만 보통 Open과 Close 사이에 Grab, Get Frame, Stop과 관련된 함수가 들어간다.
☆ 자세한 함수 설명은 여기
[ 정리 ]
1. int MV_CC_CreateHandle( void *handle, const MV_CC_DEVICE_INFO *pstDevInfo )
- Create handle.
- 연결된 카메라를 찾는 함수. 이 함수로 카메라의 핸들을 얻게 된다. ( void *handle )
- 이후 카메라 제어하는 데 있어서 핸들은 꼭 필요
2. int MV_CC_OpenDevice( void *handle, unsigned int nAccessMode = MV_ACCESS_Exclusive, unsigned short nSwitchoverKey = 0 )
- Open device.
- 핸들에 해당하는 카메라를 연결한다.
- 이 부분이 정상적으로 작동되어야 카메라 데이터를 받아올 수 있다.
3. int MV_CC_StartGrabbing( void *handle )
- Start acquiring image.
- 카메라가 이미지를 잡기(촬영하기) 시작한다.
- 이 상태에서 프레임을 가져올 수 있다.
4. int MV_CC_GetOneFrameTimeout( void *handle, unsigned char *pData, unsigned int nDataSize, MV_FRAME_OUT_INFO_EX *pFrameInfo, int nMsec )
- Get one frame of picture, support getting chunk information and setting timeout.
- 카메라 이미지 데이터를 가져오는 함수. 함수 한 번 실행당 한 프레임을 받는다.
- 받아온 데이터는 *pData에 저장된다.
5. int MV_CC_StopGrabbing( void *handle )
- Stop recording.
- 카메라 중지
- 이 상태에서는 프레임 가져오기 불가능
6. int MV_CC_CloseDevice( void *handle )
- Shut device.
- 카메라 연결 해제
7. int MV_CC_DestroyHandle( void *handle )
- Destroy device example and related resources.
- 카메라 핸들 제거 및 관련 리소스 해제
'개발 > Computer Vision' 카테고리의 다른 글
Hikvision 산업용 카메라 OpenCV C++로 사용해보기 - 3 - (0) | 2020.01.15 |
---|---|
Hikvision 산업용 카메라 OpenCV C++로 사용해보기 - 2 - (0) | 2020.01.14 |