Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How connect my GoPro Hero 4 camera live stream to openCV using Python?

I 'm having troubles trying to capture a live stream from my new GoPro Hero 4 camera and do some image processing on it using openCV.

Here is my trial (nothing shows up on the created window

import cv2
import argparse
import time
import datetime
from goprohero import GoProHero


ap = argparse.ArgumentParser()
ap.add_argument("-a", "--min-area", type=int, default=500, help="minimum    area size")
args = vars(ap.parse_args())

camera = cv2.VideoCapture("http://10.5.5.9:8080/gp/gpControl/executep1=gpStream&c1=restart")
time.sleep(5)

cv2.namedWindow("", cv2.CV_WINDOW_AUTOSIZE)

firstFrame = None
noOfCars = 0
speed = 80

while True: 
    (grabbed, frame) = camera.read()
    text = "Smooth"
    print("Capturing ...")

    if not grabbed:
        print("nothing grabbed")
        break

the loop breaks as grabbed always equals false which means openCV got nothing.

like image 586
Ahmed Samy Avatar asked Mar 20 '16 09:03

Ahmed Samy


1 Answers

For those wondering I was able to get a good stream on OpenCV:

First you'll need to download the GoPro Python API, if you have pip:

pip install goprocam

if not

git clone https://github.com/konradit/gopro-py-api
cd gopro-py-api
python setup.py install

Then run the following code in a python terminal window:

from goprocam import GoProCamera
from goprocam import constants
gopro = GoProCamera.GoPro()
gopro.stream("udp://127.0.0.1:10000")

This will re-stream the UDP stream to localhost, FFmpeg is needed on the path!

Then you can use OpenCV to open the localhost stream:

import cv2
import numpy as np
from goprocam import GoProCamera
from goprocam import constants
cascPath="/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)
gpCam = GoProCamera.GoPro()
cap = cv2.VideoCapture("udp://127.0.0.1:10000")
while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.CASCADE_SCALE_IMAGE
    )
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
    cv2.imshow("GoPro OpenCV", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

See further examples here - you can even use pure OpenCV to open the stream although I don't recommend it because its very laggy this way, ffmpeg > localhost > opencv is very stable compared to opencv only.

like image 192
konraditurbe Avatar answered Nov 15 '22 10:11

konraditurbe