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()

我有这样的代码,它的连接和显示很好,但它真的很慢,有其他的方法可以做到这一点吗? 而且延迟更少?我想用我的HikVision IP摄像机进行人脸识别

4 个评论
你可以加速的一个方法是进入相机设置,降低分辨率,例如,尝试640x480甚至更小的分辨率,但你会失去一些图像的质量。
你有什么硬件?CPU、GPU - 请写出规格
我有一台MacBook Pro,配备i5第六代,英特尔Iris Graphics 550 1536 MB。如果我使用海康威视的软件来查看摄像头,就不会有延迟。
标准答案:cap.open(address, cv2.CAP_PROP_FFMPEG) 或cap.open(address, cv2.CAP_PROP_GSTREAMER)。它需要使用带有硬件加速的视频解码后端
python
opencv
video-streaming
hikvision
Reddy Tintaya
Reddy Tintaya
发布于 2019-03-01
1 个回答
Rex Low
Rex Low
发布于 2019-05-27
0 人赞同

试图直接用 Python 来加载蒸汽是没有用的。

获得极低延迟的唯一方法是利用HikVision提供的SDK中的 .dll .so 文件,并使用 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")))

获取蒸汽示例

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: