1. 程式人生 > >譯:ROS和Openv之間的影象轉換(Python)

譯: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

請注意,mono8和bgr8是大多數OpenCV函式預期的兩種影象編碼。

3.將OpenCV影象轉換為ROS影象訊息

將cv :: Mat轉換為ROS影象訊息,CvBridge提供以下功能:

image_message = cv2_to_imgmsg(cv_image, encoding="passthrough")

這種情況下,“編碼”的使用稍微複雜一些。 它和以前一樣,參考cv :: Mat。 但是,cv2_to_imgmsg()不會為您執行任何轉換(而是使用CvtColorConvertScale)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釋出影象。

相關推薦

ROSOpenv之間影象轉換Python

描述:本教程介紹如何使用cv_bridge將ROS影象轉換為OpenCV影象,反之亦然,從而實現ROS和OpenCV的互動。 包括一個示例節點,可用作您自己節點的模板。1.概念    ROS以其自己的sensor_msgs/Image訊息格式釋出影象,但許多使用者會希望將影象

UTF8GBK之間相互轉換python指令碼

import codecs def ReadFile(filePath,encoding=""):     with codecs.open(filePath,"r",encoding) as f:         return f.read() def WriteFil

利用JAXB實現xmlbean之間轉換

JAXB能夠使用Jackson對JAXB註解的支援實現(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,這樣一來可以更好的標誌可以轉換為JSON物件的JAVA類。 JDK中JAXB相關的重要Class和Interfac

利用Digester實現xmlbean之間轉換

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, 請教XMLstruct之間相互轉換的問題

現在配置基本都像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進行jsonobject之間轉換並解決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中longLong與intInteger之間轉換

轉化 string long tar str 基礎數據類型 ava detail 參考 一、將long型轉化為int型,這裏的long型是基礎類型: long a = 10; int b = (int)a; 二、將Long型轉換為int型,這裏

TCP/IPUDP之間的區別轉載

有用 可靠性 client 之間 可靠的 col 因此 用戶數據報 ack 在分析兩者之間的區別之前,我們先搞清楚這兩者的關系, TCP/IP協議簇 是一種網絡控制協議,簡單點說就是一種網絡協議,我們網絡中的計算機就是通過這套協議簇來進行數據通信的。這套協議簇裏面包含了很

C# 16進制與字符串、字節數組之間轉換

bool sub ber con tostring mat cep 字節數組 log 1 /// <summary> 2 /// 字符串轉16進制字節數組 3 /// </summary> 4 /// <param

DateString型別的轉換格式

一、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);  //