ROS訂閱相機圖像消息,并將圖像保存為視頻幀

需求

需要編寫一個Python程序,訂閱電腦外接的深度相機發出的視頻消息,錄制視頻并逐幀保存為圖片到本地,用于采集制作數據集的圖片信息

運行環境

Ubuntu18.04 + ROS Melodic + Python2.7

Python程序

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridgeclass VideoRecorder:def __init__(self):self.bridge = CvBridge()self.image_sub = rospy.Subscriber('/camera/color/image_raw', Image, self.image_callback)self.frames = []self.recording = Falsedef image_callback(self, msg):try:cv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8")if self.recording:self.frames.append(cv_image)except Exception as e:print(e)def start_recording(self):self.frames = []self.recording = Truedef stop_recording(self):self.recording = Falseif self.frames:self.save_frames()def save_frames(self):for i, frame in enumerate(self.frames):filename = 'frame_{:04d}.jpg'.format(i)cv2.imwrite(filename, frame)print('Saved {} frames.'.format(len(self.frames)))if __name__ == '__main__':rospy.init_node('video_recorder_node', anonymous=True)recorder = VideoRecorder()try:while not rospy.is_shutdown():cmd = raw_input("Enter 'start' to begin recording or 'stop' to stop recording: ")if cmd == 'start':recorder.start_recording()elif cmd == 'stop':recorder.stop_recording()except rospy.ROSInterruptException:pass

程序解釋

這段代碼是一個用于ROS(Robot Operating System)環境下的Python程序,用于訂閱相機圖像消息并將圖像保存為視頻幀。

1. 首先,代碼聲明了使用Python解釋器,并設置了文件的編碼格式為utf-8。

2. 導入了所需的庫和模塊:
? ?- `rospy`:ROS的Python客戶端庫,用于創建ROS節點、發布和訂閱消息等。
? ?- `cv2`:OpenCV庫,用于圖像處理和計算機視覺任務。
? ?- `Image`:來自`sensor_msgs.msg`模塊的消息類型,用于傳輸圖像數據。
? ?- `CvBridge`:用于在ROS消息和OpenCV圖像之間進行轉換的工具類。

3. 定義了一個名為`VideoRecorder`的類,其中包含以下方法:
? ?- `__init__(self)`:類的初始化方法,在其中進行一些必要的設置。創建了一個`CvBridge`實例,用于ROS圖像和OpenCV圖像的轉換;訂閱了名為`/camera/color/image_raw`的相機圖像消息,并將回調函數設置為`image_callback`;初始化了用于存儲幀的列表`frames`,以及一個表示是否正在錄制的標志`recording`。
? ?- `image_callback(self, msg)`:圖像消息的回調函數。將ROS圖像消息轉換為OpenCV格式,如果正在錄制,則將幀添加到`frames`列表中。
? ?- `start_recording(self)`:開始錄制方法。清空`frames`列表,并將`recording`標志設置為True。
? ?- `stop_recording(self)`:停止錄制方法。將`recording`標志設置為False,并調用`save_frames`方法保存已錄制的幀。
? ?- `save_frames(self)`:保存幀方法。遍歷`frames`列表,將每幀圖像保存為JPEG文件,并在控制臺輸出保存的幀數。

4. 在`if __name__ == '__main__':`語句塊中:
? ?- 初始化了ROS節點,節點名為`video_recorder_node`,設置為匿名節點。
? ?- 創建了`VideoRecorder`類的實例`recorder`。
? ?- 在一個無限循環中,等待用戶輸入命令。如果輸入為`start`,則調用`start_recording`方法開始錄制;如果輸入為`stop`,則調用`stop_recording`方法停止錄制。
? ?- 通過捕獲`rospy.ROSInterruptException`異常來保證程序在收到終止信號時能夠正常退出。

總之,這段代碼通過ROS接收相機圖像消息,并根據用戶輸入的命令開始或停止錄制圖像幀,然后將錄制的幀保存為JPEG文件。

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

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

相關文章

Vue-day03 組件

1.組件機制 組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展HTML元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue的編譯器為它添加特殊功能。在有些情況下,組件也可以表現為用is特性進行了擴展的原生 HTML…

chatgpt和xmind結合起來幫你制作精美的思維導圖

介紹 chatgpt和xmind結合起來幫你制作精美的思維導圖。 1.輸出Markdown格式 2.xmind導入.md文件

web集群學習:nginx+keepalived實現負載均衡高可用性

目錄 項目架構 一,環境介紹 二,項目部署 在Web服務器上配置Web測試頁面 nginx負載均衡配置 配置Nginx_Master 通過vrrp_script實現對集群資源的監控(1>通過killall命令探測服務運行狀態) 通過vrrp_script實現對集群資源…

div輸入框的文字超過指定行數用省略號表示css

實現效果:超過四行用省略號表示 實現方法: .text{overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 4; // 自定義行數-webkit-box-orient: vertical; }

Go和Java實現外觀模式

Go和Java實現外觀模式 下面我們通過一個構造各種形狀的案例來說明外觀模式的使用。 1、外觀模式 外觀模式隱藏系統的復雜性,并向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬于結構型 模式,它向現有的系統添加一個接口&#xff…

【設計模式】代理模式

在代理模式(Proxy Pattern)中,一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式。 在代理模式中,我們創建具有現有對象的對象,以便向外界提供功能接口。 介紹 意圖:為其他對象提供一種代理以…

【面試問題】事務中執行了異步任務分發數據,由于事務未提交,導致異步任務無法執行

文章目錄 問題描述:解決辦法: 問題描述: OverrideTransactional(rollbackFor Exception.class)public ServiceResponse ctsqCallbackProcess(OaFlowRecord params) {// 查詢任務單數據// 更新任務單信息// 異步分發數據到CRMS系統}客戶數據分…

TX Text Control .NET Server for ASP.NET Crack

TX Text Control .NET Server for ASP.NET Crack TX Text Control.NET Server for ASP.NET是用于Web應用程序或服務的服務器端組件。它是一個完全可編程的ASP.NET文字處理引擎,提供了廣泛的文字處理功能。使用TX Text Control.NET Server,程序員可以開發…

react組件化開發詳解

React是一個流行的JavaScript庫,用于構建用戶界面,并且以組件化的方式進行開發。下面將詳解React組件化開發的概念和步驟: 組件化思維: 組件化開發是將復雜的用戶界面劃分為獨立、可重用的小部件(組件)。…

【833. 字符串中的查找與替換】

來源:力扣(LeetCode) 描述: 你會得到一個字符串 s (索引從 0 開始),你必須對它執行 k 個替換操作。替換操作以三個長度均為 k 的并行數組給出:indices, sources, targets。 要完成第 i 個替換操作: 檢查…

Spring事務傳播機制

hi ,大家好,繼續為大家帶來Spring事務傳播機制的相關知識 文章目錄 🤗1.事務傳播機制是什么🤗2.事務傳播機制作用🤗3.事務傳播機制 🤗1.事務傳播機制是什么 定義了多個包含了事務的?法,相互調?時,事務是…

C++教程 - How to C++系列專欄第3篇

關于專欄 這個專欄是優質的C教程專欄,如果你還沒看過第0篇,點擊C教程 - How to C系列專欄第0篇去第0篇 本專欄一致使用操作系統:macOS Ventura,代碼編輯器:CLion,C編譯器:Clang 感謝一路相伴…

[C++ 網絡協議編程] UDP協議

目錄 1. UDP和TCP的區別 2. UDP的工作原理 3. UDP存在數據邊界 4. UDP的I/O函數 4.1 sendto函數 4.2 recvfrom函數 4. 已連接(connected)UDP套接字和未連接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服務器端通信流程 5.2 客戶端通信流程 1. UDP和TCP的區別 主要…

從安全角度分析Angular本地存儲

隨著Web應用程序的不斷增長,前端開發人員慢慢意識到使用瀏覽器提供的本地存儲技術可以在不使用外部數據庫的情況下方便地保存應用程序的數據。Angular作為目前最流行的前端框架之一,也在其API中提供了許多本地存儲技術的支持。但是,在使用本地…

Electron教程_編程入門自學教程_菜鳥教程-免費教程分享

教程簡介 Electron是一個是使用JavaScript,HTML和CSS構建跨平臺的桌面應用程序框架。 Electron 通過將 Chromium 和 Node.js 合并到同一個運行時環境中,并將其打包為 Mac,Windows 和 Linux 系統下的應用來實現這一目的。 Electron入門教程 …

【深度學習】日常筆記16

可以將pd.DataFrame數據結構理解為類似于Excel中的表格。pd.DataFrame是pandas庫提供的一個二維數據結構,用于存儲和操作具有行和列的數據。它類似于Excel中的工作表,其中每一列可以是不同的數據類型(例如整數、浮點數、字符串等)…

關于安卓打包生成aar,jar實現(一)

關于安卓打包生成aar,jar方式 背景 在開發的過程中,主項目引入三方功能的方式有很多,主要是以下幾個方面: (1)直接引入源代碼module(優點:方便修改源碼,易于維護&#…

Spring_AOP

一、AOP簡介 AOP,Aspect Oriented Programming,面向切面編程,是對面向對象編程0OP的升華。OOP是縱向對一個事物的抽象,一個對象包括靜態的屬性信息,包括動態的方法信息等。而AOP是橫向的對不同事物的抽象,屬性與屬性、方法與方法、對象與對象…

算法訓練營題目day17

110. 平衡二叉樹 給定一個二叉樹,判斷它是否是高度平衡的二叉樹。 本題中,一棵高度平衡二叉樹定義為: 一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 。 func isBalanced(root *TreeNode) bool {h:getHeight(root)if h -1{r…

Vue 安裝開發者工具

1.下載開發者工具,下載地址:http://book.wiyp.top/App/Vue3開發者工具-谷歌/Vue3.crx 2.打開谷歌瀏覽器,點擊擴展,點擊管理擴展程序。 3.開啟開發者模式,將 Vue3 開發者工具文件拖拽到瀏覽器中進行安裝。 注&#xff…