0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【Sipeed M2 Dock开发板试用体验】M2 Dock获取MJPEG推流数据

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-10-28 15:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文来源电子发烧友社区,作者:HonestQiao, 帖子地址:https://bbs.elecfans.com/jishu_2294639_1_1.html


M2 Dock开发板的MaixPY开发环境,自身支持获取摄像头视频数据,并对外提供MJPEG图传。

前几天,研究了米尔MYD-YT507开发板USB摄像头使用从入门到放弃,并成功实现了MJPEG推流图传。

于是,想着 M2 Dock 获取 MJPEG推流数据,接入到MaxiPY,显示到屏幕上,以便于进一步的处理。

M2Dock推流数据获取逻辑.png

通过官方的在线手册MaixPy3 image 模块 - Sipeed Wiki了解到,通常创建一个image对象,使用的是Image.open()来打开一个文件。

最简单的方法,可以在M2 Dock上,不间断的获取MJPEG的数据,并保存到临时文件,再使用 Image.open() 打开,然后再显示到屏幕:

with open(tmp_file, "wb") as binary_file:
    binary_file.write(jpg)
    img = image.open(tmp_file)
    display.show(img)

上述代码中的jpg,即为获取的MJPEG数据。

但这种方法,还需要进过一次保存文件的中转,多了一步操作。

如果能够把获取的数据,直接给转换成maix需要的数据格式,那就方便了。

进一步查阅官方手册MaixPy3 image 模块 - Sipeed Wiki,了解到maix的image对象,还支持如下的调用方式:

Image.load(data, [size = (240, 240) , [mode = "RGB"]])python 对象中加载出一张图像,会将 python 对象的数据 copyImage 对象内部,如将 tobytes 的二进制数据重新恢复成 Image对象。
date可以是PIL对象, image.Image() 对象,bytes对象,numpy 对象.databytes,numpy对象时,需要提供sizemode参数.
返回 Image 对象,以便您可以使用 . 表示法调用另一个方法。

而这里的data,可以是多种来源,例如PIL。

PIL可以通过JPG的bianry流数据,直接生成Image对象。

那么结合两者,就可以跳过文件保存再调用的步骤了:

bytes_stream = BytesIO(jpg)
pimg = Image.open(bytes_stream)
img = image.load(pimg)
display.show(img)

最终,经过反复尝试,实现了M2 Dock的MaxiPY,获取MJPEG推流数据并显示到屏幕。

完整的代码如下:

import numpy as np
import platform

if platform.uname().node == "sipeed":
    from io import BytesIO
    from PIL import Image
    from maix import camera, mjpg, utils, display, image
else:
    import cv2

READ_TYPE = "socket"    # url socket

MJPEG_HOST = "192.168.2.207"
MJPEG_PORT = 8080
MJPEG_QUERY = "/?action=stream"


def img_data_show(jpg):
    global img_bytes
    global tmp_file
    global is_sipeed
    global BytesIO
    global Image
    global np
    global image
    global display

    if is_sipeed:
        if True:
            bytes_stream = BytesIO(jpg)
            pimg = Image.open(bytes_stream)
            img = image.load(pimg)
            display.show(img)
        else:
            with open(tmp_file, "wb") as binary_file:
                binary_file.write(jpg)
                img = image.open(tmp_file)
                display.show(img)
    else:
        img = cv2.imdecode(np.frombuffer(
            jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
        cv2.imshow('i', img)
        if cv2.waitKey(1) == 27:
            exit(0)


def img_data_match(chunk):
    global img_bytes
    global tmp_file
    global is_sipeed
    global BytesIO
    global Image
    global np
    global image
    global display
    global img_data_show

    img_bytes += chunk
    a = img_bytes.find(b'ÿØ')
    b = img_bytes.find(b'ÿÙ')
    if a != -1 and b != -1:
        jpg = img_bytes[a:b+2]
        img_bytes = img_bytes[b+2:]
        img_data_show(jpg)     


img_bytes = b''
tmp_file = "/tmp/test.jpg"
is_sipeed = platform.uname().node == "sipeed"

print("Connect to %s:%d with %s on %s" % (MJPEG_HOST, MJPEG_PORT, READ_TYPE, platform.uname().node))

if READ_TYPE == "url":
    import requests

    MJPEG_URL = "http://%s:%s%s" % (MJPEG_HOST, MJPEG_PORT, MJPEG_QUERY)

    r = requests.get(MJPEG_URL, stream=True)
    if(r.status_code == 200):
        print("connect success!")
        for chunk in r.iter_content(chunk_size=1024):
            img_data_match(chunk)
    else:
        print("Received unexpected status code {}".format(r.status_code))
elif READ_TYPE == "socket":
    import socket

    client = socket.socket()  # 创建socket套接字
    ret = client.connect((MJPEG_HOST, MJPEG_PORT))  # 状态位,判定是否连接成功
    request_url = "GET %s HTTP/1.1
Host:%s
Connection:Close

" % (
        MJPEG_QUERY, MJPEG_HOST)

    if(ret == -1):  # 连接失败,退出程序
        print("connet error!")
        exit(-1)
    else:  # 连接成功
        print("connect success!")

    client.send(request_url.encode())  # 发送socket请求,开始接收数据
    chunk = client.recv(1024)  # 第一个recv返回信息,跟图片无关
    chunk = client.recv(1024)  # 这个信息开始跟图片有关系,放到接收变量里
    while chunk:  # 判断是否还有信息
        img_data_match(chunk)
        chunk = client.recv(1024)  # 继续接收

上述代码中,包含如下的部分:

  1. 获取MJPEG数据时,可以试用python的request模块,或者使用socket模块,后者效率更高
  2. 获取到MJPEG数据后,自动分析其中的JPG数据帧,一旦检测到,则进行显示处理
  3. 显示处理部分,会自动区分是在电脑上,还是在M2 Dock上
  4. 如果是在电脑上,则使用cv2进行处理显示,如果需要退出可以按ESC按键
  5. 如果是在M2 Dock上,则使用BytesIO来 获取的数据转换为二进制流,然后提供给PIL生成进行处理生成Image对象,再提供给display模块显示。

上述源码,提供在M2_Dock: M2 Dock学习研究与实例分享 (gitee.com)

最终具体的呈现效果,可以查看附件的视频。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发板试用
    +关注

    关注

    3

    文章

    303

    浏览量

    2643
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【作品合集】视美泰M-K1HSE、3568开发板测评

    M-K1HSE开发板免费试用 SC-3568HA开发板免费试用 GM-3568JHF开发板
    发表于 09-22 10:32

    【作品合集】玄铁Banana Pi BPI-RV2开发板测评

    BPI-RV2 开源网关是矽昌和⾹蕉派开源社区(Banana Pi )合作设计。 活动详情地址:【RISC-V专题】Banana Pi BPI-RV2开发板试用 作者:jf_113
    发表于 09-17 10:58

    【作品合集】矽速科技Sipeed MaixCAM Pro开发板测评

    ,Grove接口。 活动详情地址: 【RISC-V专题】Sipeed MaixCAM Pro开发板免费试用 作者:jf_05814630 【Sipeed MaixCAM Pro
    发表于 09-05 09:33

    【EASY EAI Orin Nano开发板试用体验】使用stream代码和WEB服务器代码实现在客户端网页上查看摄像头图像

    本帖最后由 donatello1996 于 2025-8-13 20:32 编辑 【EASY EAI Orin Nano开发板试用体验】使用stream代码和WEB服务器代码
    发表于 08-11 23:15

    Sipeed MaixCAM Pro开发板试用体验】 + 04 + 机器学习YOLO体验

    的 )。 这张图是我离线训练的结果,我认为训练出来的模型精度主要还是跟训练集的质量和标注有关,只要在这几方面做好,训练出来的模型精度肯定不会低(实测多次)。 三、结语 对于这次的开发板试用活动我个人非常
    发表于 07-24 21:35

    RA4M2-SENSOR开发板手册

    RA4M2-SENSOR开发板手册
    发表于 07-21 14:41 18次下载

    Sipeed MaixCAM Pro开发板试用体验】+ 02 + 基础功能测试

    、基础功能测试 1.人脸表情情绪检测 通过开发板自带的应用程序实测发现识别准确率非常的高(但需在离人脸较近的地方进行识别,如果识别距离过远会导致识别结果不准确的问题)。 2.找色块功能 通过
    发表于 07-19 22:50

    Sipeed MaixCAM Pro开发板试用体验】+ 01 + MaixCAM Pro开箱

    会能够去体验这款高性能 AI 视觉处理--MaixCAM Pro 。 二、开箱 1.开箱视频 开箱视频见顶部。 2.包装内容 (1)MaixCAMPro 开发板2)杜邦
    发表于 07-04 10:51

    Vidda大眼睛M2 Pro投影仪搭载MediaTek MT9679芯片

    Vidda 大眼睛 M2 Pro 搭载 MediaTek MT9679 旗舰投影芯片,该芯片集成 4 核 Arm Cortex-A73 CPU 和 Arm Mail-G52 MC1 GPU,强大算力
    的头像 发表于 06-17 16:06 1419次阅读

    【评测试用】合众HZ-T536开发板免费试用体验

    【评测试用】合众HZ-T536开发板免费试用体验
    的头像 发表于 05-27 08:05 696次阅读
    【评测<b class='flag-5'>试用</b>】合众HZ-T536<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>体验

    RA-Eco-RA4M2开发板免费试用啦 #开发板试用

    开发板
    ElecFans小喇叭
    发布于 :2025年04月02日 16:56:25

    免费丨米尔 STM32MP257开发板有奖试用

    米尔与ST合作发布的新品基于STM32MP257应用处理器的MYD-LD25X开发板免费试用活动来啦~~米尔提供了2块价值488元的MYD-LD25X开发板发起
    的头像 发表于 03-20 08:05 885次阅读
    免费丨米尔 STM32MP257<b class='flag-5'>开发板</b>有奖<b class='flag-5'>试用</b>

    有奖试用!!RA-Eco-RA4M2-100PIN-V1.0开发板试用活动报名

    RA-Eco-RA4M2-100PIN-V1.0开发板试用活动
    的头像 发表于 03-13 12:10 827次阅读
    有奖<b class='flag-5'>试用</b>!!RA-Eco-RA4<b class='flag-5'>M2</b>-100PIN-V1.0<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>活动报名

    THS8135进行YUV输出,如何配置M1,M2,还有SYNC_T这些信号?

    您好!我现在在使用THS8135的过程中遇到了点小麻烦,我想进行YUV输出,但是不知道如何配置M1,M2,还有SYNC_T这些信号,出来的结果和想要的结果不一样
    发表于 02-14 06:26

    THS8135不需要外部再引入SYNC/BLANK信号,M1/M2/CLK &amp; SYNC/SYNC_T/BLANK信号应该怎样处理?

    我们有如下应用,请教一下再这种场景下THS8135 的 M1/M2/SYNC/SYNC_T/BLANK pin如何设置(上下拉)。 将CVBS信号经AD转换后的数字信号,由THS8135 RCr
    发表于 12-31 07:31