web-dev-qa-db-fra.com

Accéder à la caméra IP avec OpenCV

Impossible d'accéder au flux vidéo. Quelqu'un peut-il m'aider à obtenir le flux vidéo? J'ai cherché dans google pour la solution et poster une autre question en débordement de pile mais malheureusement rien ne peut résoudre le problème 

import cv2
cap = cv2.VideoCapture()
cap.open('http://192.168.4.133:80/videostream.cgi?user=admin&pwd=admin')
while(cap.isOpened()):
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
6
Taimur Islam

Je vous remercie. Peut-être, maintenant urlopen n'est pas sous urllib3. C'est sous urllib.request.urlopen.J'utilise ce code:

import cv2
from urllib.request import urlopen
import numpy as np

stream = urlopen('http://192.168.4.133:80/video_feed')
bytes = ''
while True:
    bytes += stream.read(1024)
    a = bytes.find(b'\xff\xd8')
    b = bytes.find(b'\xff\xd9')
    if a != -1 and b != -1:
        jpg = bytes[a:b+2]
        bytes = bytes[b+2:]
        img = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
        cv2.imshow('Video', img)
        if cv2.waitKey(1) == 27:
            exit(0)
2
Taimur Islam

Vous pouvez utiliser ce code pour obtenir des flux vidéo en direct dans le navigateur. 

pour accéder à une caméra autre que la webcam de votre ordinateur portable, vous pouvez utiliser le lien RTSP comme ceci 

rtsp: // admin: [email protected]: 554/h264/ch1/main/av_stream "

   username:admin
   password:12345
   your camera ip address and port
   ch1 is first camera on that DVR

remplacez cv2.VideoCamera (0) par ce lien, comme celui-ci, pour votre appareil photo et ça va marcher

camera.py

import cv2

class VideoCamera(object):
    def __init__(self):
        # Using OpenCV to capture from device 0. If you have trouble capturing
        # from a webcam, comment the line below out and use a video file
        # instead.
        self.video = cv2.VideoCapture(0)
        # If you decide to use video.mp4, you must have this file in the folder
        # as the main.py.
        # self.video = cv2.VideoCapture('video.mp4')

    def __del__(self):
        self.video.release()

    def get_frame(self):
        success, image = self.video.read()
        # We are using Motion JPEG, but OpenCV defaults to capture raw images,
        # so we must encode it into JPEG in order to correctly display the
        # video stream.
        ret, jpeg = cv2.imencode('.jpg', image)
        return jpeg.tobytes()

main.py

from flask import Flask, render_template, Response
from camera import VideoCamera

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

def gen(camera):
    while True:
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(gen(VideoCamera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

if __== '__main__':
    app.run(Host='0.0.0.0', debug=True)

alors vous pouvez suivre ce blog pour augmenter votre FPS de flux vidéo

2
Kushal Parikh

Vous pouvez utiliser urllib pour lire des images à partir d'un flux vidéo.

import cv2
import urllib
import numpy as np

stream = urllib.urlopen('http://192.168.100.128:5000/video_feed')
bytes = ''
while True:
    bytes += stream.read(1024)
    a = bytes.find(b'\xff\xd8')
    b = bytes.find(b'\xff\xd9')
    if a != -1 and b != -1:
        jpg = bytes[a:b+2]
        bytes = bytes[b+2:]
        img = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
        cv2.imshow('Video', img)
        if cv2.waitKey(1) == 27:
            exit(0)

Consultez cette option si vous souhaitez diffuser de la vidéo à partir de la webcam de votre ordinateur. https://github.com/shehzi-khan/video-streaming

2
Muhammad Abdullah

Vous pouvez utiliser RTSP au lieu d'un flux vidéo direct.

Chaque caméra IP dispose de RTSP pour diffuser de la vidéo en direct.

Vous pouvez donc utiliser RTSP Link au lieu de videofeed

1
Dhaval

Utilisez le code ci-dessous pour accéder directement à ipcam via opencv. Remplacez l'URL dans VideoCapture par l'URL de votre caméra. Celui donné en général fonctionne pour la plupart des appareils photo que j'ai utilisés.

import cv2

cap = cv2.VideoCapture("rtsp://[username]:[pass]@[ip address]/media/video1")

while True:
    ret, image = cap.read()
    cv2.imshow("Test", image)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()
1
Bhavin Patel