Hikvision Python OpenCV - PullRequest
       33

Hikvision Python OpenCV

0 голосов
/ 28 февраля 2019
import numpy as np
import cv2
from hikvisionapi import Client


cap = cv2.VideoCapture()
#cap.open("rtsp://admin:DocoutBolivia@192.168.1.64:554/h264/ch0/sub")
cap.open("rtsp://admin:DocoutBolivia@192.168.1.64:554/Streaming/Channels/102/")
#cam = Client('http://192.168.1.64', 'admin', 'DocoutBolivia')

#rtsp://admin:password@192.168.1.64/h264/ch1/sub/

#response = cam.System.deviceInfo(method='get')
ret, frame = cap.read()
cv2.imwrite("holo.jpg", frame)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here

    # Display the resulting frame
    cv2.imshow('frame',frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

У меня есть этот код, и он хорошо подключается и показывает, но он очень медленный, есть ли другой способ сделать это?и немного меньше задержки?Я хочу сделать распознавание лица с моей IP-камерой HikVision

1 Ответ

0 голосов
/ 27 мая 2019

Попытка загрузить пар напрямую с помощью Python ни к чему вас не приведет.

Единственный способ получить чрезвычайно низкую рентабельность - это использовать файлы .dll или .so из SDK.предоставляемый HikVision и использующий ctypes для вызова внутренних функций.

Ниже приведен простой пример, который я сделал ранее для доступа к NET_DVR_PTZControl_Other.Это большая работа, если вы хотите разработать собственное приложение с их SDK.Я бы посоветовал вам запросить пример приложения Python у вашего поставщика.

Например,

import os, ctypes
import cv2

def add_dll(path, dll_list):
    files = os.listdir(path)
    for file in files:
        if not os.path.isdir(path + file):
            if file.endswith(".dll"):
                dll_list.append(path + file)
        else:
            add_dll(path + file + "/", dll_list)


def callCpp(func_name, *args):
    for so_lib in so_list:
        try:
            lib = ctypes.cdll.LoadLibrary(so_lib)
            try:
                value = eval("lib.%s" % func_name)(*args)
                print("Success:" + str(value))
                return value
            except:
                continue
        except:
            print("Fail:" + so_lib)
            continue
    return False

def NET_DVR_PTZControl_Other(lUserID, lChannel, dwPTZCommand, dwStop):
    res = callCpp("NET_DVR_PTZControl_Other", lUserID, lChannel, dwPTZCommand, dwStop)
    if res:
        print("Control Success")
    else:
        print("Control Fail: " + str(callCpp("NET_DVR_GetLastError")))

Получить пример Steam

class NET_DVR_JPEGPARA(ctypes.Structure):
    _fields_ = [
        ("wPicSize", ctypes.c_ushort), # WORD
        ("wPicQuality", ctypes.c_ushort)] # WORD

def NET_DVR_CaptureJPEGPicture():
    sJpegPicFileName = bytes("pytest.jpg", "ascii")
    lpJpegPara = NET_DVR_JPEGPARA()
    lpJpegPara.wPicSize = 2
    lpJpegPara.wPicQuality = 1
    res = callCpp("NET_DVR_CaptureJPEGPicture", lUserID, lChannel, ctypes.byref(lpJpegPara), sJpegPicFileName)
    if res == False:
        error_info = callCpp("NET_DVR_GetLastError")
        print("Success:" + str(error_info))
    else:
        print("Grab stream fail")
...