모션 감지 API¶
헤더 파일¶
OasisMotion.h
MotionDetectObserver 인터페이스¶
class MotionDetectObserver : public std::enable_shared_from_this<MotionDetectObserver>
{
public:
MotionDetectObserver();
virtual ~MotionDetectObserver();
virtual void onMotionDetected(int32_t camera_id, int32_t detected);
};
void
onMotionDetected
(
int32_t
camera_id
,
int32_t
detected
)
OasisMotion.h
움직임이 감지 되었을 때 호출됩니다.
매개변수
camera_id
createMotionDetector 호출 시 key-value map 매개변수로 전달 된 카메라 ID 입니다.
detected
움직감 감지 강도입니다.
함수¶
MotionDetectorRef
createMotionDetector
(
const MediaSourceRef &
source
,
key_value_map_t &
parameters
)
OasisMotion.h
모션 감지기를 생성합니다.
매개변수
source
모션 감지의 영상 소스 입니다. Camera나 미디어 플레이어의 playerGetVideoTrackSource 등 영상을 제공하는 MediaSource가 될 수 있습니다.
parameters
모션 감지에 필요한 key-value map 매개변수입니다.
리턴값
성공하면 MotionDetector 객체를 리턴합니다. 실패하면 nullptr을 리턴합니다.
모션 감지에 필요한 key-value map은 아래와 같습니다.
키
기본값
필수
설명
camera-id
configCameras에서 설정한 카메라 장치 ID 입니다.
track-id
재생일 경우, source는 track-id에 해당하는 MediaSource입니다.
enable
"1"이면 모션 감지를 활성화 합니다. "0"이면 모션 감지를 비활성화합니다.
fps
6
모션 감지용 fps입니다. CPU 부하에 따라 적정한 값을 지정합니다.
use-g2d
0
"1"이면 칩셋의 하드웨어 가속 스케일링을 사용합니다. "0" 이면 SIMD 소프트웨어 스케일링을 사용합니다. 소프트웨어 스케일링은 최대 4배로 축소할 수 있습니다. 4배 초과하여 스케일링을 할 경우, 하드웨어 가속이 필요합니다.
sensitivity-level
5
모션 감지 민감도를 설정합니다. 1~6 사이 값을 사용합니다. (사용하지 않습니다)
version
2
모션 감지에 쓰일 엔진 버전을 선택합니다. 1또는 2값을 사용하며, 2값이 최신 버전입니다.
threshold
0
○
모션 발생을 판단하는 최소 모션 감지 값입니다.
state-size
5
내부 알고리즘용입니다.
window-scale
3.0
내부 알고리즘용입니다.
window-threshold
3.5
내부 알고리즘용입니다.
shadow-factor
0.5
내부 알고리즘용입니다.
weight-factor
0.01
내부 알고리즘용입니다.
weight-threshold
0.9
내부 알고리즘용입니다.
height-max
100
모션 감지를 위해 스케일한 영상의 최대 허용 높이입니다.
is-player
0
미디어 재생에 사용할 경우, "1" 값을 지정합니다.
buffer-count
3
영상 버퍼 개수입니다.
MotionDetectorRef
createMotionDetector
(
key_value_map_t &
parameters
)
OasisMotion.h
카메라 장치 영상용 모션 감지기를 생성합니다. 카메라 장치는 "camera-id" 키값을 사용합니다.
매개변수
parameters
모션 감지와 카메라 장치에 필요한 key-value map 매개변수입니다.
리턴값
성공하면 MotionDetector 객체를 리턴합니다. 실패하면 nullptr을 리턴합니다.
int32_t
destroyMotionDetector
(
MotionDetectorRef &
motion_detector
)
OasisMotion.h
createMotionDetector로 생성한 모션 감지기를 해제합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorId
(
const MotionDetectorRef &
motion_detector
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
리턴값
모션 감지기 ID를 리턴합니다. MediaSource 값과 동일합니다.
int32_t
motionDetectorStart
(
const MotionDetectorRef &
motion_detector
,
const std::shared_ptr<MotionDetectObserver> &
observer
)
OasisMotion.h
모션 감지를 시작합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
observer
모션 감지 이벤트 호출을 위한 MotionDetectObserver로 부터 유도된 사용자 정의 observer 객체입니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorStop
(
const MotionDetectorRef &
motion_detector
)
OasisMotion.h
모션 감지를 중지합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetSensitivityLevel
(
const MotionDetectorRef &
motion_detector
,
int32_t
level
)
OasisMotion.h
모션 감지기의 민감도를 설정합니다. 현재 사용하지 않습니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
level
1~6 값을 지정합니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetThreshold
(
const MotionDetectorRef &
motion_detector
,
int32_t
threshold
)
OasisMotion.h
모션 감지기의 감지 임계값을 설정합니다. 이 값보다 높은 픽셀 변동이 발생하면 모션 감지 이벤트가 발생됩니다. 임계값은 key-value map의 "height-max" 값에 따라서 결정됩니다. 최초 threshold 값을 "0"으로 하여 감지 이벤트에서 모션 감지 값을 확인하여, 운영에 맞는 적합한 값을 선택할 수 있습니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
threshold
모션 감지 임계값입니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetStateSize
(
const MotionDetectorRef &
motion_detector
,
int32_t
size
)
OasisMotion.h
내부 알고리즘에 따른 각 픽셀의 state 개수를 지정합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
size
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetWindowScale
(
const MotionDetectorRef &
motion_detector
,
float
scale
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
scale
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetWindowThreshold
(
const MotionDetectorRef &
motion_detector
,
float
threshold
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
threshold
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetShadowFactor
(
const MotionDetectorRef &
motion_detector
,
float
shadow
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
shadow
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetWeightFactor
(
const MotionDetectorRef &
motion_detector
,
float
weight
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
weight
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetWeightThreshold
(
const MotionDetectorRef &
motion_detector
,
float
threshold
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
threshold
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorSetFrameRate
(
const MotionDetectorRef &
motion_detector
,
int32_t
fps
)
OasisMotion.h
모션 감지용 프레임 레이트를 설정합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
fps
프레임 레이트 값입니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetSensitivityLevel
(
const MotionDetectorRef &
motion_detector
,
int32_t &
level
)
OasisMotion.h
현재 모션 감지기 민감도를 리턴합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
level
OUT
민감도 값이 저장되어 리턴됩니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetThreshold
(
const MotionDetectorRef &
motion_detector
,
int32_t &
threshold
)
OasisMotion.h
모션 감지기의 현재 설정된 감지 임계값을 리턴합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
threshold
OUT
모션 감지 임계값이 저장되어 리턴됩니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetStateSize
(
const MotionDetectorRef &
motion_detector
,
int32_t &
size
)
OasisMotion.h
내부 알고리즘에 적용된 각 픽셀의 state 개수를 리턴합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
size
OUT
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetWindowScale
(
const MotionDetectorRef &
motion_detector
,
float &
scale
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
scale
OUT
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetWindowThreshold
(
const MotionDetectorRef &
motion_detector
,
float &
threshold
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
threshold
OUT
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetShadowFactor
(
const MotionDetectorRef &
motion_detector
,
float &
shadow
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
shadow
OUT
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetWeightFactor
(
const MotionDetectorRef &
motion_detector
,
float &
weight
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
weight
OUT
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetWeightThreshold
(
const MotionDetectorRef &
motion_detector
,
float &
threshold
)
OasisMotion.h
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
threshold
OUT
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorGetFrameRate
(
const MotionDetectorRef &
motion_detector
,
int32_t &
fps
)
OasisMotion.h
모션 감지기에 현재 설정된 프레임 레이트를 리턴합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
fps
OUT
현재 설정된 프레임 레이트가 저장되어 리턴됩니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorAddROIRegion
(
const MotionDetectorRef &
motion_detector
,
int32_t
left
,
int32_t
top
,
int32_t
width
,
int32_t
height
,
bool
enabled
)
OasisMotion.h
모션 감지기에 영역을 추가합니다. 영역의 각 좌표값은 원본 영상 크기 기준입니다. 모션 감지기에 적어도 하나 이상의 모션 감지 영역을 설정하게 되면, 전체 모션 감지가 아닌 각 영역별 모션 감지가 이루어집니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
left
영역의 왼쪽 좌표입니다.
top
영역의 위쪽 좌표입니다.
width
영역의 너비입니다.
height
영역의 높이입니다.
enabled
이 영역에 모션 감지할 지 여부를 지정합니다. true이면 모션 감지를 합니다.
리턴값
성공하면, 모션 감지 영역의 ID 값을 리턴합니다. 실패하면 -1을 리턴합니다.
int32_t
motionDetectorEnableROIRegion
(
const MotionDetectorRef &
motion_detector
,
int32_t
roi_id
,
bool
enable
)
OasisMotion.h
특정 영역의 모션 감지 여부를 설정합니다. 모든 영역을 비활성화하게 되면 전체 모션 감지를 시작합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
roi_id
motionDetectorAddROIRegion로 리턴받은 영역 ID입니다. -1이면 모든 영역을 설정합니다.
enable
true이면 모션 감지를 합니다. false이면 모션 감지를 비활성화 합니다.
리턴값
- 0: 성공
- -1: 실패
int32_t
motionDetectorRemoveROIRegion
(
const MotionDetectorRef &
motion_detector
,
int32_t
roi_id
)
OasisMotion.h
모션 감지 영역을 제거합니다. 모든 영역을 제거하게 되면 전체 모션 감지를 시작합니다.
매개변수
motion_detector
createMotionDetector로 생성한 모션 감지기를 지정합니다.
roi_id
motionDetectorAddROIRegion로 리턴받은 영역 ID입니다. -1이면 모든 영역을 제거합니다.
리턴값
- 0: 성공
- -1: 실패
예제¶
아래는 카메라 장치 ID 0 영상으로 부터 모션 감지하는 예제입니다.
#include "OasisAPI.h"
#include "OasisLog.h"
#include "OasisMedia.h"
#include "OasisFS.h"
#include "OasisUtil.h"
#include "OasisMotion.h"
#include <thread>
#include <mutex>
#include <memory>
#include <condition_variable>
#include <signal.h>
#define DLOG_THIS 0x00010000
#define DLOG_RECORD 0x00020000
#define DLOG_FRAME 0x00040000
#define DLOG_TRACE 0x00080000
#undef DLOG_FLAGS
#define DLOG_FLAGS (DLOG_FLAGS_DEFAULT|DLOG_RECORD|DLOG_TRACE|DLOG_THIS/*|DLOG_FRAME*/)
#undef DLOG_TAG
#define DLOG_TAG "Motion"
using namespace oasis;
static bool continue_running_ = true;
class MyMotionDetectObserver : public MotionDetectObserver
{
public:
MyMotionDetectObserver() {}
virtual ~MyMotionDetectObserver() {}
virtual void onMotionDetected(int32_t camera_id, int32_t detected) {
TRACE0("camera<%d> motion detected#%d\n", camera_id, detected);
}
};
void print_usage(const char *pname)
{
DLOG0(DLOG_INFO, "USAGE: %s\n", pname);
}
void cancel_handler(int signum)
{
continue_running_ = false;
}
int main(int argc, char* argv[])
{
int32_t err;
int32_t i, c, n;
std::thread t1, t2, t3;
oasis::key_value_map_t parameters;
srand(time(NULL));
signal(SIGINT, cancel_handler);
////////////////////////////////////////////////////////////////////////////////////////////
// init
parameters["offs-disable"] = "1";
//parameters["oasis-log-flags"] = std::to_string(OASIS_LOG_DEBUG/*|OASIS_LOG_ENCODE_BITRATE*/);
if(oasis::initialize(parameters) < 0) {
DLOG(DLOG_ERROR, "Oasis init failed\n");
return -1;
}
////////////////////////////////////////////////////////////////////////////////////////////
// sources
parameters.clear();
parameters["source-count"] = "1";
parameters["source1-camera-id"] = "0";
parameters["source1-isp-id"] = "0";
parameters["source1-isp-wdr-mode"] = "0";
parameters["source1-capture-format"] = "YUV420";
parameters["source1-capture-buffers"] = "5";
parameters["source1-fps"] = "30";
parameters["source1-subchannel-rotation"] = "0";
parameters["source1-loc"] = "front";
parameters["source1-capture-resolution"] = "1080p";
parameters["source1-sensor-config"] = "./Resource_tp2863/VIC/0/tp2863_1920x1080_ch0.cfg";
parameters["source1-autoscene-config"] = "./Resource_tp2863/AutoScene/autoscene_conf.cfg";
parameters["source1-resource-dir"] = "./Resource_tp2863/";
configCameras(parameters);
////////////////////////////////////////////////////////////////////////////////////////////
//motion detector settings
std::shared_ptr<MyMotionDetectObserver> motion_detect_observer = std::make_shared<MyMotionDetectObserver>();
parameters.clear();
parameters["camera-id"] = "0";
parameters["enable"] = "1";
parameters["use-g2d"] = "1";
parameters["buffer-count"] = "3";
parameters["sensitivity-level"] = "5";
parameters["fps"] = "6";
parameters["version"] = "2";
parameters["height-max"] = "135";
MotionDetectorRef motion_detector = createMotionDetector(parameters);
err = motionDetectorStart(motion_detector, motion_detect_observer);
if(err < 0) {
DLOG0(DLOG_ERROR, "MotionDetectgor start failed\n");
} else {
TRACE0("MotionDetector<%d> started\n", motionDetectorId(motion_detector));
}
printf("Ctrl+C to exit...\n");
do {
usleep(100000);
} while (continue_running_ == true);
if(motion_detector) {
destroyMotionDetector(motion_detector);
}
oasis::finalize();
printf("goodbye.\n");
return 0;
}