yolov5算法在边缘计算设备上调用海康威视摄像头进行实时检测!

一、参考资料

http://t.csdnimg.cn/npQY2

yolo调用海康威视网络摄像头踩坑记_yolov5连接海康摄像头-CSDN博客

python调用海康威视的摄像头,实时显示监控内容 - 御世制人 - 博客园 (cnblogs.com)

DOC000065841-UD20825B_海康威视网络摄像机(G3渠道)操作手册_V5.5.150.PDF (hikvision.com)

 海康威视IPC摄像头rtsp接入 - Dapenson - 博客园 (cnblogs.com)

二、配置说明

1、边缘计算设备

边缘设备型号:jetson xavier nx developer kit

连接显示器,键盘,鼠标,电源即可使用,通过网线接口与摄像头连接。

2、YOLOv5算法

ultralytics/yolov5 at v6.1 (github.com)

 yolo算法在边缘设备上的运行,先装conda,再配环境,不再赘叙。

3、海康威视摄像头

产品型号:iDS-2DY9440lX-A/SP T5

连接电源即可使用,通过网线与边缘设备连接。

三、边缘计算盒连接摄像头

1、激活摄像头 

 说明:我先在windows系统本机进行操作,再迁移到边缘设备进行操作!

官方客服给的回答如下:摄像机怎么激活?

 (1)我选择方法2,下载软件后(windows本机操作),通过网线连接摄像头,就可以在软件中检索到设备,然后进行网络参数的修改,查看摄像头IP地址,可以修改成自己想要的,比如192.168.1.xx

(2)接下来很重要的一步,我参考这篇文章:http://t.csdnimg.cn/npQY2,打开控制面板,通过网线连接电脑和摄像头后,可以找到“以太网”,就是我们跟摄像头连接的网线,记住不是“WLAN”,然后设置以太网属性,双击IPv4 ,设置ip地址前面三位跟摄像头的ip地址一致,后面一个不同,随便什么都可以,即摄像头的ip地址和网线的ip地址在同一网段,示例如下:

 (3)接下来,安装客服给的方法3操作,在网页中输入摄像头的IP地址,如192.168.1.xx,进行注册登录就可以使用摄像头了。

2、边缘设备连接摄像头

我们把在本机的操作迁移到边缘设备上,记住我们在本机上查到的摄像头IP地址。

通过网线连接摄像头和边缘设备,然后同样地,修改边缘设备IP的前三位与摄像头IP一致,也是以太网进行有线设置。

 设置完之后,在浏览器上输入摄像头的IP地址,并进行登录就可以了。

四、YOLOv5算法调用摄像头进行实时目标检测

强调:一定要在同一局域网,否则连接超时

 理论上运行如下命令行就可以,python detect.py --weights yolov5s.pt --source 0,但我们用的是网络摄像头,比如把摄像头的网络地址传输进去,在参数“--source”这里把default改为摄像头的rtsp地址,rtsp地址又是什么呢?基本格式就是rtsp://用户名:密码@ip地址/Streaming/Channels/2,用户名和密码就是你用网页登录摄像头IP是注册的账户和密码,然后@后面是摄像头的IP。

参考了海康威视IPC摄像头rtsp接入 - Dapenson - 博客园 (cnblogs.com)这篇比较多,下载了IVMS软件客户端软件 - 视频专区 - 海康威视 Hikvision,管理摄像头的相关信息。

parser.add_argument('--source', type=str, default='rtsp://admin:密码@192.168.1.xxx/Streaming/Channels/2', help='file/dir/URL/glob, 0 for webcam')

 设置完毕后,运行代码:

python detect.py --weights yolov5s.pt

 会出现报错,一个一个解决就行,比较麻烦的是如下报错:

etect: weights=['yolov5s.pt'], source=rtsp://admin:20202024zfc@192.168.110.115/Streaming/Channels/2, data=data/coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False
YOLOv5  2022-2-22 torch 2.0.0+nv23.05 CUDA:0 (Xavier, 14903MiB)

Fusing layers... 
Model Summary: 213 layers, 7225885 parameters, 0 gradients, 16.4 GFLOPs
WARNING: Environment does not support cv2.imshow() or PIL Image.show() image displays
OpenCV(4.10.0) /io/opencv/modules/highgui/src/window.cpp:1301: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

1/1: rtsp://admin:20202024zfc@192.168.110.115/Streaming/Channels/2...  Success (inf frames 704x576 at 25.00 FPS)

Traceback (most recent call last):
  File "detect.py", line 257, in <module>
    main(opt)
  File "detect.py", line 252, in main
    run(**vars(opt))
  File "/home/hebeu/miniconda3/envs/yolov5_detection/lib/python3.8/site-packages/torch/utils/_contextlib.py", line 115, in decorate_context
    return func(*args, **kwargs)
  File "detect.py", line 115, in run
    for path, im, im0s, vid_cap, s in dataset:
  File "/home/hebeu/david_workspace/code/yolov5-6.1/utils/datasets.py", line 353, in __next__
    if not all(x.is_alive() for x in self.threads) or cv2.waitKey(1) == ord('q'):  # q to quit
cv2.error: OpenCV(4.10.0) /io/opencv/modules/highgui/src/window.cpp:1367: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvWaitKey'

在这里找到了解决办法:cv2.imshow "The function is not implemented. Rebuild the library" · Issue #18 · opencv/opencv-python (github.com)

即:

sudo apt-get install libgtk2.0-dev pkg-config
pip uninstall opencv-python-headless
pip uninstall opencv-python
pip install open-python

 还有一个报错:

Traceback (most recent call last):
  File "detect.py", line 42, in <module>
    from models.common import DetectMultiBackend
  File "/home/hebeu/david_workspace/code/yolov5-6.1/models/common.py", line 24, in <module>
    from utils.datasets import exif_transpose, letterbox
  File "/home/hebeu/david_workspace/code/yolov5-6.1/utils/datasets.py", line 29, in <module>
    from utils.augmentations import Albumentations, augment_hsv, copy_paste, letterbox, mixup, random_perspective
  File "/home/hebeu/david_workspace/code/yolov5-6.1/utils/augmentations.py", line 12, in <module>
    from utils.general import LOGGER, check_version, colorstr, resample_segments, segment2box
  File "/home/hebeu/david_workspace/code/yolov5-6.1/utils/general.py", line 46, in <module>
    cv2.setNumThreads(0)  # prevent OpenCV from multithreading (incompatible with PyTorch DataLoader)
AttributeError: module 'cv2' has no attribute 'setNumThreads'

解决方法如下:

pip install --upgrade opencv-python

最后运行就可以了!

结果如下:

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现java海康威视摄像头实时预览视频流保存到指定文件中,需要先安装海康威视的SDK,并使用Java SDK开发工具包中的类库来开发应用程序。 首先,在应用程序中引入海康威视的SDK库,包括HCNetSDK.dll、PlayCtrl.dll、HCAlarm.dll等。然后,使用HCNetSDK类库中提供的方法来实现视频流实时预览功能,并将预览的视频流通过PlayCtrl.dll中提供的方法进行渲染和显示。 同时,在将视频流保存到指定文件时,可以使用Java中的IO流进行文件操作。首先在程序中创建File对象指定文件路径,然后使用FileOutputStream类创建输出流对象,通过读取预览视频流数据的byte数组并将其写入到输出流中实现将视频流保存到文件的功能。 需要注意的是,保存到文件时,时间戳的处理,文件格式等问题都需要按照实际需求进行处理。 总之,要实现java海康威视摄像头实时预览视频流保存到指定文件中,需要结合使用海康威视的SDK和Java SDK开发工具包,具体实现过程需要根据实际情况灵活处理。 ### 回答2: Java是一种广泛应用于各种领域的高级编程语言,海康威视摄像头是一种高清晰度的视频监控设备。如何实现将海康威视摄像头实时预览视频流保存到指定文件中呢?下面以Java编程语言为主体进行分析探讨。 首先,需要了解Java的多媒体相关类库和海康威视摄像头的API接口。Java多媒体相关类库包括javax.sound.sampled和javax.media包。javax.sound.sampled是Java音频API,可以处理音频文件的读、写、播放和录制等操作;javax.media则是Java多媒体API,可以处理音频、视频和图像等媒体数据。海康威视摄像头的API接口包括SDK、HCNetSDK和PlayCtrl等。 其次,需要进行海康威视摄像头实时预览视频流以及保存到指定文件中的操作。具体步骤如下: 1. 初始化海康威视摄像头SDK,包括设备登录、设备初始化和预览四个步骤。设备登录是使用设备账号密码进行登录,设备初始化是对设备进行初始化设置,预览则是打开视频流并进行播放。 2. 在预览中添加截图功能,通过调用SDK中的抓图函数将视频帧数据保存到内存中的一个缓冲区中。抓取一帧数据需要使用NET_DVR_CaptureJPEGPicture_V30函数,并将数据放置到指定的缓存区。 3. 将缓冲区中的数据保存到本地文件中。在Java中可以使用BufferedImage类来保存JPEG图像数据,使用ImageIO类将缓冲区中的图像数据保存到指定的文件中。 4. 关闭设备预览,退出SDK。 需要注意的是,保存视频流到文件中需要根据需求进行设置参数,包括视频流的编码格式、分辨率、帧率等。在进行保存时还应该进行异常处理,例如文件不存在、写入失败等异常情况的处理。 总之,Java实现海康威视摄像头实时预览视频流保存到指定文件中需要进行多项操作,包括海康威视SDK的初始化和调用、截图和保存等。具体操作可以根据实际需要进行调整和修改,最终实现预览视频流保存到文件的功能。 ### 回答3: java是一种广泛使用的编程语言,可用于开发各种应用程序,包括与摄像头相关的应用程序。海康威视(Hikvision)是一家专业从事视频监控设备制造的企业,提供多种摄像头系列产品。本文将介绍如何使用java编写程序,实现海康威视摄像头实时预览视频流,并将视频流保存到指定文件中。 首先,要实现海康威视摄像头实时预览视频流,需要使用其提供的软件开发包(SDK),该SDK提供了一组API,用于控制海康威视摄像头的各种功能。在使用SDK前,需要先在操作系统中安装相关依赖库,并且在开发环境中配置好SDK相关参数。 接下来,我们需要按照以下步骤编写java程序: 1.引入SDK相关jar包,并创建SDK实例。 import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.NativeLongByReference; import com.sun.jna.ptr.PointerByReference; import com.hikvision.netsdk.*; public class HikvisionTest { private HCNetSDK hCNetSDK; public static void main(String[] args) { HikvisionTest test = new HikvisionTest(); test.init(); test.preview(); } public void init() { hCNetSDK = HCNetSDK.INSTANCE; boolean initSuc = hCNetSDK.NET_DVR_Init(); if(!initSuc) { System.out.println("SDK初始化失败"); } } public void preview() { int userId = -1; HCNetSDK.NET_DVR_DEVICEINFO_V30 devInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30(); NativeLong lRealHandle = new NativeLong(-1); NativeLong lLoginHandle = hCNetSDK.NET_DVR_Login_V30("10.10.10.1", 8000, "admin", "password", devInfo); if(lLoginHandle.longValue() < 0) { System.out.println("登录失败"); return; } HCNetSDK.NET_DVR_PREVIEWINFO previewInfo = new HCNetSDK.NET_DVR_PREVIEWINFO(); previewInfo.lChannel = 1; previewInfo.dwStreamType = 0; previewInfo.dwLinkMode = 0x80000000; Pointer hPlayWnd = null;//播放窗口句柄,为null表示不播放画面,只预览数据 lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(lLoginHandle, previewInfo, null); if(lRealHandle.longValue() < 0) { System.out.println("预览失败"); return; } //TODO: 在这里添加保存视频流到文件的代码 } } 2.登录网络摄像头,并开启实时预览。 在上述代码中,我们调用了NET_DVR_Login_V30方法登录摄像头设备,该方法返回登录句柄,如果登录失败则返回-1。登录成功后,我们可以通过NET_DVR_RealPlay_V40方法开启实时预览功能,该方法调用后返回实时预览句柄,如果开启预览失败则返回-1。在实时预览时,我们可以指定播放窗口句柄,如果传入null则表示只预览不播放。 3.将视频流保存到指定文件中。 要将视频流保存到指定文件中,我们可以在预览时添加代码,调用NET_DVR_SaveRealData保存视频流数据。 hCNetSDK.NET_DVR_SaveRealData(lRealHandle, "D:\\video\\test.mp4"); 以上代码将把视频流数据保存到指定文件路径(D:\\video\\test.mp4)中。 另外,为了保证视频流数据正常保存,还需要添加停止预览和注销登录相关的代码。停止预览时,可以调用NET_DVR_StopRealPlay方法停止实时预览;注销登录时,可以调用NET_DVR_Logout方法注销登录句柄。 总之,使用java编写程序实现海康威视摄像头实时预览视频流并保存视频到指定文件,需要使用海康威视摄像头SDK提供的API来控制摄像头功能,同时需要注意代码的执行顺序和各种参数的设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值