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.
* [참고] 호환 모델
- 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
위에서 앱은 설치후 재부팅을 요구합니다 :)
재부팅 후 앱은 자동실행 됩니다. 앱실행 후 고프로 연결했을때 윈도우에서 자동으로 고프로를 인식합니다.
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