图像处理——连接IP摄像头上传到服务器实现目标识别

这篇具有很好参考价值的文章主要介绍了图像处理——连接IP摄像头上传到服务器实现目标识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

1.项目的需求是,本地连接IP摄像头,然后把图像上传到图像处理服务器器进行处理,得到的结果返回本地。

2.IP摄像头使用的是大华的摄像头,目标识别用的yolov5的模型,服务器用的是flask,实现语言是python。

3.在实现过程中,需要先进行IP摄像头的连接和图像的获取。可以使用OpenCV库来实现这一步骤。通过OpenCV库中的VideoCapture函数,可以连接到IP摄像头并获取图像。

4.获取到图像后,需要将其上传到图像处理服务器进行处理。可以使用Python中的requests库来实现图像上传功能。通过requests库中的post函数,可以将图像上传到服务器。

5.在服务器端,需要使用flask框架来实现图像处理功能。可以使用yolov5模型来进行目标识别。通过flask框架中的路由功能,可以将上传的图像进行处理,并将处理结果返回给本地。

6.最后,在本地端,需要使用Python中的socket库来实现图像结果的接收。通过socket库中的recv函数,可以接收到服务器返回的图像处理结果。

7.需要注意的是,在实现过程中,需要考虑到图像处理的时间和网络传输的延迟。可以通过优化算法和网络传输方式来提高系统的性能和响应速度。
 

一.连接摄像头

连接IP摄像头并以base64的方式上传到服务器是一种常见的操作,可以实现将摄像头拍摄的视频或图片数据传输到服务器上进行处理或存储。

首先定义了IP摄像头的地址,然后使用OpenCV库的VideoCapture函数打开摄像头。接着,使用循环读取视频流数据,并在每一帧数据上进行处理。在处理完视频帧后,使用OpenCV库的imencode函数将视频帧转换为JPEG格式的图像数据,并使用Python的base64库将图像数据编码为base64格式的字符串。最后,将base64编码的字符串上传到服务器。

在实际应用中,需要根据具体的需求对上传数据的格式和方式进行调整。例如,可以使用HTTP协议将数据上传到服务器,或者使用WebSocket协议实现实时数据传输。同时,还需要考虑数据的安全性和稳定性,比如使用SSL加密协议保护数据传输,或者使用缓冲区和重传机制保证数据的可靠性。

但这里只是一个简单的demo,如果要应用到项目上,则要考虑以上的各种因素。

import cv2
import datetime
import time
import requests
import base64
import numpy as np

def image_to_base64(image_np):
    image = cv2.imencode('.jpg', image_np)[1]
    base64_data = str(base64.b64encode(image))[2:-1]
    return base64_data


def base64_to_image(base64_code):
    img_data = base64.b64decode(base64_code)
    img_array = np.frombuffer(img_data, np.uint8)
    img = cv2.imdecode(img_array, cv2.COLOR_RGB2BGR)

    return img


class Camera_picture:

    def __init__(self):
        self.user = "admin"

        self.pwd = "dahua12345"

        self.ip = "192.168.0.xxx:xxx"

        self.file_path = "./"

        self.name = "camera"

    def dahua(self):
        video_stream_path = f"rtsp://{self.user}:{self.pwd}@{self.ip}/cam/realmonitor?channel=1&subtype=0"

        cap = cv2.VideoCapture(video_stream_path)  # 连接摄像头

        print('IP camera open : {}'.format(cap.isOpened()))

        return cap

    def timing_screenshot(self):
        cap = self.dahua()
        if cap.isOpened():
            cv2.namedWindow(self.name, flags=cv2.WINDOW_FREERATIO)
            last_time = datetime.datetime.now()
            while(True):
                ret, frame = cap.read()
                frame = cv2.resize(frame, (500, 300))
                cv2.imshow(self.name, frame)

                cur_time = datetime.datetime.now()
                name = self.file_path + str(time.time()) + ".jpg"
                if (cur_time - last_time).seconds >= 10:
                    cv2.imwrite(name, cap.read()[1])
                    last_time = cur_time
                    print("Image saved successfully!")

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

            cap.release()
            cv2.destroyAllWindows()
        else:
            print("Camera connection failed. Please check the configuration!")

    def manual_screenshot(self):
        cap = self.dahua()
        if cap.isOpened():
            cv2.namedWindow(self.name, flags=cv2.WINDOW_FREERATIO)
            while(True):
                ret, frame = cap.read()
                frame = cv2.resize(frame, (500, 300))
                cv2.imshow(self.name, frame)

                event = cv2.waitKey(1) & 0xFF

                if event == ord('s'):  # 按"S"截取图片
                    name = self.file_path + str(time.time()) + ".jpg"
                    cv2.imwrite(name, cap.read()[1])
                    print("Screen saved successfully!")

                elif event == ord('q'):
                    break

            cap.release()
            cv2.destroyAllWindows()
        else:
            print("Camera connection failed. Please check the configuration!")

    def get_video_stream(self):
        cap = self.dahua()
        if cap.isOpened():
            width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            fps = cap.get(cv2.CAP_PROP_FPS)
            # fourcc = int(cap.get(cv2.CAP_PROP_FOURCC))

            # FourCC 是用于指定视频编解码器的4字节代码
            # fourcc = cv2.VideoWriter_fourcc(*"MJPG")
            # writer = cv2.VideoWriter(f"{self.file_path}{str(time.time())}.mp4", fourcc, fps, (width, height))

            while(True):
                ret, frame = cap.read()
                if not ret:  # 返回False退出循环
                    break

                # writer.write(frame)  # 视频保存

                # frame = cv2.resize(frame, (500, 300))
                # cv2.imshow(self.name, frame)

                img_code = image_to_base64(frame)
                data = {'img': img_code}
                resp = requests.post("http://127.0.0.1:5004/camera_input", data=data)
                print(resp.content)

                if 0xFF == ord('q'):
                    break

            cap.release()
            cv2.destroyAllWindows()
        else:
            print("Camera connection failed. Please check the configuration!")

    def read_video(self,):
        cap = self.dahua()
        if cap.isOpened():
            key_frame = 2
            j = 0
            while True:
                if key_frame >= 1:
                    cap.set(cv2.CAP_PROP_POS_FRAMES, j)
                    j += key_frame
                    hasFrame, frame = cap.read()
                    if not hasFrame:
                        break

                img_code = image_to_base64(frame)
                data = {'img': img_code}
                resp = requests.post("http://127.0.0.1:5004/camera_input", data=data)
                print(resp.content)
                # cv2.imshow('show', frame)
                # if cv2.waitKey(1) & 0xFF == ord('q'):
                #     break


if __name__ == '__main__':
    run = Camera_picture()
    # run.timing_screenshot()
    # run.get_video_stream()
    # run.manual_screenshot()
    run.read_video()

二、目标识别

这里用来演示的目标识别是git上一个开源代码,可以到这个里下载代码:https://github.com/Sharpiless/Yolov5-deepsort-inference

下载代码,配置下环境,然后运行python demo.py,代码运行效果如下:

图像处理——连接IP摄像头上传到服务器实现目标识别

 三、服务器端

服务端的代码是接收到数据流之后,进行解码操作,然后使用yolov5模型进行推理。这个过程可以分为以下几个步骤:

1. 接收数据流:服务端通过网络接口接收客户端发送的数据流。

2. 解码数据流:服务端对接收到的数据流进行解码操作,将其转换为图像数据。

3. 模型推理:服务端使用yolov5模型对预处理后的图像数据进行推理,得到目标检测结果。

需要注意的是,服务端的代码需要具备高效的数据处理能力和模型推理能力,以保证实时性和准确性。同时,服务端的代码还需要考虑并发处理和多线程处理等问题,以提高系统的吞吐量和并发性能。

from flask import Flask, request
import base64
import numpy as np
from gevent import pywsgi
import cv2, argparse
import imutils
from AIDetector_pytorch import Detector

det = Detector()
func_status = {}
func_status['headpose'] = None

app = Flask(__name__)
@app.route('/camera_input', methods=['POST'])
def camera_input():
    if request.method == 'POST':
        input_data = request.form.get('img')
        cv_img = base64_to_image(input_data)
        result = det.feedCap(cv_img, func_status)
        result = result['frame']
        result = imutils.resize(result, height=500)

        cv2.imshow('src',result)
        cv2.waitKey(24)

        return 'ok'

def image_to_base64(image_np):
    image = cv2.imencode('.jpg', image_np)[1]
    base64_data = str(base64.b64encode(image))[2:-1]
    return base64_data


def base64_to_image(base64_code):
    img_data = base64.b64decode(base64_code)
    img_array = np.frombuffer(img_data, np.uint8)
    img = cv2.imdecode(img_array, cv2.COLOR_RGB2BGR)

    return img

if __name__ == "__main__":
    print('Statrt server----------------')
    server = pywsgi.WSGIServer(('127.0.0.1', 5004), app)
    server.serve_forever()

图像处理——连接IP摄像头上传到服务器实现目标识别文章来源地址https://www.toymoban.com/news/detail-445801.html

到了这里,关于图像处理——连接IP摄像头上传到服务器实现目标识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 33、基于STM32单片机车牌识别系统摄像头图像处理系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、程序源码 七、资料包括 随着汽车工业的迅猛发展,我国汽车拥有量急剧增加。停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展,

    2024年02月15日
    浏览(41)
  • ROS高效进阶第四章 -- 机器视觉处理之图像格式,usb_cam,摄像头标定,opencv和cv_bridge引入

    从本文开始,我们用四篇文章学习ROS机器视觉处理,本文先学习一些外围的知识,为后面的人脸识别,目标跟踪和yolov5目标检测做准备。 我的笔记本是Thinkpad T14 i7 + Nvidia MX450,系统是ubuntu20.04,ros是noetic。由于很多驱动与硬件强相关,请读者注意这点。 本文的参考资料有:

    2024年02月04日
    浏览(43)
  • 76、基于STM32单片机车牌识别摄像头图像处理扫描设计(程序+原理图+PCB源文件+相关资料+参考PPT+元器件清单等)

    单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大。其片内的4K程序存储器是FLASH工艺的,这种单

    2024年02月12日
    浏览(53)
  • AHD同轴摄像头接入电脑USB录制视频的方法,AHD转USB,AI图像算法(ADAS\DMS\360环视\BSD\人脸识别),图像接入电脑处理

            在图像算法训练时,有时候需要接入电脑进行算法调试和处理,很多摄像头是AHD同轴信号,例如安防和汽车后装市场很多摄像头都是AHD同轴的接口,而电脑没有可以接入同轴的接口,所以需要转换成电脑可以接入的接口才可以将摄像头接入电脑,而USB绝对是最常用

    2024年02月09日
    浏览(121)
  • javacv基础02-调用本机摄像头并预览摄像头图像画面视频

    引入架包: 运行效果: 注意: 1、maven依赖后,会导致整个项目工程打包发布后的体积变得十分巨大 原因是ffmpeg和opencv两个依赖默认会把android,ios,linux,macos,windows以及各自不同cpu芯片下,86/64等所有版本的Jar会全部依赖进来,项目打包后体积剧增500M+ 解决方法也比较简单

    2024年02月11日
    浏览(56)
  • Linux摄像头(v4l2应用)——获取摄像头一帧图像

    一.V4L2简介 V4L2(Video for Linux 2):Linux内核中视频设备中的驱动框架,对于应用层它提供了一系列的API接口,同时对于硬件层,它适配大部分的视频设备,因此通过调用V4L2的接口函数可以适配大部分的视频设备。 二、操作流程 1.打开设备 当把摄像头插入到电脑后,执行ls /

    2024年02月20日
    浏览(48)
  • 电脑获取网络摄像头图像及调用

    目前市面上常见的摄像头大体有以下几种类型,一种是usb摄像头,一种是带wifi网络摄像头,还有一种有线网络摄像头,通过一根网线连接电脑用于传输图像。本文主要讲解下有线网络摄像头的调用配置。 这种摄像头一般有两个接口,分别是网口和电源口,接线非常简单就是

    2024年02月01日
    浏览(49)
  • SLAM系统--开启摄像头连接

    博客地址:https://www.cnblogs.com/zylyehuo/ 基于ORB-SLAM3库搭建SLAM系统 详见之前的博客 基于ORB-SLAM3库搭建SLAM系统 - zylyehuo - 博客园 (cnblogs.com) 参考链接 ORB-SLAM3 v1.0 编译问题解决 /usr/bin/env: \\\"pythonr\\\": 没有那个文件或目录 打开终端输入指令: vim ~/.bashrc 打开用户根目录下的.bashrc文件

    2024年02月06日
    浏览(41)
  • YOLOv5调用IP摄像头

    本文将展示IP摄像头的调用方法(以调用手机摄像头为例)。 首先在手机端下载可以联网调用手机摄像头的APP 我用的是这个 勾选RTSP,点击分享 记下局域网地址,后面代码中需要对应修改 更改detect.py中\\\'--source\\\'部分默认值,注意格式,然后点击运行即可 在PC端会出现和实时目

    2024年02月07日
    浏览(42)
  • 树莓派连接双目摄像头教程(详)

    前言:此教程为菜鸟准备好了代码,仅仅是初试水。 软件准备:Arduino IDE软件 硬件准备:树莓派 Arduin单片机 双目摄像头 树莓派桌面:1准备环境 2 Arduino IDE 3打开摄像头  1.软件准备 下载Arduino IDE软件 Windows用户可在浏览器输入网址:https://www.arduino.cc/en/Main/Software 下载安装都是

    2023年04月09日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包