[Python] 고프로(Gopro) 연결하기 (+웹캠(스트리밍))

2023. 7. 25. 11:49·개발/Python
728x90

저는 고프로 HERO9 Black을 사용하고있으며, 고프로 스트림을 연결하여 사용하려고합니다.


OS별로 고프로 연결방식이 다릅니다.

 

Python 고프로 라이브러리

* 사용 모듈 : goprocam

 

pip install goprocam

 

* [참고] Git : GitHub - KonradIT/gopro-py-api: Unofficial GoPro API Library for Python - connect to GoPro via WiFi.

 

GitHub - KonradIT/gopro-py-api: Unofficial GoPro API Library for Python - connect to GoPro via WiFi.

Unofficial GoPro API Library for Python - connect to GoPro via WiFi. - GitHub - KonradIT/gopro-py-api: Unofficial GoPro API Library for Python - connect to GoPro via WiFi.

github.com

 

* [참고] 호환 모델 

- HERO3
- HERO3+
- HERO4 (including HERO Session)
- HERO+
- HERO5 (including HERO5 Session)
- HERO6
- Fusion 1
- HERO7 (Black)
- HERO8 Black
- MAX
- HERO9 Black
- HERO10 Black

1. 윈도우(Window)에서 고프로 연결

윈도우에서 고프로를 연결하기 위해서는 고프로 앱을 별도로 설치해야합니다.

How To Use Your GoPro As A Webcam

 

How To Use Your GoPro As A Webcam

 

community.gopro.com

 

(윈도우) 고프로 데스크탑 앱 설치

 

위에서 앱은 설치후 재부팅을 요구합니다 :)

 

재부팅 후 앱은 자동실행 됩니다. 앱실행 후 고프로 연결했을때 윈도우에서 자동으로 고프로를 인식합니다.

 

1.1 윈도우 고프로 연결 및 스트리밍

고프로와 연결되면, 스트리밍환경을 구축가능합니다.

 

## pip install list
pip install goprocam
pip install opencv-python
pip install ifaddr

 

#-*- coding: utf-8 -*-
import sys
import cv2
import re
import ifaddr
from goprocam import GoProCamera, constants

def win_gopro_ipaddress():
    """(윈도우) 연결된 고프로 IP찾는 함수
    윈도우에 연결된 네트워크 어댑터의 IP들을 전부 가져와 gopro의 IP를 찾습니다.
    goproIP를 찾아 끝자리를 51변경해줍니다.
    (정확한 이유는 모르겠지만, 
    고프로 모듈의 'getWebcamIP'함수에서 51로 변환해주는걸 참고했습니다. )

    Returns:
        str: 연결된 고프로 IP
    """
    adapters = ifaddr.get_adapters()
    rtn_ip = None
    for adapter in adapters:
        if 'gopro' in adapter.nice_name.lower():
            for ip in adapter.ips:
                i = str(ip.ip)
                if re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", i):
                    rtn_ip = i
                    break
            break
    if rtn_ip:
        address = rtn_ip.split('.')
        address[len(address) - 1] = "51"# end change 51
        rtn_ip = '.'.join(address)
    return rtn_ip

if __name__ == "__main__":
    ip_addr = win_gopro_ipaddress()
    if not ip_addr:
        print("\33[31m" + "CANNOT FIND CAMERA IP ADDRESS" + "\33[0m")
        sys.exit(0)
    udp_stream = "udp://{}:8554".format(ip_addr)
    
    gpCam = GoProCamera.GoPro(ip_address=ip_addr) #연결된 고프로 객체
    gpCam.webcamFOV(constants.Webcam.FOV.Wide) 
    gpCam.startWebcam()#고프로 웹캠 모드 시작
    'gpCam객체로 현재 연결된 고프로 상태를 알 수 있습니다.'

    cap = cv2.VideoCapture(udp_stream, cv2.CAP_FFMPEG)
    while cap.isOpened():
        info = ""
        nmat, frame = cap.read()
        if not nmat:
            print("out..")
            break
        show_frame = cv2.resize(frame, (1280, 720), cv2.INTER_AREA)
        cv2.imshow("Frame", show_frame)
        key = cv2.waitKey(1) & 0xFF
        if key == ord("q"):
            break

    print("exit....")
    cap.release()
    cv2.destroyAllWindows()

1.2  연결된 고프로 정보

고프로 객체로 고프로 정보를 확인할 수 있습니다.

 

    gpCam = GoProCamera.GoPro(ip_address=ip_addr) #연결된 고프로 객체
    gpCam.webcamFOV(constants.Webcam.FOV.Wide) 
    gpCam.startWebcam()#고프로 웹캠 모드 시작

    print("Clients connected: " + "" + str(gpCam.getStatus(
                    constants.Status.Status, constants.Status.STATUS.IsConnected))) ## 고프로 연결상태(연결안되면 None)
    print(f"battery left: -> {gpCam.getStatus(constants.Status.Status, constants.Status.STATUS.BatteryLevel)}") ##고프로 배터리(int)
    print("==============================================")
    print(gpCam.overview()) ##더많은 고프로 정보확인

 

 

 

2. 리눅스 에서 고프로 연결

 

윈도우와 다르게, 리눅스에서는 고프로의 디바이스 명을 먼저 찾고 고프로에서 IP를 획득하는 과정이 들어갑니다.

## pip install list
pip install goprocam
pip install opencv-python
pip install netifaces

 

#-*- coding: utf-8 -*-
import sys
import cv2
import netifaces
from goprocam import GoProCamera, constants

def linux_gopro_macaddress():
    """(리눅스) 연결된 고프로 장치를 구하는 함수.
        환경에 따로(포트명)달라질수있음

    Returns:
        str: 연결된 고프로 디비이스 명
    """
    name = ''
    for device in netifaces.interfaces():
        if device.startswith('usb'):
            try:
                address = netifaces.ifaddresses(device)[netifaces.AF_INET][0]["addr"].split(".")
                address[len(address) - 1] = "51"
                name = device
                break
            except :
                continue
    return name

if __name__ == "__main__":
    device_name = linux_gopro_macaddress() ## (1)

    if not device_name:
        print("\33[31m" + "CANNOT FIND CAMERA IP ADDRESS" + "\33[0m")
        sys.exit(0)

    ip_addr = GoProCamera.GoPro.getWebcamIP(device_name) ## 연결된 고프로 디바이스명으로 IP획득(2)

    udp_stream = "udp://{}:8554?overrun_nonfatal=1&fifo_size=50000000".format(ip_addr)

    ## (리눅스) 연결된 고프로 IP / 고프로 디바이스명으로 고프로 객체 획득
    gpCam = GoProCamera.GoPro(ip_address=ip_addr, camera=constants.gpcontrol, webcam_device=device_name)
    gpCam.webcamFOV(constants.Webcam.FOV.Wide)
    gpCam.startWebcam()

    cap = cv2.VideoCapture(udp_stream, cv2.CAP_FFMPEG)
    while cap.isOpened():
        info = ""
        nmat, frame = cap.read()
        if not nmat:
            print("out..")
            break
        show_frame = cv2.resize(frame, (1280, 720), cv2.INTER_AREA)
        cv2.imshow("Frame", show_frame)
        key = cv2.waitKey(1) & 0xFF
        if key == ord("q"):
            break

    print("exit....")
    cap.release()
    cv2.destroyAllWindows()

 

 

고프로의 정보는 윈도우로 동일하게 함수를 사용하여 조회하면 됩니다.

 


Python 고프로 모듈이 다양하게 있습니다. 제가 사용하는 모듈이 방법은 아닙니다. 

해당 Git주소에 가시면 많은 예제들이 있습니다. 확인해보시고 용도에 맞게 사용하시면 됩니다.

 

저는 단순 스트리밍만 필요하여, 스트리밍 예제만 다뤘습니다.

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'개발 > Python' 카테고리의 다른 글

[python/오류] ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject  (0) 2024.06.21
[Django] 프로젝트,app 생성 (1)  (0) 2024.03.20
[python/linux] 파이썬 nohup 사용법(백그라운드,데몬실행)  (0) 2022.12.09
[오라클/파이썬] DPI-1047오류 해결방법(oracledb)  (0) 2022.10.12
[Python] pip install 오류('cp949' codec can't decode byte 0xe2 in position 1091: illegal multibyte sequence)  (0) 2022.04.04
'개발/Python' 카테고리의 다른 글
  • [python/오류] ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject
  • [Django] 프로젝트,app 생성 (1)
  • [python/linux] 파이썬 nohup 사용법(백그라운드,데몬실행)
  • [오라클/파이썬] DPI-1047오류 해결방법(oracledb)
호이호이209
호이호이209
이것저것 기록하는 메모장
    250x250
  • 호이호이209
    R=VD
    호이호이209
    • R=VD전체글 (83)
      • 개발 (63)
        • Linux (19)
        • 머신러닝 (10)
        • Git (6)
        • Python (9)
        • 프로그래밍 언어 (2)
        • Docker (5)
        • ETC (12)
      • 일상기록 (20)
        • 여행 (5)
        • 일상-이모저모 (8)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
호이호이209
[Python] 고프로(Gopro) 연결하기 (+웹캠(스트리밍))
상단으로

티스토리툴바