Metadata-Version: 2.1
Name: RoboCam
Version: 1.0.0.34
Summary: Python library for RoboCam
Home-page: https://eng.roborobo.co.kr/main
Download-URL: https://github.com/RoboroboLab/RoboCam/archive/master.tar.gz
Author: Roborobo
Author-email: roborobolab@gmail.com
License: MIT
Keywords: RoboCam,roborobo
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3
Description-Content-Type: text/markdown
Requires-Dist: opencv-contrib-python (==4.7.0.72)
Requires-Dist: tflite (==2.10.0)
Requires-Dist: tensorflow (==2.12.0)
Requires-Dist: numpy (==1.23.5)

# **RoboCam**
# **1. RoboCam Python Library 소개**
RoboCam Python Library는 Python에서 RoboCam을 사용하여 영상 스트리밍 및 영상처리 기능을 쉽게 사용할 수 있도록 도와주는 라이브러리입니다.
# **2. 설치 및 삭제**
해당 라이브러리의 경우 타 라이브러리와의 상호작용이 많아 버전에 민감하므로 가상환경을 사용하는 것을 권장합니다. (2.1 가상환경 생성 및 실행 참조) 
## **2.1. 가상환경 생성 및 실행** 
### **2.1.1 Powershell 보안 해제**
Powershell을 관리자 권한으로 열고 아래의 명령어를 입력합니다. 
```powershell
Set-ExecutionPolicy Unrestricted
```

### **2.1.2 Python 프로젝트를 실행할 폴더 접근**
Powershell, VSCode Terminal 등을 이용하여 아래의 예시와 같이 프로젝트 폴더에 접근합니다.
```powershell
cd C:\Workspace\python-sample
```
### **2.1.3 Python 프로젝트를 실행할 폴더 접근**
Powershell, VSCode Terminal 등을 이용하여 아래의 예시와 같이 프로젝트 폴더에 접근합니다.
```powershell
cd C:\Workspace\python-sample
```
### **2.1.4 가상 환경 생성**
아래의 명령어를 입력하여 python 가상 환경을 생성합니다. 
```powershell
python -m venv .venv
```
(python2.7 버전과 python3.xx 버전이 동시에 설치되어 정상 작동이 되지 않는 경우 아래의 코드를 사용합니다.) <pre><code>python3 -m -venv .venv</code></pre>
### **2.1.5 Python 가상 환경 활성화**
아래의 명령어를 입력하여 가상환경을 활성화합니다. 정상적으로 활성화된 경우 터미널 좌측에 (.venv)의 문자열이 추가됩니다. 앞으로의 실행에 있어 새 창의 터미널을 실행하는 경우 항상 해당 명령어를 사용하여 가상 환경을 활성화하여 사용합니다.
```powershell
.venv\Scripts\activate
```
### **2.1.6 가상 환경에 RoboCam 설치**
아래의 명령어를 입력하여 가상 환경에 RoboCam 패키지를 설치합니다.
```powershell
pip install robocam
```
(python2.7 버전과 python3.xx 버전이 동시에 설치되어 정상 작동이 되지 않는 경우 아래의 코드를 사용합니다.) <pre><code>pip3 install robocam</code></pre>

### **2.1.7 설치된 라이브러리 버전 확인**

 아래의 명령어를 실행하고, '**5.1 권장 패키지 버전**'을 참조하여 라이브러리 버전 정보가 일치하는 지 확인합니다. (opencv-python-contrib, numpy, tensorflow, tflite 중심으로 확인)
```powershell
pip list
```
### **2.1.8 가상 환경에서 Python 코드 실행(Powershell 명령어 입력)**
python 코드를 실행하기 전에 powershell(또는 VSCode 터미널) 앞에 (.**venv**)표기가 있는지 확인하고 기존과 동일하게 python 명령어를 사용하여 코드를 실행합니다.
```powershell
python python-test.py
```
### **2.1.8.1 가상 환경에서 Python 코드 실행(VSCode F5 눌러서 실행)**
1. ***Ctrl+Shift+P*** 를 입력합니다.
2. ***Python: Select Interpreter***를 입력하여 클릭합니다.
3. 프로젝트 폴더 안에 있는 python.exe를 선택합니다. (ex. C:\Workspace\python-sample\.venv\Script\pytho.exe)
4. ***F5***를 눌러 실행합니다.
## **2.2. 설치 (전체 환경)**
아래의 명령을 실행하시면 RoboCam이 설치됩니다.
```powershell
 pip3 install RoboCam
```
최신 버전이 설치되지 않는다면 아래의 명령을 사용하시기를 바랍니다.
```powershell
 pip3 --no-cache-dir install RoboCam
```
### **2.2.1. 필요 라이브러리**
라이브러리 설치시에는 꼭! 관리자 권한으로 설치해야 합니다.(가상환경 )

인식 정보를 전달 하기 위한 numpy라이브러리가 필요합니다. 아래의 명령을 실행하시면 numpy가 설치됩니다.
```powershell
pip3 install numpy
```
영상 처리를 위해 opencv2 라이브러리가 필요합니다. 아래의 명령을 실행하시면 opencv2가 설치됩니다.
해당 명령을 통해 opencv2의 설치 및 최신화를 할 수 있습니다.
```powershell
pip3 install opencv-contrib-python
pip3 install --upgrade opencv-contrib-python
```powershell
인공지능 처리를 위해 tensorflow 라이브러리가 필요합니다. 아래의 명령을 실행하시면 tensorflow가 설치됩니다.
해당 명령을 통해 tensorflow 의 설치 및 최신화를 할 수 있습니다.
```powershell
pip3 install tensorflow
pip3 install --upgrade tensorflow
```
인공지능 처리를 위해 tflite 라이브러리가 필요합니다. 아래의 명령을 실행하시면 tflite가 설치됩니다.
해당 명령을 통해 tflite의 설치 및 최신화를 할 수 있습니다.
```powershell
pip3 install tflite
pip3 install --upgrade tflite
```
### **2.2.2. 업그레이드**
최신 버전으로 업그레이드 하시려면 아래의 명령을 실행하시면 됩니다.
```powershell
pip3 install --upgrade RoboCam
```
### **2.2.3. 라이브러리 재설치**

이전 버전을 설치한 경우 & 가상환경 사용이 불가한 경우

```
absl-py==1.4.0
astunparse==1.6.3
cachetools==5.3.1
certifi==2023.5.7
charset-normalizer==3.1.0
flatbuffers==23.5.26
gast==0.4.0
google-auth==2.21.0
google-auth-oauthlib==1.0.0
google-pasta==0.2.0
grpcio==1.56.0
h5py==3.9.0
idna==3.4
jax==0.4.13
keras==2.12.0
libclang==16.0.0
Markdown==3.4.3
MarkupSafe==2.1.3
ml-dtypes==0.2.0
numpy==1.23.5
oauthlib==3.2.2
opencv-contrib-python==4.7.0.72
opt-einsum==3.3.0
packaging==23.1
protobuf==4.23.3
pyasn1==0.5.0
pyasn1-modules==0.3.0
requests==2.31.0
requests-oauthlib==1.3.1
RoboCam==1.0.0.31
rsa==4.9
scipy==1.11.1
six==1.16.0
tensorboard==2.12.3
tensorboard-data-server==0.7.1
tensorflow==2.12.0
tensorflow-estimator==2.12.0
tensorflow-intel==2.12.0
tensorflow-io-gcs-filesystem==0.31.0
termcolor==2.3.0
tflite==2.10.0
typing_extensions==4.7.1
urllib3==1.26.16
Werkzeug==2.3.6
wrapt==1.14.1
```

1. 위의 텍스트를 복사하여 .txt 파일로 저장합니다.
2.  pip를 이용하여 관련 라이브러리를 모두 삭제합니다.<br>
정상적인 삭제가 안되는 경우 **Powershell**을 **관리자 권한**으로 열어 해당 명령어를 입력합니다. <pre>pip uninstall -r "파일 경로" -y <br><br>(ex. pip uninstall -r "C:\Users\david\Documents\KakaoTalk Downloads\robocam_lib_version.txt" -y)</pre>

3. RoboCam Library를 재설치합니다.<br>정상적인 설치가 안되는 경우 **Powershell**을 **관리자 권한**으로 열어 해당 명령어를 입력합니다.<br><pre>pip install robocam</pre>

4. 정상적으로 설치되었는지 확인합니다. 하단의 '*5.1 권장 패키지 버전*' 에 있는 패키지 버전과 대조하여 확인합니다.<pre>pip list</pre>


### **2.2.4 삭제**
아래의 명령을 실행하시면 RoboCam이 삭제됩니다.
```powershell
 pip3 uninstall RoboCam
```
# **3 실습 예제**

## **3.1 얼굴 인식**

### 3.1.1 예시 코드

```python
from RoboCam.robocam import *
rCam = RoboCam()
rCam.CameraStreamInit()
rCam.CameraStream()
rCam.FacedetectorInit()
rCam.FacedetectorStart()
rCam.TrainFaceData()

while(True):
    print("======================================")
    print("사용할 기능을 확인해 주세요.")
    print("1) capture")
    print("2) train")
    print("3) delete")
    print("======================================")

    ins = input("입력해주세요 : ")

    if ins == 'train':
        rCam.TrainFaceData()
    elif ins == 'capture':
        name = input("저장할 이름을 입력하세요. :)")
        rCam.FaceCapture(name)
    elif ins == 'delete':
        name = input("삭제할 이름을 입력하세요. :")
        rCam.DeleteFaceData(name)
    else :
        print("잘못된 명령어입니다. 다시 입력해 주세요.")
```

## **3.2 숫자 인식**

### **3.2.1 조건**
- 숫자는 테두리가 두꺼운 정사각형 안에 있어야 합니다
- 글꼴에 대한 의존도가 높아 적절한 폰트를 사용해서 테스트해야 합니다.

### **3.2.2 예시 코드**

```python
from RoboCam.robocam import *
from time import sleep
rCam = RoboCam()
rCam.CameraStreamInit()
rCam.CameraStream()
rCam.NumberRecognizerInit()
rCam.NumberRecognizerStart()

while(True):
    k = input("Type \'q\' to exit : ")
    if k == "q":
        rCam.end()
    else:
        print("wrong input")
    sleep(0.01)
```

## **3.3 스케치 인식**

### **3.3.1 설정**

- 스케치는 테두리가 두꺼운 정사각형 안에 있어야 합니다

### **3.3.2 예시 코드**

```python
from RoboCam.robocam import *
from time import sleep
rCam = RoboCam()
rCam.CameraStreamInit()
rCam.CameraStream()
rCam.SketchDetectorInit()
rCam.SketchDetectorStart()

while(True):
    k = input("capture:1\ntrain:2\ndelete:3\nend:4\nPlz input a direction : ")
    if k == "1":
        _name = input("name?: ")
        rCam.SketchCapture(_name)
    elif k == "2":
        rCam.TrainSketchData()
    elif k == "3":
        _name = input("what do you want to delete")
        rCam.DeleteSketchData(_name)
    elif k == "4":
        rCam.end()
    else:
        print("wrong input")
    sleep(0.01)
```

## **3.4 Aruco Marker 인식**

### **3.4.1 설정**

- 다음 사이트에 접속하여 ***“Dictionary”의*** 드롭다운을 눌러 ***“Original ArUco”***로 설정합니다. <br>( [https://chev.me/arucogen/](https://chev.me/arucogen/) )

### **3.4.2 예시 코드**

```python
from RoboCam.robocam import *
from time import sleep
rCam = RoboCam()
rCam.CameraStreamInit()
rCam.CameraStream()
rCam.ArucoDetectorInit()
rCam.ArucoDetectorStart()

while(True):
    k = input("Type \'q\' to exit : ")
    if k == "q":
        rCam.end()
    else:
        print("wrong input")
    sleep(0.01)
```

## **3.5 DrawXXX Function 계열 사용**

### **3.5.1 설명**

- 캔버스에 특정 매개변수(또는 테두리)를 그릴지 여부에 사용됩니다
### **3.5.2 예시 코드**

```python
from RoboCam.robocam import *
from time import sleep
rCam = RoboCam()
rCam.CameraStreamInit()
rCam.CameraStream()
rCam.ArucoDetectorInit()
rCam.ArucoDetectorStart()

while(True):
    k = input("View it's size(y/n) : ")
    if k == "q":
        rCam.end()
    elif k == "y":
        rCam.DrawArucoSize(True)
    elif k == "n":
        rCam.DrawArucoSize(False)
    else:
        print("wrong input")
    sleep(0.01)
```

## **3.6 Robocam RobokitRS 연동**

### **3.6.1 예제**

- RoboCam으로 스케치를 인식하고 따라가는 예제입니다.
- 따라갈 스케치의 이름을 입력하고 3초 내로 스케치를 등록한 다음, 프로그램을 마치고 싶을 때 사용할 스케치를 추가로 등록합니다.
- 이후 Servo Motor의 각도가 0도가 된 이후로 사전에 입력해 둔 스케치를 카메라에 비추고, 이동시키며 카메라의 각도가 바뀌며 따라오는지 테스트합니다.
- 종료하기 위해서는 종료 스케치를 카메라 중앙에 비치도록 합니다.

### **3.6.2 조립**

- RoboCam을 정방향으로 하여 자사 Servo Motor의 축과 RoboCam의 시야가 수평하도록 결합합니다.
- Servo Motor는 RS Board의 ***D2***에 연결합니다.

### **3.6.3 코드**

```python
from RobokitRS import *
from RoboCam.robocam import *
from time import sleep

rs = RobokitRS.RobokitRS()
rCam = RoboCam()

rCam.CameraStreamInit()
rCam.CameraStream()
rCam.SketchDetectorInit()
rCam.SketchDetectorStart()

if __name__ == "__main__":
    rs.port_open("COM5")
    sketch = input("Plz type a name of sketch to follow")
    rCam.SketchCapture(sketch)
    sleep(3)
    rCam.SketchCapture("End")
    sleep(3)
    print("Capture Complete")
    rCam.TrainSketchData()
    servo_angle = 0
    servo_max = 110
    servo_min = -110
    servo_speed = 5
    moving_cw = True
    while True:
        if rCam.GetSketchExist(sketch):
            cor = rCam.GetSketchCenterPoint(sketch)
            if cor[0]>300 and servo_angle<servo_max:
                servo_angle+=servo_speed
            elif cor[0]<150 and servo_angle>servo_min:
                servo_angle-=servo_speed
        if rCam.GetSketchExist("End"):
            end_cor = rCam.GetSketchCenterPoint("End")
            if end_cor[0]<300 and end_cor[0]>150:
                rCam.CameraStreamOff()
                rs.end()
        rs.servo_write(2, servo_angle)
        sleep(0.2)
```

# 4 **라이브러리 업데이트**
## **v1.0.0.32 (Oct, 16th)**
### **오탈자 수정**
GetMousePoint() → GetMouthPoint()

# **5 부록**
## **5.1 권장 패키지 버전**

| Package Name | Version | Command | Link |
| --- | --- | --- | --- |
| absl-py | 1.4.0 |  |  |
| astunparse | 1.6.3 |  |  |
| cachetools | 5.3.1 |  |  |
| certifi | 2023.5.7 |  |  |
| charset-normalizer | 3.1.0 |  |  |
| flatbuffers | 23.5.26 |  |  |
| gast | 0.4.0 |  |  |
| google-auth | 2.21.0 |  |  |
| google-auth-oauthlib | 1.0.0 |  |  |
| google-pasta | 0.2.0 |  |  |
| grpcio | 1.56.0 |  |  |
| h5py | 3.9.0 |  |  |
| idna | 3.4 |  |  |
| jax | 0.4.13 |  |  |
| keras | 2.12.0 |  |  |
| libclang | 16.0.0 |  |  |
| Markdown | 3.4.3 |  |  |
| MarkupSafe | 2.1.3 |  |  |
| ml-dtypes | 0.2.0 |  |  |
| numpy | 1.23.5 | pip install numpy==1.23.5 | https://pypi.org/project/numpy/1.23.5/ |
| oauthlib | 3.2.2 |  |  |
| opencv-contrib-python | 4.7.0.72 | pip install opencv-contrib-python==4.7.0.72 | https://pypi.org/project/opencv-contrib-python/4.7.0.72/ |
| opt-einsum | 3.3.0 |  |  |
| packaging | 23.1 |  |  |
| protobuf | 4.23.3 |  |  |
| pyasn1 | 0.5.0 |  |  |
| pyasn1-modules | 0.3.0 |  |  |
| requests | 2.31.0 |  |  |
| requests-oauthlib | 1.3.1 |  |  |
| RoboCam | 1.0.0.32 |  |  |
| rsa | 4.9 |  |  |
| scipy | 1.11.1 |  |  |
| six | 1.16.0 |  |  |
| tensorboard | 2.12.3 |  |  |
| tensorboard-data-server | 0.7.1 |  |  |
| tensorflow | 2.12.0 | pip install tensorflow==2.12.0 | https://pypi.org/project/tensorflow/2.12.0/ |
| tensorflow-estimator | 2.12.0 |  |  |
| tensorflow-intel | 2.12.0 |  |  |
| tensorflow-io-gcs-filesystem | 0.31.0 |  |  |
| termcolor | 2.3.0 |  |  |
| tflite | 2.10.0 | pip install tflite==2.10.0 | https://pypi.org/project/tflite/2.10.0/ |
| typing_extensions | 4.7.1 |  |  |
| urllib3 | 1.26.16 |  |  |
| Werkzeug | 2.3.6 |  |  |
| wrapt | 1.14.1 |  |  |

## **5.2 시스템**
### **5.2.1 CameraEvents**
카메라 이벤트 RoboCam 모듈이 발생시킬 수 있는 이벤트 목록입니다. 얼굴 감지, 얼굴랜드마크 감지, Aruco마커 감지, 그림 감지, 숫자 감지를 지원합니다.
```python
class CameraEvents(enum.Enum):
    RECV_DETECTED_FACE_COUNT = 1
    RECV_DETECTED_FACE_NAME = 2
    RECV_DETECTED_FACE_RECT = 3
    RECV_LEFT_IRIS_POINT = 4
    RECV_LEFT_EYEBROW_POINT = 5
    RECV_RIGHT_IRIS_POINT = 5
    RECV_RIGHT_EYEBROW_POINT = 6
    RECV_NOSE_POINT = 7
    RECV_MOUSE_POINT = 8
    RECV_JAW_POINT = 9
    RECV_ARUCO_ID = 10
    RECV_ARUCO_IDS = 11
    RECV_ARUCO_CENTER_POINTS = 12
    RECV_ARUCO_RECT_POINTS = 13
    RECV_ARUCO_ANGLE = 14
    RECV_SKETCH_NAME = 15
    RECV_NUMBERS = 16
```
## **5.3 RoboCam 클래스**
### **5.3.1 RoboCam 클래스 생성자**
RoboCam 클래스의 생성자는 다음과 같습니다.
```
def __init__(self):
```
별도의 인자를 갖지 않으며, 객체를 생성할 경우, 각각의 영상인식 모듈을 초기화 하고, 대기합니다.

### **5.3.2 RoboCam 클래스의 public 함수 구성**
#### **5.3.2.1 Event 함수**
| 이름 | 설명 |
| --- | --- |
| SetEventHandler<br>(event:CameraEvents, func)	|event가 인식되었을 때 호출될 func을 등록합니다. <br><br>**▶ event**<br> 영상처리 모듈이 발생시키는 이벤트 종류입니다. CameraEvents를 참조하십시오. <br>**▶ func**<br>영상처리 모듈이 이벤트를 발생시켰을 때, 호출될 함수포인터입니다. 매개변수를 확인하여 사용해야합니다.|
|RemoveEventHandler<br>(event:CameraEvents)|등록된 event를 더 이상 발생시키지 않기 위해, 제거하는 함수입니다.<br><br>**▶ event**<br> 영상처리 모듈이 발생시키는 이벤트 종류입니다. CameraEvents를 참조하십시오.|
#### **5.3.2.2 Stream 함수**
| 이름 | 설명 |
| --- | --- |
|CameraStreamInit<br>(width:int = 512, height:int = 512)|RoboCam의 스트리밍을 준비하는 함수입니다. width x height의 해상도로 스트리밍 됩니다.<br>함수 호출 전, RoboCam과 와이파이 연결이 되어있어야합니다.<br><br> RoboCam의 기본 주소는 http://192.168.4.1:81/stream 입니다.<br><br>**▶ width**<br>RoboCam의 가로 해상도입니다. (기본값 : 512)<br>**▶ height**<br>RoboCam의 세로 해상도입니다. (기본값 : 512)|
|CameraStream()|RoboCam의 영상스트리밍을 시작하는 함수입니다.|
|CameraStreamInit|함수가 호출된 후 사용해야합니다.|
|CameraStreamOff()|RoboCam의 영상스트리밍을 종료하는 함수입니다.
|WebcamStreamInit<br>(width:int = 640, height:int = 480)|Webcam의 스트리밍을 준비하는 함수입니다. width x height의 해상도로 스트리밍 됩니다.<br>함수 호출 전, Webcam과 USB 연결이 되어있어야합니다.<br><br>**▶ width**<br>WebCam의 가로 해상도입니다. (기본값 : 640)<br>**▶ height**<br>webCam의 세로 해상도입니다. (기본값 : 480)|
|WebcamStream()|Webcam의 영상스트리밍을 시작하는 함수입니다.<br>**WebcamStreamInit** 함수가 호출된 후 사용해야합니다.|
|WebcamStreamOff()|Webcam의 영상스트리밍을 종료하는 함수입니다.|
|LeftRightFlipMode<br>(flag:bool)|RoboCam의 영상스트리밍을 flag에 따라 좌우 반전 시키는 함수입니다.<br><br>**▶ flag**<br>True : 좌우반전 ON, False : 좌우반전 OFF|
|UpDownFlipMode<br>(flag:bool)|RoboCam의 영상스트리밍을 flag에 따라 상하 반전 시키는 함수입니다.<br><br>**▶ flag**<br>True : 상하반전 ON, False : 상하반전 OFF
|MosaicMode<br>(rate:int)|RoboCam의 영상스트리밍에 모자이크를 rate 비율로 설정하는 함수입니다.<br><br>**▶ rate**<br>영상 모자이크의 비율입니다.<br>단위 : 퍼센트(%), 기본값 : 0|
|RotateMode<br>(angle:int)|RoboCam의 영상스트리밍을 angle만큼 회전시키는 함수입니다.<br><br>**▶ angle**<br>영상 회전각도 입니다.<br>단위 : 각도(˚), 기본값 : 90|
#### **5.3.2.3 Facedetector 함수**
|이름|설명|
|---|---|
|FacedetectorInit()|RoboCam의 얼굴인식 모듈을 준비하는 함수입니다.<br>얼굴감지, 구별, 랜드마크 인식을 초기화 합니다.|
|FacedetectorStart()|얼굴감지 모듈을 실행하는 함수입니다.<br>RoboCam 화면 안에 들어온 얼굴을 인식하여 외곽선에 사각형을 표시합니다.<br>눈,코,입 등 얼굴의 랜드마크의 좌표들에 작은원으로 표시합니다.<br>학습된 데이터가 있다면, 학습된 데이터와 비교하여 인식된 이름을 표시합니다.|
|FacedetectorStop()|얼굴감지 모듈을 중지하는 함수입니다.|
|GetFaceCount() -> int|화면에 인식된 얼굴의 갯수를 반환하는 함수입니다.|
|GetFaceRects() -> list|화면에 인식된 얼굴을 표시하는 외곽 사각형의 좌표들을 반환하는 함수입니다.|
|DrawFaceArea(flag:bool)|화면에 인식된 얼굴의 영역을 표시할지 정하는 함수입니다.|
|DrawFacePoint(flag:bool)|화면에 인식된 얼굴의 좌표를 표시할지 정하는 함수입니다.|
|DrawFaceSize(flag:bool)|화면에 인식된 얼굴의 크기를 표시할지 정하는 함수입니다.|
#### **5.3.2.4 FaceRecognizer 함수**
|이름|설명|
|---|---|
|FaceCapture<br>(name:str, captureCount:int=5, path:str)|감지된 얼굴을 name 이름으로 captureCount 횟수 만큼 캡쳐하여 path 위치에 저장하는 함수입니다.<br>저장된 얼굴은 얼굴구별 모듈의 학습데이터로 사용됩니다. RoboCam 화면에 얼굴이 인식되지 않았다면 저장되지 않습니다.<br><br>**▶ name**<br>얼굴이 저장될 이름입니다. 같은 이름으로 여러번 저장하면, 자동 넘버링되어 저장됩니다.<br>**▶ captureCount**<br>얼굴을 저장할 횟수입니다. 0.1초 간격으로 지정된 횟수만큼 저장합니다.<br>**▶ path**<br>얼굴이 저장될 경로입니다. 기본경로는 패키지 설치경로의 '/res/face/'입니다.<br>저장 경로를 바꾸어서 저장할 경우, 모듈 학습 시 변경된 경로로 설정해야합니다.|
|TrainFaceData<br>(facePath:str)|facepath에 저장된 얼굴 데이터를 얼굴구별 모듈에 학습시키는 함수입니다.<br>학습된 데이터를 기반으로 RoboCam에 확인된 얼굴의 이름이 표시됩니다.<br><br>**▶ facePath**<br>얼굴이 저장될 경로입니다. 기본경로는 패키지 설치경로의 '/res/face/'입니다.<br>저장 경로를 바꾸어서 저장할 경우, 모듈 학습 시 변경된 경로로 설정해야합니다.|
|DeleteFaceData<br>(name:str, facePath:str)|facepath에 저장된 name 이름을 가진 얼굴 데이터를 삭제하는 함수입니다.<br>해당 폴더에 접근하여 데이터를 삭제합니다. 데이터 삭제 이후, TrainFaceData 함수를 호출해야 얼굴구별 모듈에 적용됩니다.|
|GetFaceNames() -> list|RoboCam에 확인된 얼굴들의 이름을 list 형태로 반환하는 함수입니다.<br>현재 인식된 얼굴이 없다면 빈 리스트를 반환합니다.|
|GetFaceExist(name:str) -> bool|RoboCam에 인식된 얼굴 중, name의 이름을 가진 얼굴이 있는지 반환하는 함수입니다.<br><br>**▶ name**<br>검출할 얼굴의 이름입니다.|
|GetFaceSize(name:str) -> int|RoboCam에 인식된 얼굴 중, name의 이름을 가진 얼굴의 크기를 반환하는 함수입니다.<br><br>**▶ name**<br>사이즈를 구할 얼굴의 이름입니다.<br>입력하지 않는다면, 학습되지 않은 얼굴의 사이즈를 반환합니다.|
|GetFaceCenterPoint(name:str) -> list|RoboCam에 확인된 얼굴들 중 name의 이름을 가진 얼굴의 중심좌표를 반환하는 함수입니다.<br><br>**▶ name**<br>좌표를 구할 얼굴의 이름입니다.<br>입력하지 않는다면, 학습되지 않은 얼굴의 사이즈를 반환합니다.|
|DrawFaceName(flag:bool)|화면에 인식된 얼굴의 이름을 표시할지 정하는 함수입니다.|
#### **5.3.2.5 FaceLandmark 함수**
|이름|설명|
|---|---|
|GetLeftIrisPoint(name:str)->list|RoboCam에 확인된 얼굴의 왼쪽 눈동자의 좌표를 반환하는 함수입니다.<br><br>**▶ name**<br>검출할 얼굴의 이름입니다.|
|GetLeftEyebrowPoint(name:str)->list|RoboCam에 확인된 얼굴의 왼쪽 눈썹의 좌표를 반환하는 함수입니다.<br><br>**▶ name**<br>검출할 얼굴의 이름입니다.|
|GetRightIrisPoint(name:str)->list|RoboCam에 확인된 얼굴의 오른쪽 눈동자의 좌표를 반환하는 함수입니다.<br><br>**▶ name**<br>검출할 얼굴의 이름입니다.|
|GetRightEyebrowPoint(name:str)->list|RoboCam에 확인된 얼굴의 오른쪽 눈썹의 좌표를 반환하는 함수입니다.<br><br>**▶ name**<br>검출할 얼굴의 이름입니다.|
|GetNosePoint(name:str)->list|RoboCam에 확인된 얼굴의 코의 좌표를 반환하는 함수입니다.<br><br>**▶ name**<br>검출할 얼굴의 이름입니다.|
|GetMouthPoint(name:str)->list|RoboCam에 확인된 얼굴의 입의 좌표를 반환하는 함수입니다.<br><br>**▶ name**<br>검출할 얼굴의 이름입니다.|
|GetJawPoint(name:str)->list|RoboCam에 확인된 얼굴의 턱의 좌표를 반환하는 함수입니다.<br><br>**▶ name**<br>검출할 얼굴의 이름입니다.|
|DrawFaceLandmark(flag:bool)|화면에 인식된 얼굴의 랜드마크를 표시할지 정하는 함수입니다.
#### **5.3.2.6 ArucoDetector 함수**
|이름|설명|
|---|---|
|ArucoDetectorInit()|Aruco마커 탐색 모듈을 초기화 하는 함수입니다.Original Aruco 타겟으로 탐색합니다.|
|ArucoDetectorStart()|Aruco마커 탐색 모듈을 실행 시키는 함수입니다.|
|ArucoDetectorStop()|Acuro마커 탐색 모듈을 정지 시키는 함수입니다.||
|GetArucoId() -> int|RoboCam에 인식된 Aruco 마커의 고유 번호를 int 형태로 반환하는 함수입니다.|
|GetArucoIds()-> list|RoboCam에 인식된 Aruco 마커들의 고유 번호를 list 형태로 반환하는 함수입니다.|
|GetArucoCenterPoint(id:int) -> list|RoboCam에 인식된 Aruco 마커의 중심좌표를 [X,Y] 형태로 반환하는 함수입니다.<br><br>**▶ id**<br>검출할 Marker의 ID입니다.|
|GetArucoCount() -> int|RoboCam에 인식된 Aruco 마커의 갯수를 반환하는 함수입니다.|
|GetArucoExist(id:int) -> bool: |RoboCam에 인식된 Aruco 마커 중, id와 맞는 마커가 있는지 반환하는 함수입니다.|
|GetArucoX(id:int) -> int:|RoboCam에 인식된 Aruco 마커 중, id에 해당하는 마커의 X 좌표를 반환하는 함수입니다.|
|GetArucoY(id:int) -> int:|RoboCam에 인식된 Aruco 마커 중, id에 해당하는 마커의 Y 좌표를 반환하는 함수입니다.|
|GetArucoDistance(id:int) -> int:|RoboCam에 인식된 Aruco 마커 중, id에 해당하는 마커와의 거리를 반환하는 함수입니다.|
|GetArucoRectPoint(id:int) -> list|RoboCam에 인식된 Aruco 마커 중, id에 해당하는 마커의 네 모서리 좌표를 [ [X1,Y1], [X2,Y2], [X3,Y3], [X4,Y4] ] 형태로 반환하는 함수입니다.|
|GetArucoAngle()->float|RoboCam에 인식된 Aruco 마커의 각도를 반환하는 함수입니다.|
|DrawArucoArea(flag:bool)|인식된 Aruco 마커의 영역을 표시할지 정하는 함수입니다.|
|DrawArucoId(flag:bool)|인식된 Aruco 마커의 ID를 표시할지 정하는 함수입니다.|
|DrawArucoPoint(flag:bool)|인식된 Aruco 마커의 좌표를 표시할지 정하는 함수입니다.|
|DrawArucoDistance(flag:bool)|인식된 Aruco 마커의 거리를 표시할지 정하는 함수입니다.|
|DrawArucoSize(flag:bool)|인식된 Aruco 마커의 사이즈를 표시할지 정하는 함수입니다.
##### **5.3.2.6.1 ArucoDetector 함수의 사용법**
```python
 # RoboCam 라이브러리를 참조합니다.
 import RoboCam.robocam as robocam

 # 로보캠 객체를 생성하고, 초기화 한 후, 카메라 스트림을 시작합니다.
 rCam = robocam.RoboCam()
 rCam.CameraStreamInit()
 rCam.CameraStream()

 # ArucoDetector를 초기화 하고, 시작합니다.
 rCam.ArucoDetectorInit()
 rCam.ArucoDetectorStart()

 # 인식된 ArucoMarker의 정보를 출력합니다.
 while(True):
   print(" id  = "         , rCam.GetArucoId())
   print(" ids = "         , rCam.GetArucoIds())
   print(" centerPoint = " , rCam.GetArucoCenterPoint())
   print(" rectPoint = "   , rCam.GetArucoRectPoint())
   print(" angle = "       , rCam.GetArucoAngle())
4.2.6.2 ArucoDetector 이벤트의 사용법
    # RoboCam 라이브러리를 참조합니다.
    import RoboCam.robocam as robocam

    # ArucoMarker의 데이터를 수신할 함수를 선언 합니다.
    def ArucoId_Printer(id):
        print(" id  = " , id)

    def ArucoIds_Printer(ids):
        print(" ids = " , ids)

    def ArucoCenterPoint_Printer(point):
        print(" centerPoint = " , point)

    def ArucoRectPoint_Printer(point):
        print(" rectPoint = " ,  point)

    def ArucoAngle_Printer(angle):
        print(" angle = " , angle)

    # 로보캠 객체를 생성하고, 초기화 한 후, 카메라 스트림을 시작합니다.
    rCam = robocam.RoboCam()
    rCam.CameraStreamInit()
    rCam.CameraStream()

    # ArucoDetector를 초기화 하고, 시작합니다.
    rCam.ArucoDetectorInit()
    rCam.ArucoDetectorStart()

    # 선언해놓은 데이터 수신 함수를, 각 이벤트에 맞게 로보캠 객체에 등록합니다.
    rCam.SetEventHandler(robocam.CameraEvents.RECV_ARUCO_ID, ArucoAngle_Printer)
    rCam.SetEventHandler(robocam.CameraEvents.RECV_ARUCO_IDS, ArucoIds_Printer)
    rCam.SetEventHandler(robocam.CameraEvents.RECV_ARUCO_CENTER_POINTS, ArucoCenterPoint_Printer)
    rCam.SetEventHandler(robocam.CameraEvents.RECV_ARUCO_RECT_POINTS, ArucoRectPoint_Printer)
    rCam.SetEventHandler(robocam.CameraEvents.RECV_ARUCO_ANGLE, ArucoAngle_Printer)
```
#### **5.3.2.7 SketchDetector 함수**
|이름|설명|
|---|---|
|SketchDetectorInit()|RoboCam의 그림구별 모듈을 준비하는 함수입니다.<br>검은 외곽 사각형 내부에 그려진 그림을 학습하고 구별합니다.|
|SketchDetectorStart()|그림구별 모듈을 시작하는 함수입니다.<br>RoboCam에 인식된 그림 외곽에 사각형으로 표시됩니다.|
|SketchDetectorStop()|그림구별 모듈을 정지하는 함수입니다.|
|SketchCapture<br>(name:str,captureCount:int=5,path:str)|RoboCam에 인식된 그림을 name 이름으로 캡쳐하여 path에 저장하는 함수입니다.<br>저장된 얼굴은 얼굴구별 모듈의 학습데이터로 사용됩니다. RoboCam 화면에 얼굴이 인식되지 않았다면 저장되지 않습니다.<br><br>**▶ name**<br>그림이 저장될 이름입니다. 같은 이름으로 여러번 저장하면, 자동 넘버링되어 저장됩니다.<br>**▶ captureCount**<br>그림이 저장될 횟수입니다. 입력하지 않는다면 다섯장의 그림을 저장합니다.<br>**▶ path**<br>그림이 저장될 경로입니다. 기본경로는 패키지 설치경로의 '/res/sketch/'입니다.<br>저장 경로를 바꾸어서 저장할 경우, 모듈 학습 시 변경된 경로로 설정해야합니다.|
|TrainSketchData<br>(sketchPath:str)|sketchPath에 저장된 얼굴 데이터를 얼굴구별 모듈에 학습시키는 함수입니다.<br>학습된 데이터를 기반으로 RoboCam에 확인된 얼굴의 이름이 표시됩니다.<br><br>**▶ sketchPath**<br>얼굴이 저장될 경로입니다. 기본경로는 패키지 설치경로의 '/res/sketch/'입니다.<br>저장 경로를 바꾸어서 저장할 경우, 모듈 학습 시 변경된 경로로 설정해야합니다.|
|DeleteSketchData<br>(name:str, sketchPath:str)|sketchPath에 저장된 name 이름을 가진 그림 데이터를 삭제하는 함수입니다.<br>해당 폴더에 접근하여 데이터를 삭제합니다. 데이터 삭제 이후, TrainFaceData 함수를 호출해야 얼굴구별 모듈에 적용됩니다.|
|GetSketchNames()->list|RoboCam에 인식된 그림들의 이름을 list형태로 반환하는 함수입니다.|
|GetSketchExist(name:str)->bool	|RoboCam에 인식된 그림 중, name에 해당하는 그림이 있는지 반환하는 함수입니다.|
|GetSketchCenterPoint(name:str)->list	|RoboCam에 인식된 그림 중, name에 해당하는 그림의 좌표를 list형태로 반환하는 함수입니다.|
|GetSketchSize(name:str)->int	|RoboCam에 인식된 그림 중, name에 해당하는 그림의 크기를 반환하는 함수입니다.|
|DrawSketchArea(flag:bool)	|인식된 그림의 영역을 표시할지 정하는 함수입니다.|
|DrawSketchName(flag:bool)	|인식된 그림의 이름을 표시할지 정하는 함수입니다.|
|DrawSketchSize(flag:bool)	|인식된 그림의 크기를 표시할지 정하는 함수입니다.|
|DrawSketchPoint(flag:bool)	|인식된 그림의 좌표를 표시할지 정하는 함수입니다.|
#### **5.3.2.8 NumberRecognizer 함수**
|이름|설명|
|---|---|
|NumberRecognizerInit()|RoboCam의 숫자구별 모듈을 준비하는 함수입니다.<br>검은 외곽 사각형 내부에 그려진 숫자를 구별합니다.|
|NumberRecognizerStart()|숫자구별 모듈을 시작하는 함수입니다.<br>RoboCam에 인식된 숫자 외곽에 사각형으로 표시됩니다.|
|NumberRecognizerStop()|숫자구별 모듈을 정지하는 함수입니다.|
|GetRecognizedNumbers()->str|RoboCam에 인식된 숫자를 문자열의 형태로 반환하는 함수입니다.|
|GetRecognizedNumberPoint()->list|RoboCam에 인식된 숫자의 좌표를 list형태로 반환하는 함수입니다.|
|GetRecognizedNumberSize()->int|RoboCam에 인식된 숫자의 크기를 반환하는 함수입니다.|
|DrawNumberArea(flag:bool)|인식된 숫자의 영역을 표시할지 정하는 함수입니다.|
|DrawNumber(flag:bool)|인식된 숫자를 표시할지 정하는 함수입니다.|
|DrawNumberPoint(flag:bool)|인식된 숫자의 좌표를 표시할지 정하는 함수입니다.|
|DrawNumberSize(flag:bool)|인식된 숫자의 크기를 표시할지 정하는 함수입니다.|
