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

news2024/9/22 7:31:10

前言

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,代码运行效果如下:

 三、服务器端

服务端的代码是接收到数据流之后,进行解码操作,然后使用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()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【闪击Python】字符串的创建和驻留机制

💌 博客内容:字符串的创建和驻留机制 😀 作  者:陈大大陈 🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信! 💖 欢迎大家&#x…

Dear Reality 发布全新 EXOVERB MICRO 混响插件

空间感混响效果新高度 Dear Reality 发布全新 EXOVERB MICRO 混响插件 Dear Reality 针对立体声制作推出最新的混响插件 EXOVERB MICRO,提供一流的真实感和空间感混响效果,将立体声混音技术提升至新高度。这个紧凑型音频插件功能非常强大,采…

得物社区亿级ES数据搜索性能调优实践

1.背景 2020年以来内容标注结果搜索就是社区中后台业务的核心高频使用场景之一,为了支撑复杂的后台搜索,我们将社区内容的关键信息额外存了一份到Elasticsearch中作为二级索引使用。随着标注业务的细分、迭代和时间的推移,这个索引的文档数和…

VisualStudio2022配置PCL点云库教程

属性管理器 首先,打开属性管理器:视图–其他窗口–属性管理器 打开后如图所示,选中Debug|x64,右键单击,选择属性 如图所示,需要修改的是VC目录中的包含目录和库目录: ** 包含目录 添加内容…

Andorid:日常学习笔记(3)——掌握日志工具的使用

使用Android的日志工具Log 方法: Android中的日志工具类为Log,这个类提供了如下方法来供我们打印日志: 使用方法: Log.d("MainActivity","onCreate execute"); 第一个参数tag:一般传入当前类名就好,主要用于队打印信息进行过滤.第二个参数:msg,具体想打…

如何成为一位测试开发工程师?测试开发的核心竞争力...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 抛出一个问题&…

【操作系统】第2章进程同步、PV操作、死锁

一、进程同步 1、 定义 (1) 临界资源:把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(摄像头、打印机)和许多变量、数据、内存缓冲区都属于临界资源。 对临界资源的访问必须互斥地进行。 ① 进入…

【软考】中级 | 数据库系统工程师 | 笔记总结

📢博客主页:肩匣与橘 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由肩匣与橘编写,首发于CSDN🙉 📢生活依旧是美好而又温柔的,你也…

解决winstore下载mincraft 出现错误提示的问题

mincraft 点开显示此应用无法在你的电脑上运行,去C:\XboxGames\Minecraft Launcher\Content下看了下: 但是别人电脑上相同目录下一样的文件能运行,于是选择重装,但是刚开始下载就遇到这个问题: 商店提示这个 点开一…

Ansys Zemax | 计算任意温度和压强下的折射率

概述 这篇文章介绍了OpticStudio如何计算材料在任意输入波长、环境温度和压强下的折射率。 介绍 通常情况下有两种参考折射率的测量方法:绝对测量和相对测量。其中绝对测量以真空为参考介质;相对测量则是以空气(摄氏温度20,一个标…

MySQL之盛放记录的大盒子 【InnoDB 数据页结构】

前言 本文章收录在MySQL性能优化原理实战专栏,点击此处查看更多优质内容。 本文摘录自 ▪ 小孩子4919《MySQL是怎样运行的:从根儿上理解MySQL》 学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念&#xff…

臻图信息利用数字孪生构建生态环境智慧监测系统

2月27日,中共中央国务院印发《数字中国建设整体布局规划》中指出,要推动生态环境智慧治理,加快构建智慧高效的生态环境信息化体系,建设绿色智慧的数字生态文明。 生态环境监测是生态环境保护的基础,是生态文明建设的重…

企业什么时候需要ERP系统?

对于许多成长中的企业来说,是否需要ERP系统不是问题,而是何时需要的问题。随着企业的发展,其生成的数据量和要跟踪的数据源也在不断增加。在多个平台上管理所有这些信息变得成本昂贵、费时,而且容易出现管理不善的情况。 虽然对于…

性能测试入门实践路线图

我转行做软件测试工作已有六年多了, 从功能到自动化测试,然后负责性能测试团队和质量团队的技术专项治理,再到测试专家角色,负责整个技术项目的产品/运营和质量保障工作。 其中性能测试和线上稳定性保障,算是我最擅长…

物联网|IAR集成开发环境简介|cc254核心板硬件资源|物联网之蓝牙4.0 BLE基础-学习笔记(3)

文章目录 4、IAR集成开发环境简介5、 cc254核心板硬件资源 4、IAR集成开发环境简介 完整稳定的专业嵌入式开发环境,对不同的处理器有统一的用户界面,支持35种以上的MCU,包括8,16,32位, 完全兼容C语言的 高…

女孩子转数据分析难吗?难在哪里?

对于数据分析,很多人乍一听会觉得没啥技术难度,是个适合女孩子的专业。我们面对很多零基础小白也是用通俗的语言来形容这个专业:一般是通过Excel或者power BI工具对数据进行分析,制作成可视化的报表给领导层,为公司业务…

VS2022编译libiconv-1.17

需求概述 获得最新版本的windows下可用的libiconv静态库。 解决方案 概述 使用VS2022编译libiconv-1.17。需要对源码手动进行配置。 本文所述的方法同样适用于动态库,并且理论上适用于VS2010~2022所有版本。 如果你不在乎libiconv的版本,可以参考 …

DevOps死了吗?平台工程能否取代DevOps?

最近, Scott Carey 发表了一篇调查文章,喊出了一些开发者的心声:“扯淡的DevOps,我们开发者根本不想做运维!”除此之外,软件工程师兼DevOps评论员Sid Palas也在推特上写道,“DevOps已死&#xf…

C++知识点 -- 特殊类设计

C知识点 – 特殊类设计 文章目录 C知识点 -- 特殊类设计一、不能被拷贝的类二、 只能在堆上创建对象的类三、 只能在栈上创建对象的类四、 不能被继承的类五、 只能创建一个对象的类(单例模式)1.饿汉模式2.懒汉模式3. 单例对象释放问题: 一、…

【Python入门篇】——Python中判断语句(布尔类型,比较运算符,if语句)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…