在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【Sipeed M2 Dock開發(fā)板試用體驗】M2 Dock獲取MJPEG推流數(shù)據(jù)

開發(fā)板試用精選 ? 來源:開發(fā)板試用 ? 作者:電子發(fā)燒友論壇 ? 2022-10-28 15:36 ? 次閱讀
本文來源電子發(fā)燒友社區(qū),作者:HonestQiao, 帖子地址:https://bbs.elecfans.com/jishu_2294639_1_1.html


M2 Dock開發(fā)板的MaixPY開發(fā)環(huán)境,自身支持獲取攝像頭視頻數(shù)據(jù),并對外提供MJPEG圖傳。

前幾天,研究了米爾MYD-YT507開發(fā)板USB攝像頭使用從入門到放棄,并成功實現(xiàn)了MJPEG推流圖傳。

于是,想著 M2 Dock 獲取 MJPEG推流數(shù)據(jù),接入到MaxiPY,顯示到屏幕上,以便于進一步的處理。

M2Dock推流數(shù)據(jù)獲取邏輯.png

通過官方的在線手冊MaixPy3 image 模塊 - Sipeed Wiki了解到,通常創(chuàng)建一個image對象,使用的是Image.open()來打開一個文件。

最簡單的方法,可以在M2 Dock上,不間斷的獲取MJPEG的數(shù)據(jù),并保存到臨時文件,再使用 Image.open() 打開,然后再顯示到屏幕:

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

上述代碼中的jpg,即為獲取的MJPEG數(shù)據(jù)。

但這種方法,還需要進過一次保存文件的中轉(zhuǎn),多了一步操作。

如果能夠把獲取的數(shù)據(jù),直接給轉(zhuǎn)換成maix需要的數(shù)據(jù)格式,那就方便了。

進一步查閱官方手冊MaixPy3 image 模塊 - Sipeed Wiki,了解到maix的image對象,還支持如下的調(diào)用方式:

Image.load(data, [size = (240, 240) , [mode = "RGB"]])python 對象中加載出一張圖像,會將 python 對象的數(shù)據(jù) copyImage 對象內(nèi)部,如將 tobytes 的二進制數(shù)據(jù)重新恢復(fù)成 Image對象。
date可以是PIL對象, image.Image() 對象,bytes對象,numpy 對象.
當(dāng)databytes,numpy對象時,需要提供sizemode參數(shù).
返回 Image 對象,以便您可以使用 . 表示法調(diào)用另一個方法。

而這里的data,可以是多種來源,例如PIL。

PIL可以通過JPG的bianry流數(shù)據(jù),直接生成Image對象。

那么結(jié)合兩者,就可以跳過文件保存再調(diào)用的步驟了:

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

最終,經(jīng)過反復(fù)嘗試,實現(xiàn)了M2 Dock的MaxiPY,獲取MJPEG推流數(shù)據(jù)并顯示到屏幕。

完整的代碼如下:

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()  # 創(chuàng)建socket套接字
    ret = client.connect((MJPEG_HOST, MJPEG_PORT))  # 狀態(tài)位,判定是否連接成功
    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())  # 發(fā)送socket請求,開始接收數(shù)據(jù)
    chunk = client.recv(1024)  # 第一個recv返回信息,跟圖片無關(guān)
    chunk = client.recv(1024)  # 這個信息開始跟圖片有關(guān)系,放到接收變量里
    while chunk:  # 判斷是否還有信息
        img_data_match(chunk)
        chunk = client.recv(1024)  # 繼續(xù)接收

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

  1. 獲取MJPEG數(shù)據(jù)時,可以試用python的request模塊,或者使用socket模塊,后者效率更高
  2. 獲取到MJPEG數(shù)據(jù)后,自動分析其中的JPG數(shù)據(jù)幀,一旦檢測到,則進行顯示處理
  3. 顯示處理部分,會自動區(qū)分是在電腦上,還是在M2 Dock上
  4. 如果是在電腦上,則使用cv2進行處理顯示,如果需要退出可以按ESC按鍵
  5. 如果是在M2 Dock上,則使用BytesIO來 獲取的數(shù)據(jù)轉(zhuǎn)換為二進制流,然后提供給PIL生成進行處理生成Image對象,再提供給display模塊顯示。

上述源碼,提供在M2_Dock: M2 Dock學(xué)習(xí)研究與實例分享 (gitee.com)

最終具體的呈現(xiàn)效果,可以查看附件的視頻。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 開發(fā)板試用
    +關(guān)注

    關(guān)注

    3

    文章

    301

    瀏覽量

    2343
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    【RA-Eco-RA4M2開發(fā)板評測】UART測試實驗

    本次測試實驗,基于瑞薩RA-Eco-RA4M2開發(fā)板進行了UART(通用異步收發(fā)器)通信功能的測試與驗證。測試?yán)坦俜揭灿刑峁筛鶕?jù)使用需要修改。 在測試前需要注意的是配置的項目設(shè)置e2
    發(fā)表于 06-03 11:53

    【評測試用】合眾HZ-T536開發(fā)板免費試用體驗

    【評測試用】合眾HZ-T536開發(fā)板免費試用體驗
    的頭像 發(fā)表于 05-27 08:05 ?140次閱讀
    【評測<b class='flag-5'>試用</b>】合眾HZ-T536<b class='flag-5'>開發(fā)板</b>免費<b class='flag-5'>試用</b>體驗

    RA-Eco-RA4M2開發(fā)板免費試用啦 #開發(fā)板試用

    開發(fā)板
    ElecFans小喇叭
    發(fā)布于 :2025年04月02日 16:56:25

    免費丨米爾 STM32MP257開發(fā)板有獎試用

    米爾與ST合作發(fā)布的新品基于STM32MP257應(yīng)用處理器的MYD-LD25X開發(fā)板免費試用活動來啦~~米爾提供了2塊價值488元的MYD-LD25X開發(fā)板發(fā)起
    的頭像 發(fā)表于 03-20 08:05 ?392次閱讀
    免費丨米爾 STM32MP257<b class='flag-5'>開發(fā)板</b>有獎<b class='flag-5'>試用</b>

    有獎試用!!RA-Eco-RA4M2-100PIN-V1.0開發(fā)板試用活動報名

    RA-Eco-RA4M2-100PIN-V1.0開發(fā)板試用活動
    的頭像 發(fā)表于 03-13 12:10 ?436次閱讀
    有獎<b class='flag-5'>試用</b>!!RA-Eco-RA4<b class='flag-5'>M2</b>-100PIN-V1.0<b class='flag-5'>開發(fā)板</b><b class='flag-5'>試用</b>活動報名

    THS8135進行YUV輸出,如何配置M1,M2,還有SYNC_T這些信號?

    您好!我現(xiàn)在在使用THS8135的過程中遇到了點小麻煩,我想進行YUV輸出,但是不知道如何配置M1,M2,還有SYNC_T這些信號,出來的結(jié)果和想要的結(jié)果不一樣
    發(fā)表于 02-14 06:26

    THS8135不需要外部再引入SYNC/BLANK信號,M1/M2/CLK &amp; SYNC/SYNC_T/BLANK信號應(yīng)該怎樣處理?

    我們有如下應(yīng)用,請教一下再這種場景下THS8135 的 M1/M2/SYNC/SYNC_T/BLANK pin如何設(shè)置(上下拉)。 將CVBS信號經(jīng)AD轉(zhuǎn)換后的數(shù)字信號,由THS8135 RCr
    發(fā)表于 12-31 07:31

    追加名額丨米爾瑞芯微RK3576開發(fā)板有獎試用

    米爾與瑞芯微合作發(fā)布的新品基于瑞芯微RK3576應(yīng)用處理器的MYD-LR3576開發(fā)板免費試用活動加碼啦~~米爾追加了2塊價值849元的MYD-LR3576開發(fā)板發(fā)起
    的頭像 發(fā)表于 11-22 01:00 ?564次閱讀
    追加名額丨米爾瑞芯微RK3576<b class='flag-5'>開發(fā)板</b>有獎<b class='flag-5'>試用</b>

    有獎試用!!RA-Eco-RA4E2-64PIN-V1.0開發(fā)板試用活動開始報名

    有獎試用!!RA-Eco-RA4E2-64PIN-V1.0開發(fā)板試用活動開始報名
    的頭像 發(fā)表于 11-09 01:02 ?516次閱讀
    有獎<b class='flag-5'>試用</b>!!RA-Eco-RA4E<b class='flag-5'>2</b>-64PIN-V1.0<b class='flag-5'>開發(fā)板</b><b class='flag-5'>試用</b>活動開始報名

    ICY DOCK M.2轉(zhuǎn)U.2 SSD轉(zhuǎn)接盒如何重新定義M.2 NVMe SSD

    ICY DOCK M.2轉(zhuǎn)U.2 SSD轉(zhuǎn)接盒如何重新定義M.2 NVMe SSD
    的頭像 發(fā)表于 10-21 18:08 ?572次閱讀
    ICY <b class='flag-5'>DOCK</b> <b class='flag-5'>M.2</b>轉(zhuǎn)U.<b class='flag-5'>2</b> SSD轉(zhuǎn)接盒如何重新定義<b class='flag-5'>M.2</b> NVMe SSD

    TAS5611有M1,M2M3模式設(shè)置腳,TAS5611的AD模式 BD模式有什么區(qū)別?

    TAS5611有M1,M2M3模式設(shè)置腳,請教一下芯片的AD模式BD模式有何區(qū)別?
    發(fā)表于 10-16 07:55

    TAS5630B M1、M2M3到底是設(shè)置硬件模式的還是保護模式的?

    關(guān)于TAS5630B的幾個問題 1.M1、M2M3到底是設(shè)置硬件模式的還是保護模式的?從上表看是由這三位決定輸出是SE還是BTL或PBTL,可是翻看論壇有關(guān)TAS5630的問題貼,有個說是
    發(fā)表于 10-09 06:20

    m2接口sata和nvme怎么區(qū)分

    M.2接口是一種常見的固態(tài)硬盤接口,它支持SATA和NVMe兩種不同的協(xié)議。這兩種協(xié)議在性能、功耗、價格等方面存在一定的差異,因此在選擇固態(tài)硬盤時,了解它們的區(qū)別是非常重要的。本文將詳細介紹M.2
    的頭像 發(fā)表于 07-10 10:19 ?7349次閱讀

    怎么判斷m2接口是不是nvme

    M.2接口概述 M.2接口,全稱為“Next Generation Form Factor”,即下一代形態(tài)因子接口。它是一種用于連接固態(tài)硬盤(SSD)和主板的接口標(biāo)準(zhǔn),由英特爾公司于2013年推出
    的頭像 發(fā)表于 07-10 10:18 ?7113次閱讀

    什么是MCIO接口? ICY DOCK MCIO概念產(chǎn)品介紹

    什么是MCIO接口? ICY DOCK MCIO概念產(chǎn)品介紹
    的頭像 發(fā)表于 06-28 17:21 ?9358次閱讀
    什么是MCIO接口? ICY <b class='flag-5'>DOCK</b> MCIO概念產(chǎn)品介紹
    主站蜘蛛池模板: 五月丁香 | 成人午夜剧场 | 九九全国免费视频 | 国产精品久久精品福利网站 | 海外毛片 | 一级做a免费视频 | 天堂影| 网站大全黄免费 | 成人a视频| 国产精品欧美一区二区三区 | 2022第二三四天堂网 | 男人午夜视频 | 免费h网站在线观看 | 在线观看视频你懂的 | 狠狠色丁香九九婷婷综合五月 | 91精品国产色综合久久不卡蜜 | 永久免费在线观看视频 | 2019国产情侣 | 久草资源网 | 性色影院| 亚洲爱v| aaaa黄色片| 成人免费看毛片 | 亚洲狠狠网站色噜噜 | 四虎国产精品免费观看 | 四虎影视色费永久在线观看 | 国产毛片农村妇女系列 | 日日夜夜天天操 | 亚洲亚洲人成网站在线观看 | 午夜福利国产一级毛片 | 明日花绮罗snis-862在线播放 | 午夜在线视频免费 | 国产一卡二卡3卡4卡四卡在线 | va在线观看 | dyav午夜片 | 222在线视频免费观看 | 人人看人人鲁狠狠高清 | 欧美爽爽 | 欧美色欧 | 天堂电影免费在线观看 | 久久艹综合 |