譯:ROS和Openv之間的影象轉換(Python)
描述:本教程介紹如何使用cv_bridge將ROS影象轉換為OpenCV影象,反之亦然,從而實現ROS和OpenCV的互動。 包括一個示例節點,可用作您自己節點的模板。
1.概念
ROS以其自己的sensor_msgs/Image訊息格式釋出影象,但許多使用者會希望將影象與OpenCV結合使用。 CvBridge是一個ROS庫,提供ROS和OpenCV之間的介面。
在本教程中,您將學習如何編寫一個節點,這個節點可以通過使用CvBridge將ROS影象轉換為OpenCV cv::Matt格式。同時,您還將學習如何將OpenCV影象轉換為ROS格式,以便通過ROS釋出影象訊息。
2.將ROS影象訊息轉換為OpenCV影象
要將ROS影象訊息轉換為cv :: Mat,模組cv_bridge.CvBridge提供以下功能:
cv_image = bridge.imgmsg_to_cv2(image_message, desired_encoding="passthrough")
輸入是影象訊息,以及可選的編碼。 編碼引用目標cv :: Mat影象。如果給出預設值“passthrough”,則目標影象編碼將與影象訊息編碼相同。 影象編碼可以是以下任何一種OpenCV影象編碼:
- 8UC[1-4]
- 8SC[1-4]
- 16UC[1-4]
- 16SC[1-4]
- 32SC[1-4]
- 32FC[1-4]
- 64FC[1-4]
對於流行的影象編碼,CvBridge將根據需要選擇進行顏色或畫素深度轉換。
mono8: CV_8UC1, grayscale image
mono16: CV_16UC1, 16-bit grayscale image
bgr8: CV_8UC3, color image with blue-green-red color order
rgb8: CV_8UC3, color image with red-green-blue color order
bgra8: CV_8UC4, BGR color image with an alpha channel
rgba8: CV_8UC4, RGB color image with an alpha channel
3.將OpenCV影象轉換為ROS影象訊息
將cv :: Mat轉換為ROS影象訊息,CvBridge提供以下功能:
image_message = cv2_to_imgmsg(cv_image, encoding="passthrough")
這種情況下,“編碼”的使用稍微複雜一些。 它和以前一樣,參考cv :: Mat。 但是,cv2_to_imgmsg()不會為您執行任何轉換(而是使用CvtColor和ConvertScale)ROS影象訊息必須始終具有與cv :: Mat相同數量的通道和畫素深度。 然而,上面特別常用的影象格式(bgr8,rgb8等)會將資訊插入到有關頻道排序的影象訊息中。 這樣,未來的消費者就會知道他們收到的影象是RGB還是BGR。
4.一個ROS節點的例子
這裡是一個監聽ROS影象訊息主題的節點,將影象轉換為cv :: Mat,並在其上繪製一個圓圈並使用OpenCV顯示影象。 該影象然後通過ROS重新發布。
在你的manifest(或者當您使用roscreate-pkg時),新增以下依賴項:
sensor_msgs
opencv2
cv_bridge
rospy
std_msgs
#!/usr/bin/env python
from __future__ import print_function
import roslib
roslib.load_manifest('my_package')
import sys
import rospy
import cv2
from std_msgs.msg import String
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
class image_converter:
def __init__(self):
self.image_pub = rospy.Publisher("image_topic_2",Image)
self.bridge = CvBridge()
self.image_sub = rospy.Subscriber("image_topic",Image,self.callback)
def callback(self,data):
try:
cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
except CvBridgeError as e:
print(e)
(rows,cols,channels) = cv_image.shape
if cols > 60 and rows > 60 :
cv2.circle(cv_image, (50,50), 10, 255)
cv2.imshow("Image window", cv_image)
cv2.waitKey(3)
try:
self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
except CvBridgeError as e:
print(e)
def main(args):
ic = image_converter()
rospy.init_node('image_converter', anonymous=True)
try:
rospy.spin()
except KeyboardInterrupt:
print("Shutting down")
cv2.destroyAllWindows()
if __name__ == '__main__':
main(sys.argv)
不要忘記chmod + x你的檔案。
import sys
所有的OpenCV都包含在匯入cv中。 在manifest中,為opencv2和cv_bridge新增依賴項。
from std_msgs.msg import String
CvBridge也存在於cv_bridge。
cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
except CvBridgeError as e:
print(e)
將影象訊息指標轉換為OpenCV訊息只需要呼叫函式imgmsg_to_cv2()。 這需要影象訊息以及目標OpenCV影象的編碼。您應該始終將您的呼叫包裝到imgmsg_to_cv2()以捕獲轉換錯誤。
要執行該節點,您需要一個影象流。 執行相機或播放包檔案以生成影象流。 現在,您可以執行此節點,將影象流主題重新對映到“image_topic”。 例如,“/ camera / rgb / image_color”。
如果您已成功將影象轉換為OpenCV格式,您將看到名為“image window”,並有圓圈的HighGui視窗
self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
except CvBridgeError as e:
print(e)
使用編碼為“bgr8”的cv2_to_imgmsg()將編輯後的影象轉換回ROS影象訊息格式,以便將來的訂戶知道顏色順序。
您可以使用rostopic或通過使用image_view.檢視影象來檢視節點是否正確地通過ros釋出影象。
相關推薦
譯:ROS和Openv之間的影象轉換(Python)
描述:本教程介紹如何使用cv_bridge將ROS影象轉換為OpenCV影象,反之亦然,從而實現ROS和OpenCV的互動。 包括一個示例節點,可用作您自己節點的模板。1.概念 ROS以其自己的sensor_msgs/Image訊息格式釋出影象,但許多使用者會希望將影象
UTF8和GBK之間相互轉換(python指令碼)
import codecs def ReadFile(filePath,encoding=""): with codecs.open(filePath,"r",encoding) as f: return f.read() def WriteFil
利用JAXB實現xml和bean之間的轉換(一)
JAXB能夠使用Jackson對JAXB註解的支援實現(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,這樣一來可以更好的標誌可以轉換為JSON物件的JAVA類。 JDK中JAXB相關的重要Class和Interfac
利用Digester實現xml和bean之間的轉換(二)
Digester框架屬於Jakarta Commons,它以規則和模式為基礎處理XML文件。與SAX和DOM之類的標準API相比,Digester不涉及太多的細節問題,非常適合於對XML文件進行簡單的處理。 比如要解析如下的xml檔案 <pers
ROS影象和OpenCV影象之間的轉換(C ++)
1.概念 ROS以自己的sensor_msgs / Image訊息格式傳遞影象,但許多使用者希望將影象與OpenCV結合使用。 CvBridge是一個ROS庫,提供ROS和OpenCV之間的介面。 在本教程中,您將學習如何編寫使用CvBridge將ROS影象轉換為O
android小知識:ArrayList和陣列之間的轉換
List----->陣列開發中不免碰到List與陣列型別之間的相互轉換,舉一個簡單的例子: package test.test1; import java.util.ArrayList; import java.util.List; public class Test { /** * @param ar
SOS, 請教:XML和struct之間相互轉換的問題
現在配置基本都像XML方向轉變。那麼, 1、以前是按struct大小直接寫入檔案的,反過來,就直接按struct大小讀入struct就可以了,簡潔; 2、轉XML後,涉及到struct到xml節點之間的相互轉換,這個非常多的重複程式碼。而且太繁瑣,舉個例子,假設一個配置struct有100個欄位,
StringBuffer 和String的區別,以及二者之間的轉換(重要)
在編寫驗證碼的時候,用到 session.setAttribute("piccode",stringBuffer);後面要拿出來,要變成string型別。 要用String piccode = request.getSession().getAttribute("piccode")
FFMPEG 實現 YUV,RGB各種影象原始資料之間的轉換(swscale)
FFMPEG中的swscale提供了視訊原始資料(YUV420,YUV422,YUV444,RGB24...)之間的轉換,解析度變換等操作,使用起來十分方便,在這裡記錄一下它的用法。 swscale主要用於在2個AVFrame之間進行轉換。 下面來看一個視訊解碼的簡單例子,
Java 用Jackson進行json和object之間的轉換(並解決json中存在新增多餘欄位的問題)
1、新增jackson庫 如果是maven工程,需要在pom.xml中新增jackson的依賴: <dependency> <groupId>com.fasterxml.jackson.core</groupId>
影象型別、MATLAB資料型別,以及型別之間的轉換(二)
上篇中我們根據需要將影象分為4種類型,其中每種影象的表示或多或少都牽扯到不同的資料型別,大致如下: 影象型別 使用到的資料型別 灰度影象 畫素值為uint8,uint16,歸一化double等型別 二值影象 畫素值為lo
java 核心編程——IO流之字符流和字節流相互轉換(四)
red amr nbsp main 字符輸入 txt not stat args 1.為什麽字符流和字節流需要轉換? 這是因為有一些時候系統給你提供的只有字節流,比如說System.in標準輸入流。就是字節流。你想從他那裏得到用戶在鍵盤上的輸入,只能是以轉換流將它轉換為
Java中long(Long)與int(Integer)之間的轉換(轉)
轉化 string long tar str 基礎數據類型 ava detail 參考 一、將long型轉化為int型,這裏的long型是基礎類型: long a = 10; int b = (int)a; 二、將Long型轉換為int型,這裏
TCP/IP和UDP之間的區別(轉載)
有用 可靠性 client 之間 可靠的 col 因此 用戶數據報 ack 在分析兩者之間的區別之前,我們先搞清楚這兩者的關系, TCP/IP協議簇 是一種網絡控制協議,簡單點說就是一種網絡協議,我們網絡中的計算機就是通過這套協議簇來進行數據通信的。這套協議簇裏面包含了很
C# 16進制與字符串、字節數組之間的轉換(二)
bool sub ber con tostring mat cep 字節數組 log 1 /// <summary> 2 /// 字符串轉16進制字節數組 3 /// </summary> 4 /// <param
Date和String型別的轉換(格式)
一、Date轉String SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); String str=sdf.format(new Date());//格式為yyyy-MM-dd 二、String轉Date Simpl
C# 16進位制與字串、位元組陣列之間的轉換(轉)
1.請問c#中如何將十進位制數的字串轉化成十六進位制數的字串 //十進位制轉二進位制 Console.WriteLine("十進位制166的二進位制表示: "+Convert.ToString(166, 2)); //十進位制轉八進位制 Console.WriteLine("十進位制166的八進位
C 語言---數字與中文大寫數字之間的轉換(實用)
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i=0,count=0; //計數器 char
進位制之間的轉換(1)——十進位制向二/八/十六進位制的轉換
1.十進位制轉換為十六/八進位制 #define _CRT_SECURE_NO_WARNINGS //為解決scanf函式不安全的警告問題 #include<stdio.h> #include<stdlib.h> int main() { int i; //基本變
javascript時間戳和日期字串相互轉換(json)
轉載:http://www.cnblogs.com/yjf512/p/3796229.html json格式轉換 data為json返回物件 var date = new Date();date.setTime(data[i].insert_time.time); //