1. 程式人生 > >ROS通過話題釋出訂閱Image型別的視訊幀(python)

ROS通過話題釋出訂閱Image型別的視訊幀(python)

前言:

    前段時間,學習了YOLO在Python下的實現,而且經過在原始碼基礎上新增部分簡單函式,已經可以實現利用YOLO在Python下實現(1)檢測圖片中的物體,(2)檢測本地視訊,(3)呼叫攝像頭實時檢測。後來又需要利用Kinect實時檢測,所以要用的ROS進行各指令碼之間的通訊。而ROS Image是我寫程式時遇到的一個難點,在此記錄下來,以供後期查閱和網友參考。

本文中,主要是關於OpenCV格式圖片(或視訊幀)和ROS資料格式圖片(或視訊幀)之間的轉換。或者直白點書,通過ROS傳送圖片(Image)資料型別的訊息(message)。

【文中程式碼由於TAB縮排量可能會出現縮排問題,敬請諒解。】

本文其實是為下一篇博文“YOLO在ROS下的使用”打下基礎。

1、使用環境和平臺

ubuntu 14.04+ python2.7+opencv2.4

2、示例程式碼

其實,下述程式碼完全可以在一個指令碼中完成,而且不需要結合ROS;本文為了講述通過ROS傳送Image的方法,故而拆分開來。一個指令碼中,只進行影象捕捉;另一個訂閱之後,只進行影象現實。

(1)通過呼叫webcam捕捉視訊,然後經過ROS的Topic釋出出去:


#!/usr/bin/env python
#!coding=utf-8

#write by leo at 2018.04.26
#function: 
#1, Get live_video from the webcam.
#2, With ROS publish Image_info (to yolo and so on).
#3, Convert directly, don't need to save pic at local.

import rospy
from sensor_msgs.msg import Image
import cv2
import numpy as np
from cv_bridge import CvBridge, CvBridgeError
import sys


def webcamImagePub():
    # init ros_node
    rospy.init_node('webcam_puber', anonymous=True)
    # queue_size should be small in order to make it 'real_time'
    # or the node will pub the past_frame
    img_pub = rospy.Publisher('webcam/image_raw', Image, queue_size=2)
    rate = rospy.Rate(5) # 5hz

    # make a video_object and init the video object
    cap = cv2.VideoCapture(0)
    # define picture to_down' coefficient of ratio
    scaling_factor = 0.5
    # the 'CVBridge' is a python_class, must have a instance.
    # That means "cv2_to_imgmsg() must be called with CvBridge instance"
    bridge = CvBridge()

    if not cap.isOpened():
        sys.stdout.write("Webcam is not available !")
        return -1

    count = 0
    # loop until press 'esc' or 'q'
    while not rospy.is_shutdown():
        ret, frame = cap.read()
        # resize the frame
        if ret:
            count = count + 1
        else:
            rospy.loginfo("Capturing image failed.")
        if count == 2:
            count = 0
            frame = cv2.resize(frame,None,fx=scaling_factor,fy=scaling_factor,interpolation=cv2.INTER_AREA)
            msg = bridge.cv2_to_imgmsg(frame, encoding="bgr8")
            img_pub.publish(msg)
            print '** publishing webcam_frame ***'	
        rate.sleep()

if __name__ == '__main__':
    try:
        webcamImagePub()
    except rospy.ROSInterruptException:
        pass

(2)通過ROS訂閱Image型別的視訊幀,然後在視窗顯示出來:

#!/usr/bin/env python
#!coding=utf-8

#right code !
#write by leo at 2018.04.26
#function: 
#display the frame from another node.

import rospy
import numpy as np
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2

def callback(data):
    # define picture to_down' coefficient of ratio
    scaling_factor = 0.5
    global count,bridge
    count = count + 1
    if count == 1:
        count = 0
        cv_img = bridge.imgmsg_to_cv2(data, "bgr8")
        cv2.imshow("frame" , cv_img)
        cv2.waitKey(3)
    else:
        pass

def displayWebcam():
    rospy.init_node('webcam_display', anonymous=True)

    # make a video_object and init the video object
    global count,bridge
    count = 0
    bridge = CvBridge()
    rospy.Subscriber('webcam/image_raw', Image, callback)
    rospy.spin()

if __name__ == '__main__':
    displayWebcam()


3、程式碼解釋(函式講解)

從程式碼中可以看出:

from cv_bridge import CvBridge, CvBridgeError

匯入了一個模組下的兩個類,然後例項化一個物件:

    bridge = CvBridge()

接下來,呼叫該物件下的方法(函式):

            msg = bridge.cv2_to_imgmsg(frame, encoding="bgr8")
            img_pub.publish(msg)

釋出資訊的指令碼(上程式(1)中)裡,利用此方法將OpenCV型別的圖片轉化為ROS型別,然後通過話題釋出出去;

然後:

        cv_img = bridge.imgmsg_to_cv2(data, "bgr8")

訂閱話題的指令碼(上程式(2)中)裡,利用此方法將訂閱到的ROS型別的資料轉化為OpenCV格式的圖片,然後通過imshow函式在視窗顯示出影象。

PS:上邊的程式中,不論釋出還是訂閱,都可以跳過一些幀(通過改變count的值即可)。

4、參考連結

ROS初學者教程

OpnCV-Python教程:

Converting between ROS images and OpenCV images (Python)

https://answers.ros.org/question/226819/trouble-converting-cv2-to-imgmsg/

後記:

程式很簡單,在我自己的電腦上完全可以實現,如有問題歡迎批評指正!

(PS:下一篇介紹“用yolo結合ROS識別視訊的python程式碼實現”)

聯絡郵箱:[email protected]

相關推薦

ROS通過話題釋出訂閱Image型別視訊python

前言:    前段時間,學習了YOLO在Python下的實現,而且經過在原始碼基礎上新增部分簡單函式,已經可以實現利用YOLO在Python下實現(1)檢測圖片中的物體,(2)檢測本地視訊,(3)呼叫攝像頭實時檢測。後來又需要利用Kinect實時檢測,所以要用的ROS進行各指

ROS慣導資料釋出Python

一、背景   基本配置:ubuntu 16.04,ROS Kinetic   慣導型號:維特智慧 WT61C(六軸慣導)   維特智慧官方提供的參考程式是通過手動比較各個位元組來確定資料包/資料幀的,個人認為比較繁瑣,因此採用Python的re(正則表示式)和struct(位元組處理)模組簡化其資料匹配

ros系統下通過pyserial模組實現串列埠通訊Python

經過幾天的摸索終於實現了: 在ros系統下,訂閱Twist/cmd_vel 訊息,經過USB轉串列埠通訊,實現了通過燈帶實時反映小車(差速)執行狀態的功能。 通訊部分主要依賴pyserial模組的功能實現。 #!/usr/bin/env python #codi

ros+科大迅飛語音包+圖靈機器人通過圖靈進行語義理解

在vioce_system 包中的src資料夾下建立一個tuling_nlu.cpp檔案以下是tuling_nlu.cpp的內容(注意,需要把程式碼中的key改為自己建立機器人的key,把 curl_easy_setopt(pCurl, CURLOPT_URL, "http://openapi.tuling1

Oracle 通過undo塊查看事務信息

stmt efault 開始 bsp scn 目的 clas lte default 數據庫版本:Oracle 11.2.0.3 RAC實驗目的:通過undo塊查看Oracle事務信息實驗細節:1 開始一個事務SQL> select * from t1;

ROS:使用Qt Creator創建GUI程序

編譯錯誤 repl 搜索 AC test ica all Go 5.2.1 開發環境: Ubuntu14.04 ROS indigo version Qt Creator 3.0.1 based on Qt 5.2.1 步驟如下:(按照下面命令一步步來,親測可行) (一)安

python--通過xpath相對節點位置查找元素

xpath相對節點 元素查找 相對節點位置查找方法 父節點 兄弟節點 之前寫過相對父元素及下一個兄弟元素的方法。 這次補充一下xpath相對節點位置查找元素的所有方法。例子就不舉了,自己可以去練練。 xpath相對節點查找方法: 1、xpath(‘./ancestor::*‘)查找當前節點

spring cloud實戰與思考 微服務之間通過fiegn上傳一組文件

ets inf str ceo iter protected let pan ins 需求場景:   用戶調用微服務1的接口上傳一組圖片和對應的描述信息。微服務1處理後,再將這組圖片上傳給微服務2進行處理。各個微服務能區分開不同的圖片進行不同處理。   上一篇博客已經討

ROS慣導數據發布Python

ces pan rom 協方差 lis success ack __name__ http 一、背景   基本配置:ubuntu 16.04,ROS Kinetic   慣導型號:維特智能 WT61C(六軸慣導)   維特智能官方提供的參考程序是通過手動比較各個字節來確定數

ROS行為樹實現Python

一、行為樹   行為樹是一種控制結構,在相關論文資料中通常會與有限狀態機進行比較,並認為其比有限狀態機更適合複雜條件下的控制,目前多用於遊戲開發中(主要用於NPC行為),工業領域的應用研究正逐漸增多,主要面向移動機器人/AGV/無人駕駛等等。   相關論文資料可以參考:http://kth.diva-po

第五篇:基本資料型別及用法2

1 info={"k1":"v1","k2":"v2"} 2 v=info.setdefault("k3",123) 3 print(info,v) 4 #結果:{'k1': 'v1', 'k2': 'v2', 'k3': 123} 123   字典dict 1.字典的元素是鍵值

GoLang基礎資料型別--->字典map詳解

                     GoLang基礎資料型別--->字典(map)詳解                                             作者:尹正傑 版權宣告:原創作品,謝絕轉載!否則將追究法律責任。  

資料庫視訊總結——自動化

這是資料庫視訊第十三章所述——自動化,自動化為sql帶來很大的便利,更能給程式設計師帶來很大的便捷,首先就讓我們來了解一下自動化吧: SQL自動化概述 功能: 很多管理任務都可以設定成自動化來實現,主要包括以下方面: 1、Tsql語句 2、作業系統命令 3、指令碼語言

資料庫視訊總結——安全機制

安全機制 等級: 1、客戶機安全機制 2、網路傳輸的安全機制 3、例項級別安全機制 4、資料庫級別安全機制 5、物件級別安全機制 SQL身份驗證模式 Windows身份驗證模式:使用者不必重複提交登入名和密碼 混合模式: 可以同時使用Windows身份驗證和sql身

資料庫視訊總結——觸發器

概述 概念: 觸發器是一個在修改指定表中的資料時執行的儲存過程。經常通過建立觸發器來強制實現不同表中的邏輯相關資料的引用完整性或一致性。由於使用者不能繞過觸發器,所以可用它來強制實施複雜的業務規則,以此確保資料的完整性。 優點: 1、自動執行 2、可以通過資料庫中的相關表進行層

資料庫視訊總結——儲存過程

概述 概念:是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,儲存過程可包含程式流,邏輯以及對資料庫的查詢。 為什麼使用: 1、儲存過程與其他應用程式共享應用程式邏輯 2、具有安全性和所有權連線,以及可以附加到他們的證書 3、提供安全機制 4、允許模組化程式設計

資料庫視訊總結——遊標的使用

遊標概述 是什麼? 是一種資料訪問機制,它允許使用者訪問單獨的資料行,而不是對整個行集進行操作,使用者可以通過單獨處理每一行逐條收集資訊並對資料行集進行操作,使用者可以通過單獨處理每一行逐條收集資訊並對資料逐行進行操作,這樣可以降低系統開銷和潛在的阻隔情況 主要包括兩部分: 1、

資料庫視訊總結——T-sql語句

T-sql語句 分類: 1、 資料定義語言 2、 資料操縱語言 3、資料控制語言 其他常用型別: 1、事務管理語言 2、流程控制語言 3、附加的語言元素 常量與變數: 何如宣告變數 語法格式: DECLARE {@名稱 as 型別 |@ 給變數賦值可以使用S

資料庫視訊總結——增刪改查

查: 簡單的SELECT語句: 例如: select student_Name,student_Sex from student_Info 1、可以當做計算機來使用: select 12*13 as 計算結果 2、讓列名發生變化: Select 原來的列名 as 新的列

Date和String型別的轉換格式

一、Date轉String SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); String str=sdf.format(new Date());//格式為yyyy-MM-dd 二、String轉Date Simpl