2017-06-15 5 views
3

J'ai la prochaine caméra IP Hikvision http://www.hikvision.com/es/Products_accessries_161_i11969.html Je l'ai configuré dans mon réseau local et j'ai une connexion avec le navigateur et je peux voir la caméra fonctionne parfaitement. J'ai cherché dans différents post pour obtenir un cadre dans des appareils photo comme celui-ci, mais je ne peux pas le faire. Ici, j'ai mis le code que j'ai utilisé pour l'essayer et la réponse. Je veux obtenir un cadre et l'enregistrer dans mon destock à traiter après.Obtenir le cadre de caméra IP Hikvision en python

import cv2 
import requests 
import numpy as np 
import urllib 
import hikvision.api 
import requests 
import shutil 

#Donwload from: https://github.com/fbradyirl/hikvision/archive/master.zip 

hik_camera = hikvision.api.CreateDevice('192.168.1.64', username='admin', password=contrasenia) 
""" 
INFO:hikvision.api:Initialising new hikvision camera client 
INFO:hikvision.api:motion_url: http://192.168.1.64/MotionDetection/1 
INFO:hikvision.api:ElementTree.register_namespace: http://www.hikvision.com/ver10/XMLSchema 
INFO:hikvision.api:Going to probe device to test connection 
INFO:hikvision.api:url: http://192.168.1.64/System/deviceInfo 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): 192.168.1.64 
DEBUG:requests.packages.urllib3.connectionpool:"GET /System/deviceInfo HTTP/1.1" 200 696 
DEBUG:hikvision.api:response: <Response [200]> 
DEBUG:hikvision.api:status_code 200 
DEBUG:hikvision.api:element_to_query: .//{http://www.hikvision.com/ver10/XMLSchema}firmwareVersion result: <Element '{http://www.hikvision.com/ver10/XMLSchema}firmwareVersion' at 0x7fb090b76cc8> 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): 192.168.1.64 
DEBUG:requests.packages.urllib3.connectionpool:"GET /MotionDetection/1 HTTP/1.1" 200 407 
DEBUG:hikvision.api:Response: <?xml version="1.0" encoding="UTF-8"?> 
<MotionDetection version="1.0" xmlns="http://www.hikvision.com/ver10/XMLSchema"> 
<id>1</id> 
<enabled>false</enabled> 
<regionType>grid</regionType> 
<Grid> 
<rowGranularity>18</rowGranularity> 
<columnGranularity>22</columnGranularity> 
</Grid> 
<MotionDetectionRegionList> 
<sensitivityLevel>0</sensitivityLevel> 
</MotionDetectionRegionList> 
</MotionDetection> 

INFO:hikvision.api:Current motion detection state? enabled: false 
WARNING:hikvision.api:sensitivityLevel is 0. 
INFO:hikvision.api:sensitivityLevel now set to 1 
INFO:hikvision.api:Connected OK! 
INFO:hikvision.api:Camera firmaward version: V5.4.3 
INFO:hikvision.api:Motion Detection enabled: False 
""" 

#The method: 
""" 
hik_camera.__class__(     hik_camera.__setattr__(
hik_camera.__delattr__(     hik_camera.__sizeof__(
hik_camera.__dict__      hik_camera.__str__(
hik_camera.__dir__(      hik_camera.__subclasshook__(
hik_camera.__doc__      hik_camera.__weakref__ 
hik_camera.__eq__(      hik_camera._base 
hik_camera.__format__(     hik_camera._host 
hik_camera.__ge__(      hik_camera._password 
hik_camera.__getattribute__(   hik_camera._sensitivity_level 
hik_camera.__gt__(      hik_camera._username 
hik_camera.__hash__(     hik_camera._xml_namespace 
hik_camera.__init__(     hik_camera.disable_motion_detection(
hik_camera.__le__(      hik_camera.enable_motion_detection(
hik_camera.__lt__(      hik_camera.get_about(
hik_camera.__module__     hik_camera.get_version(
hik_camera.__ne__(      hik_camera.is_motion_detection_enabled(
hik_camera.__new__(      hik_camera.motion_url 
hik_camera.__reduce__(     hik_camera.put_motion_detection_xml(
hik_camera.__reduce_ex__(    hik_camera.xml_motion_detection_off 
hik_camera.__repr__(     hik_camera.xml_motion_detection_on 
""" 
hik_camera 
#<hikvision.api.CreateDevice object at 0x7fb09183ab38> 

Avec ce code, je ne peux pas obtenir de trame.

Autres options:

camera = requests.get('http://192.168.1.64', auth=('admin', contrasenia), stream=True) 
#INFO:requests.packages.urllib3.connectionpool:Starting new HTTP connection (1): 192.168.1.64 
#DEBUG:requests.packages.urllib3.connectionpool:"GET/HTTP/1.1" 200 480 
chunk = camera.iter_content(chunk_size=1024) 
chunk 
#<generator object iter_slices at 0x7fb090b7a150> 
bytes += bytes() 
#Traceback (most recent call last): 
# File "<stdin>", line 1, in <module> 
#TypeError: unsupported operand type(s) for +=: 'type' and 'bytes' 

Autres:

stream = urllib.request.urlopen("http://192.168.1.64") 
#<http.client.HTTPResponse object at 0x7fb090b82320> 

Autres:

out_cv2 = cv2.VideoCapture('http://192.168.1.64') 
#<VideoCapture 0x7fb090b6dc10> 
cv2.imshow(out_cv2) 
#Traceback (most recent call last): 
# File "<stdin>", line 1, in <module> 
#TypeError: Required argument 'mat' (pos 2) not found 
ret, frame = out_cv2.read() 
cv2.imshow('out', frame) 
#OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /io/opencv/modules/highgui/src/window.cpp, line 304 
#Traceback (most recent call last): 
# File "<stdin>", line 1, in <module> 
#cv2.error: /io/opencv/modules/highgui/src/window.cpp:304: error: (-215) size.width>0 && size.height>0 in function imshow 
ret 
#False 
frame 
# 

Autres:

from requests.auth import HTTPBasicAuth 
requ = requests.get('http://192.168.1.64', auth=HTTPBasicAuth('admin', contrasenia), stream=True) 
out_file = open('img.png', 'wb') 
shutil.copyfileobj(requ.raw, out_file) 
#The file is empty 

Ce code provient d'un autre post avec un problème similaire mais je ne peux pas l'utiliser pour obtenir mon objet. Que puis-je faire?

+0

Je peux télécharger une image avec la commande: « wget -r -P ./ -A jpg, jpeg, * http: // admin: [email protected]/Streaming/channels/1/picture ' " Mais j'ai besoin d'obtenir cette image en python, en temps réel, et je ne peux pas me connecter à l'URL que j'ai indiqué. Comment pourrais-je le faire? J'ai essayé avec les bibliothèques urllib mais l'erreur est que ce n'est pas un port non-numérique, en plus, urllib3 n'a pas été possible non plus. Des idées? –

+0

Avez-vous trouvé une solution? J'ai le même problème. – Leopoldo

Répondre

0

J'ai eu un problème sur mon PC, opencv avait un problème avec la version. Maintenant, j'ai eu opencv 3.2 et je peux faire la ligne suivante:

cv2.VideoCapture("rstp://admin:[email protected]/doc/page/previw.asp") 

et je peux prendre des cadres.