樹莓派學習:學習opencv+用opencv獲取樹莓派mjpg攝像頭視頻流

目錄

前提步驟

打開樹莓派攝像頭

查看是否有圖像,登錄游覽器打開樹莓派IP地址的8080端口

獲取mjpg的視頻流url

代碼

先設定好mjpg的視頻流的url

利用opencv庫中的v2.VideoCapture類讀取mjpg視頻流? ?cv2.VideoCapture()

檢查攝像頭是否成功打開,如果沒有,則打印錯誤消息并退出程序? ?cap.isOpened()

創建一個空的numpy數組? ??np.empty()

從視頻中讀取一幀圖像? ??cap.read()

在窗口中顯示圖像輸出? ??cv2.imshow

延時50毫秒,播放下一幀圖像? ??cv2.waitKey

全部代碼?

?將幀保存為圖像? ?cv2.imwrite()

?讀取圖像??cv2.imread()? ??cv2.cvtColor

釋放VideoCapture對象并關閉視頻文件? ?cap.release()


前提步驟

  1. 樹莓派可以用mjpg-streame庫開啟攝像頭
  2. 安裝好python

打開樹莓派攝像頭

  1. 進入mjpg庫
    cd mjpg-streamer/mjpg-streamer-experimental
  2. 啟動攝像頭腳本
    ./start.sh 

查看是否有圖像,登錄游覽器打開樹莓派IP地址的8080端口

http://xxx.xxx.xxx.xxx:8080

獲取mjpg的視頻流url

點開stream,復制當前的網址(url)

http://xxx.xxx.xxx.xxx:8080/?action=stream

代碼

先設定好mjpg的視頻流的url

ip_address = '172.20.10.14'
port_number = 8080
url = f'http://{ip_address}:{port_number}/?action=stream'

利用opencv庫中的v2.VideoCapture類讀取mjpg視頻流? ?cv2.VideoCapture()

  • 使用cv2.VideoCapture類的一個實例,可以通過傳入攝像頭設備ID或視頻文件路徑來連接攝像頭或讀取視頻文件。例如,cv2.VideoCapture(0)表示打開筆記本的內置攝像頭,cv2.VideoCapture("..\test.avi")表示打開指定路徑的視頻文件。
    cap = cv2.VideoCapture(f'http://{ip_address}:{port_number}/?action=stream')

檢查攝像頭是否成功打開,如果沒有,則打印錯誤消息并退出程序? ?cap.isOpened()

  • cap.isOpened()是OpenCV中VideoCapture類的一個函數,用于檢查視頻是否成功打開。如果返回值為True,表示視頻已經成功打開,反之則沒有成功打開。
    if not cap.isOpened():print("無法打開攝像頭")exit()

創建一個空的numpy數組? ??np.empty()

  • 得到一個240行,320列,3個通道(顏色通道)的數組,每個元素都是一個無符號8位整數(0-255)。
  • 該數組的形狀為(240, 320, 3),并且數據類型為np.uint8。
  • 用于存儲圖像數據。許多圖像格式(例如RGB)都有三個顏色通道,因此這個數組可以用于存儲圖像數據。
  • 在使用這個數組時,你可以像處理其他numpy數組一樣處理它。
    # 創建一個空的numpy數組output來存儲圖像數據
    output = np.empty((240, 320, 3), dtype=np.uint8)

從視頻中讀取一幀圖像? ??cap.read()

  • cap.read()?是 OpenCV 中?VideoCapture?類的函數
  • 該函數返回一個布爾值(True/False)以及一個幀圖像。如果幀讀取正確,則返回 True,否則返回 False。
  • ret?表示讀取幀是否正確,frame?則是當前幀的圖像。如果?ret?為 True,則可以處理?frame?圖像;如果?ret?為 False,則表明視頻已經讀取完畢。
    ret, frame = cap.read()

在窗口中顯示圖像輸出? ??cv2.imshow

  • cv2.imshow接受兩個參數:窗口的名稱和要顯示的圖像
  • 窗口名稱是'output',要顯示的圖像是變量output
    cv2.imshow('output', output)

延時50毫秒,播放下一幀圖像? ??cv2.waitKey

  • cv2.waitKey是 OpenCV 的一個函數,用于等待并處理鍵盤事件。
  • 50?是等待的毫秒數。這意味著如果用戶在 50 毫秒內沒有按任何鍵,則函數會返回當前活動的熱鍵。否則,如果有按鍵被按下,它會被立即返回
    cv2.waitKey(50)

全部代碼?

import cv2
import numpy as npip_address = '172.20.10.14'
port_number = 8080cap = cv2.VideoCapture(f'http://{ip_address}:{port_number}/?action=stream')if not cap.isOpened():print("無法打開攝像頭")exit()output = np.empty((240, 320, 3), dtype=np.uint8)while True:ret, output = cap.read()cv2.imshow('output', output)cv2.waitKey(50)

?將幀保存為圖像? ?cv2.imwrite()

  • cv2.imwrite()?是 OpenCV 庫中的一個函數
  • 用于將圖像寫入文件
  • 兩個參數:輸出文件名和要寫入的圖像。
  • 使用?cv2.imwrite()?將?img?寫入名為 "image.jpg" 的文件中。
    cv2.imwrite("capture.jpg", output)  

?讀取圖像??cv2.imread()? ??cv2.cvtColor

  • cv2.imread()?是 OpenCV 庫中的一個函數
  • 用于讀取圖像文件
  • 一個參數,即要讀取的圖像文件的路徑
  • 如果圖像文件不存在或無法讀取,cv2.imread()?將返回 None。如果圖像文件存在并成功讀取,則將返回一個 NumPy 數組,其中包含圖像的像素值。
  • cv2.imread()?函數默認使用 BGR 顏色空間,而非 RGB 顏色空間。
  • 如果需要在處理圖像時使用 RGB 顏色空間,可以使用?cv2.cvtColor()?函數將 BGR 圖像轉換為 RGB 圖像。
img = cv2.imread('input.jpg')  #如果是BGR圖像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  • img_rgb?是通過將?img?從 BGR 顏色空間轉換為 RGB 顏色空間得到的。在 OpenCV 中,圖像的默認格式是 BGR,而大多數其他圖像處理庫(如 Python 的 PIL 或 matplotlib)使用 RGB 顏色空間。因此,如果你需要在這些庫中處理 OpenCV 圖像,可能需要進行顏色空間的轉換。
  • mg_rgb?通常指的是 RGB 圖像,而?img?通常指的是 BGR 圖像。雖然它們在數值上是一樣的(因為它們表示的是同一幅圖像的像素值),但在處理圖像時,使用哪個變量取決于你的需求。例如,如果你需要將圖像顯示在 matplotlib 中,你可能需要使用?img_rgb。如果你需要處理圖像的顏色通道順序,你可能需要使用?img
  • 總的來說,雖然?img_rgb?和?img?在數值上相同,但它們的使用和語義上有一些區別。

釋放VideoCapture對象并關閉視頻文件? ?cap.release()

  • cap.release()是OpenCV庫中的一個函數
  • 用于釋放VideoCapture對象并關閉視頻文件
  • 使用cv2.VideoCapture()創建一個VideoCapture對象后,這個對象會占用視頻文件的相關資源,比如文件句柄、內存等。當你完成視頻的讀取后,應該調用cap.release()釋放這些資源,以避免資源泄漏和占用。
    # 釋放VideoCapture對象并關閉視頻文件  
    cap.release()
  • ?在調用cap.release()后,你不能再使用cap對象,否則會拋出異常。如果你需要再次讀取視頻文件,應該重新創建一個新的VideoCapture對象。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209477.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209477.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

scikit-learn實現線性回歸

要學習scikit-learn,我們必須要到scikit-clearn的官網中去查看公式和原理 scikit-learn 官網 scikit-learn 中文社區 進入官網一以后我們找到回歸,然后再有監督學習中找到線性模型 scikit-learn實現簡單的線性回歸 公式: L2范數是指向量中每個元素的平…

Java+Swing: 主界面的窗體 整理8

主界面的寫法跟之前登錄界面的窗體寫法大致相同,在主界面中主要是窗體的大小的設置 package com.student_view;import com.utils.DimensionUtil; import sun.applet.Main;import javax.swing.*; import java.awt.*; import java.net.URL;/*** Author:xie…

C# --線程的進化史

1.C# 線程的進化史可以追溯到 .NET Framework 的早期版本和 C# 語言的發展過程 Thread 類(.NET Framework 1.0):最初,C# 中使用 Thread 類來創建和管理線程。通過實例化 Thread 類并調用其 Start 方法,可以在應用程序…

全面覆蓋,無所不包:C++ 編程必備指南 | 開源日報 No.99

fffaraz/awesome-cpp Stars: 51.0k License: MIT 這個項目是一個精心策劃的 C(或者 C) 框架、庫、資源和其他有趣東西的列表。它收集了各種標準庫,如 STL 容器和算法;不同領域的框架,比如人工智能、異步事件循環等;以及一系列功…

【人工智能Ⅰ】實驗7:K-means聚類實驗

實驗7 K-means聚類實驗 一、實驗目的 學習K-means算法基本原理,實現Iris數據聚類。 二、實驗內容 應用K-means算法對iris數據集進行聚類。 三、實驗結果及分析 0:輸出數據集的基本信息 參考代碼在main函數中首先打印了數據、特征名字、目標值、目標…

【上海大學數字邏輯實驗報告】四、組合電路(三)

一、 實驗目的 掌握多路選擇器74LS151的原理。掌握譯碼器74LS138的原理。學會在Quartus II上使用多路選擇74LS151設計電路。學會在Quartus II上使用譯碼器74LS138設計電路。 二、 實驗原理 多路選擇器又稱數據選擇器或多路開關,它是一種多路輸入單路輸出的組合邏…

HHDESK右鍵管理簡介

在HHDESK管理文件,除了基本的打開、刪除、復制、粘貼、重命名外,還有多種便捷編輯方式。 可以分別以下列模式打開文檔: 文本模式即是以文本編輯器打開文檔。 1 二進制模式 可進行二進制編輯。 2 JSON模式 可對JSON文件進行直觀的解析…

機器學習中的特征工程

1 特征工程概述 特征工程是機器學習中的一個關鍵步驟,在機器學習領域中占有非常重要的地位,是機器學習中不可或缺的一部分,下圖展示了一個常規的機器學習流程: 特征工程涉及從原始數據中提取、選擇和轉換特征,以改善模…

Lombok 處理異常@SneakyThrows 注解

文章目錄 注解的介紹具體示例 注解的介紹 SneakyThrows 是 Lombok 框架提供的一個注解,它可以用于在方法中拋出受檢異常時,不用顯式地對異常進行處理,而是將異常包裝成 RuntimeException 拋出 使用 SneakyThrows 注解后,編譯器會…

“輕松管理文件,一鍵導出表格,讓您的歸檔工作井井有條“

在忙碌的工作中,我們經常會被大量的文件和數據所困擾。如何有效地管理和整理這些資料,成為了一個讓人頭疼的問題。今天,我們向您介紹一款強大的文件管理工具——一鍵導出表格,幫助您輕松解決這個問題。 第一步,首先我們…

區塊鏈實驗室(30) - 區塊鏈期刊:Distributed Ledger Technologies: Research and Practice

區塊鏈涉及多學科及技術,眾多期刊接收區塊鏈文章。Distributed Ledger Technologies: Research and Practice是ACM出版集團的一本期刊。 Distributed Ledger Technologies: Research and Practice創刊歷史很短,始于2022年,出版期數也不多。 載…

力扣面試150題 | 多數元素

力扣面試150題 | 多數元素 題目描述解題思路代碼實現 題目描述 給定一個大小為 n 的數組 nums ,返回其中的多數元素。多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。 你可以假設數組是非空的,并且給定的數組總是存在多數元素。 示…

Leetcode 劍指 Offer II 056. 兩數之和 IV - 輸入二叉搜索樹

題目難度: 簡單 原題鏈接 今天繼續更新 Leetcode 的劍指 Offer(專項突擊版)系列, 大家在公眾號 算法精選 里回復 劍指offer2 就能看到該系列當前連載的所有文章了, 記得關注哦~ 題目描述 給定一個二叉搜索樹的 根節點 root 和一個整數 k , 請判斷該二叉…

Java 使用oshi獲取當前服務器狀態cpu、內存、存儲等核心信息

文章目錄 簡介相關資料maven依賴oshi-官方示例獲取CUP信息代碼獲取內存信息獲取磁盤信息 簡介 OSHI 是基于 JNA 的(本地)操作系統和硬件信息庫。它不需要安裝任何其他額外的本地庫,旨在提供一種跨平臺的實現來檢索系統信息,例如操…

[ROS2] --- action

1 action介紹 ROS通信機制也會被常常用到——那就是動作。從這個名字上就可以很好理解這個概念的含義,這種通信機制的目的就是便于對機器人某一完整行為的流程進行管理。 1.1 客戶端/服務器模型 動作和服務類似,使用的也是客戶端和服務器模型&#xf…

數據結構中處理散列沖突的四種方法

1 開放定址法 1.1 定義 開放定址法就是一旦發生了沖突,就去尋找下一個空的散列地址 1.2 要求 只要散列表足夠大 空的散列地址總能找到,并將記錄存入 1.3 線性探測法 使用該公式用于解決沖突的開放定址法稱為線性探測法 對于線性探測法&#xff0c…

【異常】SpringBoot3.2.0 Description: Failed to configure a DataSource: ‘url‘ att

mybatisPlus 多數據源導致 異常 Description:Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the following:If you want an embed…

通過kubeadm方式安裝k8s

虛擬機最少是 2 core,master內存最小3G,node內存最小2G. 要求的Docker版本是18.03,如果不是安裝的docker ce,版本是過舊的,可以選擇刪除后重新安裝; 也可以重新創建一個虛擬機執行以下命令。 簡單方法&am…

線性代數基礎【1】行列式

第一節 行列式的基本概念和性質 一、基本概念 ①逆序 1,2和2,1是一對逆序 ②逆序數 1,2,3,5,4的逆序數為1;1,3,2,5,4逆序數為4; ③行列式 ④余子數和代數余子數 行列式挖掉一個數(例如aij),將原行列式去掉i行j列的行列式M,則M為余子數,代數余子數記為Aij,如果(ij)為偶數…

云LIS實驗室信息管理系統源碼——實驗室信息管理解決方案

云LIS(Cloud Laboratory Information System)是一種為區域醫療提供臨床實驗室信息服務的計算機應用程序,其主要功能是協助區域內所有臨床實驗室相互協調并完成日常檢驗工作,對區域內的檢驗數據進行集中管理和共享,通過…