国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenCV獲取網(wǎng)絡(luò)攝像頭實時視頻流

這篇具有很好參考價值的文章主要介紹了OpenCV獲取網(wǎng)絡(luò)攝像頭實時視頻流。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

參考文章:

  • [常用工具] OpenCV獲取網(wǎng)絡(luò)攝像頭實時視頻流_opencv網(wǎng)絡(luò)攝像頭
  • [常用工具] OpenCV獲取網(wǎng)絡(luò)攝像頭實時視頻流_opencv網(wǎng)絡(luò)攝像頭_落痕的寒假的博客-CSDN博客

方式一: 使用VideoCapture讀取視頻流

在使用OpenCv處理視頻時,無論是視頻文件還是攝像頭畫面,都要使用VideoCapture類來進行每一幀圖像的處理。當我們使用視頻文件作為參數(shù)時,OpenCv則打開視頻文件,進行每一幀畫面的讀取。當我們傳遞攝像機編號時,OpenCv則打開相機,實時讀取相機畫面。
獲取VideoCaptrue實例:

# 讀取視頻文件
cv2.VideoCapture('video.mp4')
# 打開攝像機
cv2.VideoCapture(0)

使用VideoCapture讀取??礡TSP流

RTSP流

在使用OpenCv進行計算機視覺處理時,我們很多時候需要連接外部相機,如??低?。監(jiān)控相機的常見視頻傳輸協(xié)議有:RTSP、RTMP(以RTSP為主)
RTSP與RTMP比較:

  • ??? RTSP:低時延,實現(xiàn)難度大,適合視頻聊天和視頻監(jiān)控
  • ??? RTMP:低時延,實現(xiàn)難度大,適合視頻聊天和視頻監(jiān)控

目前市面上的相機大多以RTSP流協(xié)議為主。
在讀取海康相機時,需要使用VideoCapture讀取RTSP流協(xié)議的內(nèi)容,而不是通過相機編號直接讀取。

"""
??迪鄼Crtsp格式:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
        username: 用戶名。例如admin。
        password: 密碼。例如12345。
        ip: 為設(shè)備IP。例如 192.0.0.64。
        port: 端口號默認為554,若為默認可不填寫。
        codec:有h264、MPEG-4、mpeg4這幾種。
        channel: 通道號,起始為1。例如通道1,則為ch1。
        subtype: 碼流類型,主碼流為main,輔碼流為sub。
"""

使用VideoCapture讀取RTSP流示例:

# 使用rtsp流打開相機
def open_camera(username: str, password: str, ip: str, port: int):
    """
    使用rtsp流打開相機
    rtsp格式:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
        username: 用戶名。例如admin。
        password: 密碼。例如12345。
        ip: 為設(shè)備IP。例如 192.0.0.64。
        port: 端口號默認為554,若為默認可不填寫。
        codec:有h264、MPEG-4、mpeg4這幾種。
        channel: 通道號,起始為1。例如通道1,則為ch1。
        subtype: 碼流類型,主碼流為main,輔碼流為sub。
    :return:相機是否打開,相機
    """
    try:
        # 使用rtsp流打開相機
        cam = cv2.VideoCapture(f'rtsp://{username}:{password}@{ip}:{port}/h264/ch1/main/av_stream')
        return True, cam

    except cv2.error:
        # 捕獲cv異常
        # 打開相機失敗
        return False, None

優(yōu)化后代碼:

import queue
import threading

import cv2


class CameraThread(threading.Thread):
    # 保存實例化相機,通過實例化相機操作相機
    camera = None
    # 保存每一幀從rtsp流中讀取到的畫面
    queue_image = queue.Queue(maxsize=10)

    # 線程體是否循環(huán)執(zhí)行標志
    flag_run = False

    # 相機線程調(diào)用函數(shù)
    def run(self) -> None:
        while self.flag_run:
            try:
                # 捕獲異常,避免讀取視頻操作因異常而退出
                # 相機實例存在,判斷相機是否打開
                if self.camera.is_opened():
                    # 相機已打開,讀取相機內(nèi)容
                    ret, frame = self.camera.read()
                    if not ret or frame is None:
                        # 讀取相機內(nèi)容失敗
                        break
                    if ret:
                        # 將內(nèi)容添加到隊列中
                        # 判斷隊列是否滿
                        if self.queue_image.full():
                            # 隊列滿,隊頭出隊
                            self.queue_image.get()
                            # 隊尾添加數(shù)據(jù)
                            self.queue_image.put(frame)
                        else:
                            # 隊尾添加數(shù)據(jù)
                            self.queue_image.put(frame)
            except cv2.error as error:
                # 捕獲cv異常
                # 因為子線程會一直調(diào)用該程序,可對捕獲到的異常不進行處理
                print(error)
                pass

            except Exception as error:
                # 捕獲Exception異常
                print(error)
                pass

    # setter:設(shè)置相機的camera對象
    def set_camera(self, camera):
        """
        設(shè)置相機的camera對象
        """
        # 設(shè)置相機的camera
        self.camera = camera

    # 獲取隊列中的RGB圖像
    def get_image(self):
        """
        獲取隊列中的RGB圖像
        :return: img: RGB圖像
        """
        # 讀取隊列中的圖片
        img = self.queue_image.get()
        # img為None,讀取失敗,隊列還未獲取到圖片
        while img is None:
            # 一直讀取圖片,直到讀取圖片成功
            img = self.queue_image.get()
        # 返回讀取到的內(nèi)容
        return img

    # 停止運行
    def run_stop(self):
        self.flag_run = False

    # 開始運行
    def run_start(self):
        self.flag_run = True


方式二: 所需要硬件及軟件環(huán)境:

python 3/OpenCV3.4 or C++11/OpenCV3.4

1 RTSP協(xié)議

RTSP (Real Time Streaming Protocol),是一種語法和操作類似 HTTP 協(xié)議,專門用于音頻和視頻的應(yīng)用層協(xié)議。 和 HTTP 類似,RTSP 也使用 URL 地址。同時我們也要了解到攝像機傳輸數(shù)據(jù)用的是碼流,高清網(wǎng)絡(luò)攝像機產(chǎn)品編碼器都會產(chǎn)生兩個編碼格式,稱為主碼流和子碼流。這就叫雙碼流技術(shù)。目的是用于解決監(jiān)控錄像的本地存儲和網(wǎng)絡(luò)傳輸?shù)膱D像的質(zhì)量問題。雙碼流能實現(xiàn)本地和遠程傳輸?shù)膬煞N不同的帶寬碼流需求,本地傳輸可以用主碼流,能獲得更清晰的存儲錄像,遠程傳輸就因為帶寬限制的原因,而使用子碼流來獲得流暢的圖像和錄像。通過RTSP協(xié)議傳輸不同的碼流,但是各大攝像頭廠家的RTSP協(xié)議地址不大一樣。通常你只要知道攝像頭IP地址,用戶名密碼就行了。

??档腞TSP協(xié)議地址如下:

rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
1) username  用戶名,常用 admin
2) password  密碼,常用 12345
3) ip        攝像頭IP,如 192.0.0.64
4) port      端口號,默認為 554,可以不寫
5) codec     視頻編碼模式,有 h264、MPEG-4、mpeg4 等,可以不寫
6) channel   通道號,起始為1,例如通道1,則為 ch1
7) subtype   碼流類型,主碼流為 main,輔碼流為 sub

大華的RTSP協(xié)議地址如下:?

rtsp://[username]:[password]@[ip]:[port]/cam/realmonitor?[channel=1]&[subtype=1] 
1) username、password、ip、port 同上
2) channel  通道號,起始為1,例如通道2,則為 channel=2
3) subtype  碼流類型,主碼流為0(即 subtype=0),輔碼流為1(即 subtype=1)

宇視的RTSP協(xié)議地址如下:

rtsp://{用戶名}:{密碼}@{ip}:{port}/video1/2/3,
1)video1/2/3表示主碼流,子碼流,三碼流(可以不用)
2)其他一樣

2 OpenCV中讀取網(wǎng)絡(luò)攝像頭

OpenCV讀取網(wǎng)絡(luò)攝像頭很簡單,直接用url設(shè)定rtsp地址,用VideoCapture讀取視頻就行了。但是RTSP有些許問題,所以在最后通過TCP傳輸協(xié)議上承載RTSP,保證穩(wěn)定性。就在rtsp地址后面加?tcp

    String url = "rtsp://admin:123456@114.114.114.114/ch1-s1?tcp";
    //???    //"rtsp://admin:123456@114.114.114.114/ch1-s1?tcp"
    //大華
    //“rtsp://admin:123456@114.114.114.114/cam/realmonitor?channel=1&subtype=1?tcp”
    //宇視
    //"rtsp://admin:123456@114.114.114.114/video1?tcp"
 
    VideoCapture cap(url);
    Mat frame;
    cap>>frame;

但是直接按上面的方法來讀取視頻,會出問題,通常都是error while decoding,讀不了碼流,也就是讀到一半就失敗。這個會導(dǎo)致程序異常。

這是由于OpenCV中FFMPEG Lib對在rtsp協(xié)議中的H264 vidos不支持或者OpenCV版本太低,所以處理辦法就是自己寫兩個不同的線程單獨去處理接收每一幀的圖像,然后另一個線程處理這每一幀的圖像。思路如下:使用隊列,基于pthread類采取先入先出策略,在一個線程中開始接收數(shù)據(jù),在另一個線程中處理逐幀數(shù)據(jù)。

這樣就可以實時獲得網(wǎng)絡(luò)攝像頭數(shù)據(jù)啦,獲得Mat格式圖像,具體代碼如下:

?C++代碼:
?

 
//并行
#include <thread>
//互斥訪問
#include <mutex>
 
 
//是否打開視頻
bool captureOpen = false;
//讀取的每張圖像
Mat image;
VideoCapture capture;
 
//網(wǎng)絡(luò)鏈接地址
String url = "rtsp://admin:123456@114.114.114.114/ch1-s1?tcp";
 
//加鎖器
mutex mtx;
//是否讀圖成功
bool imgready = false;
 
/**
 * @brief 讀圖
 * 
 * @return Mat 
 */
Mat captureThread()
{
	if (captureOpen == false || image.empty())
	{
		//打開圖像
		capture.open(url);
	}
	while (1)
	{
		//加鎖
		mtx.lock();
 
		capture >> image;
		//讀圖成功
		imgready = true;
 
		//解鎖
		mtx.unlock();
 
		return image;
	}
}
 
/**
 * @brief 處理函數(shù)
 * 
 * @param image 輸入圖像
 */
void processingThread(Mat image)
{
	//如果讀圖成功
	if (imgready)
	{
		//如果圖像為空
		if (image.empty())
		{
			return;
		}
		mtx.lock();
		//你的處理函數(shù)
        //your function
		mtx.unlock();
		return;
	}
}
 
 
int main()
{
	//讀圖
	thread t1(captureThread);
	t1.join();
	//已經(jīng)讀圖
	captureOpen = true;
	//并行處理
	thread t2(processingThread, image);
	t2.join();
 
	return 0;
}

Python代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-428111.html

import cv2
import queue
import time
import threading
q=queue.Queue()
 
def Receive():
    print("start Reveive")
    cap = cv2.VideoCapture("rtsp://admin:admin_123@172.0.0.0")
    ret, frame = cap.read()
    q.put(frame)
    while ret:
        ret, frame = cap.read()
        q.put(frame)
 
 
def Display():
     print("Start Displaying")
     while True:
         if q.empty() !=True:
            frame=q.get()
            cv2.imshow("frame1", frame)
         if cv2.waitKey(1) & 0xFF == ord('q'):
                break
 
if __name__=='__main__':
    p1=threading.Thread(target=Receive)
    p2 = threading.Thread(target=Display)
    p1.start()
    p2.start()

到了這里,關(guān)于OpenCV獲取網(wǎng)絡(luò)攝像頭實時視頻流的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 記錄對接海康威視攝像頭web端實時預(yù)覽:Linux+ffmpeg+nginx轉(zhuǎn)換RTSP視頻流(完整版實現(xiàn))

    ????????需求:web端實現(xiàn)??禂z像頭實時預(yù)覽效果 ????????由于市面上大部分網(wǎng)絡(luò)攝像頭都支持RTSP協(xié)議視頻流,web端一般無法直接使用RTSP實現(xiàn)視頻預(yù)覽,本篇使用ffmpeg對視頻流進行轉(zhuǎn)換,最終實現(xiàn)web端實時預(yù)覽。 ????????工具介紹:ffmpeg、nginx、vue ????????介

    2024年01月25日
    瀏覽(24)
  • WSL2通過OpenCV調(diào)用并展示本機攝像頭的RTSP視頻流

    WSL2通過OpenCV調(diào)用并展示本機攝像頭的RTSP視頻流

    本篇博客的由來如上圖哈哈,WSL2 相關(guān)安裝教程可以參考我之前的博客:Win11安裝WSL2和Nvidia驅(qū)動 更多文章歡迎來我的博客小站看呀,會有更多的技術(shù)細節(jié)~ ubuntu上請執(zhí)行 或者編譯安裝 如果報錯 Could NOT find OpenSSL ,安裝如下依賴即可解決 下載解壓 EasyDarwin Easydarwin是國內(nèi)團隊開

    2024年02月09日
    瀏覽(106)
  • Unity3d 獲取場景中攝像頭視頻流,實現(xiàn)直播效果(無需代碼)

    Unity3d 獲取場景中攝像頭視頻流,實現(xiàn)直播效果(無需代碼)

    下面是具體操作流程: ? 1. 搭建服務(wù)器,選用github 一個開源的 node.js服務(wù)器。 下載地址GitHub - iizukanao/node-rtsp-rtmp-server: RTSP/RTMP/HTTP hybrid server,點擊克隆,選擇ZIP下載。? 2. 下載node.js( 官網(wǎng)鏈接 Node.js) ? 選擇下載最新版本,并根據(jù)提示一步步安裝即可。 3.搭建服務(wù)器。 找到

    2023年04月08日
    瀏覽(27)
  • 網(wǎng)絡(luò)攝像頭-流媒體服務(wù)器-視頻流客戶端

    當涉及交通事件檢測算法和攝像頭視頻數(shù)據(jù)處理時,涉及的代碼案例可能會非常復(fù)雜,因為這涉及到多個組件和技術(shù)。以下是一個簡單的Python代碼示例,演示如何使用OpenCV庫捕獲攝像頭視頻流并進行實時車輛檢測,這是一個常見的交通事件檢測任務(wù)。請注意,這只是一個入門

    2024年02月09日
    瀏覽(27)
  • Qt推流程序自動生成網(wǎng)頁遠程查看實時視頻流(視頻文件/視頻流/攝像頭/桌面轉(zhuǎn)成流媒體rtmp+hls+webrtc)

    Qt推流程序自動生成網(wǎng)頁遠程查看實時視頻流(視頻文件/視頻流/攝像頭/桌面轉(zhuǎn)成流媒體rtmp+hls+webrtc)

    推流程序?qū)⒁曨l流推送到流媒體服務(wù)器后,此時就等待驗證拉流播放,一般可以選擇ffplay命令行播放或者vlc等播放器打開播放,也可以選擇網(wǎng)頁直接打開拉流地址播放,一般主流的瀏覽器都支持網(wǎng)頁直接播放hls/m3u8/webrtc類型的視頻流,而且推流的主要目的可能就是為了能夠在

    2024年02月05日
    瀏覽(104)
  • WSL2 ubuntu子系統(tǒng)OpenCV調(diào)用本機攝像頭的RTSP視頻流做開發(fā)測試

    WSL2 ubuntu子系統(tǒng)OpenCV調(diào)用本機攝像頭的RTSP視頻流做開發(fā)測試

    由于WSL2環(huán)境與主機系統(tǒng)隔離,訪問本機攝像頭是有限的,但是,可以通過第三方庫或網(wǎng)絡(luò)攝像頭來解決這個問題,本文將本地攝像頭通過rtsp流來給WSL2訪問。 詳見鏈接:https://blog.csdn.net/weixin_46119406/article/details/132271955?spm=1001.2014.3001.5501 Easydarwin是國內(nèi)團隊開發(fā)的開源流媒體框架

    2024年02月11日
    瀏覽(20)
  • YOLOV5-LITE實時目標檢測(onnxruntime部署+opencv獲取攝像頭+NCNN部署)python版本和C++版本

    使用yolov5-lite自帶的export.py導(dǎo)出onnx格式,圖像大小設(shè)置320,batch 1 之后可以使用 onnxsim對模型進一步簡化 onnxsim參考鏈接:onnxsim-讓導(dǎo)出的onnx模型更精簡_alex1801的博客-CSDN博客 這個版本的推理FPS能有11+FPS 這兩處換成自己的模型和訓(xùn)練的類別即可: ??? parser.add_argument(\\\'--modelpa

    2024年02月04日
    瀏覽(30)
  • 如何獲取當前攝像頭實時畫面(或說圖片)

    可以使用所在平臺提供的攝像頭接口或第三方庫來獲取當前攝像頭實時畫面(或圖片),具體實現(xiàn)方式可能因不同平臺和庫而異。以下是幾個常見平臺的示例方法: 在 Windows 平臺上,可以使用 DirectShow 或 Media Foundation API 獲取攝像頭實時畫面。 在 macOS 平臺上,可以使用 AVFo

    2024年02月10日
    瀏覽(17)
  • Java獲取實時攝像頭進行拍照(附源碼)

    Java是一種通用編程語言,可以用來開發(fā)各種類型的應(yīng)用程序,包括涉及圖像處理和相機操作的應(yīng)用程序。 ????????要在Java中獲取實時攝像頭進行拍照,通常會借助一些 第三方庫或API ,例如 OpenCV(Open Source Computer Vision Library) 或 Java Media Framework(JMF) 等。這些庫和API提

    2024年01月25日
    瀏覽(23)
  • Android實時獲取攝像頭畫面?zhèn)鬏斨罰C端

    最近在做一個PC端小應(yīng)用,需要獲取攝像頭畫面,但是電腦攝像頭像素太低,而且位置調(diào)整不方便,又不想為此單獨買個攝像頭。于是想起了之前淘汰掉的手機,成像質(zhì)量還是杠杠的,能不能把手機攝像頭連接到電腦上使用呢?經(jīng)過搜索,在網(wǎng)上找到了幾款這類應(yīng)用,但是都

    2024年02月12日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包