色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    301

    瀏覽量

    2116
收藏 人收藏

    評論

    相關推薦

    ICY DOCK M.2轉U.2 SSD轉接盒如何重新定義M.2 NVMe SSD

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

    TAS5611有M1,M2M3模式設置腳,TAS5611的AD模式 BD模式有什么區別?

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

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

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

    m2接口sata和nvme怎么區分

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

    蘋果加速人工智能服務器布局:M2 Ultra與M4芯片引領新潮

    據投資報告透露,通過對供應鏈的調查,發現富士康正著手組裝采用M2 Ultra芯片的AI服務器,預計于2025年末推出配備M4芯片的新款服務器。
    的頭像 發表于 05-07 11:17 ?905次閱讀

    蘋果電腦的M3芯片和M2 Pro芯片哪個好

    蘋果電腦的M3芯片和M2 Pro芯片各有優勢,具體哪個更好取決于使用需求。
    的頭像 發表于 03-13 17:02 ?8628次閱讀

    M3芯片與M2芯片的差別

    M3芯片與M2芯片在性能和應用上存在一定差別。M3芯片作為新一代處理器,在多個方面相較于M2芯片有所提升。具體來說,M3芯片在單核和多核測試
    的頭像 發表于 03-13 16:14 ?4282次閱讀

    m3芯片顯卡性能怎么樣 蘋果m3芯片比m2強多少倍

    足以應對大部分的日常使用和輕度游戲需求。它能夠流暢地運行大多數應用程序,包括圖形設計、視頻編輯等需要一定圖形處理能力的軟件。 蘋果m3芯片比m2強多少倍 從已知的信息來看,M3芯片在GPU速度上達到了
    的頭像 發表于 03-12 17:00 ?4018次閱讀

    蘋果M2芯片和M3芯片對比哪個好

    蘋果M2芯片和M3芯片各有其優勢,具體哪個更好取決于使用需求。
    的頭像 發表于 03-11 17:28 ?3250次閱讀

    M3芯片和M2芯片價值差異

    M3芯片和M2芯片在價值上的差異主要體現在性能和功能上。M3芯片作為最新一代的處理器,在性能上較M2芯片有了顯著提升,無論是處理速度、圖形渲染還是多任務處理能力都更為出色。這使得
    的頭像 發表于 03-08 17:12 ?2223次閱讀

    M3芯片比M2芯片快多少

    M3芯片相較于M2芯片,在性能上有了顯著的提升。具體來說,M3芯片在GPU速度上達到了M2芯片的1.8倍,這意味著在處理圖形密集型任務時,M
    的頭像 發表于 03-08 17:04 ?3321次閱讀

    M1、M2M3芯片是什么意思

    M1、M2M3芯片都是蘋果公司推出的自研處理器芯片,具有不同的特點和發布時間。
    的頭像 發表于 03-08 15:51 ?5956次閱讀

    蘋果M3芯片比M2芯片提升多少

    蘋果M3芯片相比M2芯片在性能上有了顯著的提升。具體來說,M3芯片的性能核心相比M2快了約15%,這主要得益于M3采用了更先進的制程工藝和全
    的頭像 發表于 03-08 15:46 ?2762次閱讀

    M3芯片與M2芯片差別大嗎

    M3芯片與M2芯片在性能上確實存在一定的差別。M3芯片在多個方面相較于M2有所改進和提升。例如,在單核和多核測試中,M3芯片的成績均優于
    的頭像 發表于 03-08 15:37 ?5248次閱讀

    蘋果M3芯片比M2強多少

    蘋果M3芯片相較于M2芯片在多個方面都有所提升。
    的頭像 發表于 03-07 17:13 ?3238次閱讀
    主站蜘蛛池模板: 亚洲精品喷白浆在线观看| gv手机在线观看| 国产精品国产三级国产AV麻豆| 日韩无码在线| 国产探花在线精品一区二区| 亚洲视频在线观看免费| 美女快播第一网| 二次元美女扒开内裤喷水| 亚洲AV怡红院影院怡春院| 久久久久影视| 成人网站国产在线视频内射视频| 亚洲 自拍 欧洲 视频二区| 久久这里只有精品1| WWW国产精品内射老师| 无码AV熟妇素人内射V在线| 精品欧美一区二区三区久久久| AV72啪啪网站| 亚洲国产在线播放在线| 免费女人光着全身网站| 国产高清砖码区| 87.6在线收听| 亚洲AV中文字幕无码久久| 你的欲梦裸身在线播放| 国产亚洲精品V在线观看一 | 老师在讲桌下边h边讲课| 边做边爱免费视频播放| 亚洲视频一| 日韩高清一区二区三区不卡| 久艾草在线精品视频在线观看| 播色屋97超碰在人人| 伊人精品在线| 午夜在线观看免费完整直播网页| 内射一区二区精品视频在线观看| 国语自产拍在线视频普通话 | 迅雷成人下载| 欧美黄色第一页| 久久免费精彩视频| 国产精品嫩草免费视频| 99热在线视频| 中国xxx视频| 亚洲一区二区女搞男|