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

2.ROS機(jī)器視覺——ROS圖像(imgmsg)與opencv(cv2)對(duì)接

這篇具有很好參考價(jià)值的文章主要介紹了2.ROS機(jī)器視覺——ROS圖像(imgmsg)與opencv(cv2)對(duì)接。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

參考:古月學(xué)院和ROS機(jī)器人開發(fā)實(shí)踐

目標(biāo):實(shí)現(xiàn)ROS系統(tǒng)讀取攝像頭的圖像,ROS讀取的圖像數(shù)據(jù)轉(zhuǎn)化為opencv中的圖像,opencv對(duì)接受的圖像進(jìn)行處理,最后返回給ROS系統(tǒng)可視化輸出。

安裝opencv庫(kù)與相關(guān)的接口包

由于我用的ROS-Melodic版本,其中roscore只能在python2中執(zhí)行,而視覺部分要在python3中執(zhí)行,故將包安裝在兩個(gè)python中。(重要操作,因?yàn)槠渌嘘P(guān)于視覺的庫(kù),比如pytorch,是需要python3的,如果默認(rèn)環(huán)境是python環(huán)境是python2,沒把相應(yīng)的包安裝進(jìn)python3,會(huì)報(bào)缺失依賴的錯(cuò)。)

(1條消息) ROS修改:ubuntu系統(tǒng)更改默認(rèn)python版本(重要操作)_機(jī)械專業(yè)的計(jì)算機(jī)小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127191057?spm=1001.2014.3001.5501具體切換python版本方法在如上文章中。

sudo apt-get install ros-melodic-vision-opencv libopencv-dev ros-melodic-vision-opencv python-opencv

下載好相應(yīng)的源碼,放在工作空間的src中

guyueclass/planning&perception/robot_vision_beginner/robot_vision at main · guyuehome/guyueclass (github.com)https://github.com/guyuehome/guyueclass/tree/main/planning%26perception/robot_vision_beginner/robot_vision這個(gè)古月學(xué)院和ROS機(jī)器人開發(fā)實(shí)踐的源碼。

運(yùn)行的代碼

首先是usb_cam.launch

imgmsg_to_cv2,ROS,ros

<launch>

  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>

</launch>

?創(chuàng)建一個(gè)節(jié)點(diǎn),之后作為發(fā)布者,攝像頭的圖像信息,其中參數(shù)必須和攝像頭參數(shù)對(duì)應(yīng),要不會(huì)報(bào)錯(cuò)。

其次是cv_bridge_test.py

imgmsg_to_cv2,ROS,ros

?其中要修改python版本聲明,因?yàn)閙olodic版本默認(rèn)python版本是python2,但是現(xiàn)在視覺算法都是用的python3,在python3中才有實(shí)際意義。

修改了聲明:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

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

class image_converter:
    def __init__(self):    
        # 創(chuàng)建cv_bridge,聲明圖像的發(fā)布者和訂閱者
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)

    def callback(self,data):
        # 使用cv_bridge將ROS的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的圖像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print(e)

        # 在opencv的顯示窗口中繪制一個(gè)圓,作為標(biāo)記
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)

        # 顯示Opencv格式的圖像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

        # 再將opencv格式額數(shù)據(jù)轉(zhuǎn)換成ros image格式的數(shù)據(jù)發(fā)布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print(e)

if __name__ == '__main__':
    try:
        # 初始化ros節(jié)點(diǎn)
        rospy.init_node("cv_bridge_test")
        rospy.loginfo("Starting cv_bridge_test node")
        image_converter()
        rospy.spin()
    except KeyboardInterrupt:
        print("Shutting down cv_bridge_test node.")
        cv2.destroyAllWindows()

根據(jù)最后通過rqt_graph生成的計(jì)算圖來看,/usb_cam為通過launch文件生成的發(fā)布者節(jié)點(diǎn),而/cv_bridge_test為if __name__ == '__main__':下初始化的節(jié)點(diǎn)cv_bridge_test作為訂閱者。imgmsg_to_cv2,ROS,ros

import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image

cv2——opencv庫(kù)

cv_bridge——通過調(diào)用此函數(shù)中的api進(jìn)行ROS圖像(imgmsg)與opencv圖像(cv2)的轉(zhuǎn)換。

sensor_msgs.msg——傳感器數(shù)據(jù)類型,其中此處導(dǎo)入的是Image圖像的數(shù)據(jù)類型。

        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)

根據(jù)上面的計(jì)算圖:

首先是訂閱者,作用是接收usb_cam發(fā)布的圖像原始信息,話題名/usb_cam/image_raw,話題名這里不能改的,因?yàn)樵谠掝}通信中,發(fā)布者和訂閱者的話題名必須一樣才能進(jìn)行通信。

其次是發(fā)布者,注意這個(gè)發(fā)布者并不是和上面的訂閱者成套,因?yàn)槎咴掝}名不同,意味著二者是無法進(jìn)行話題通信的。其中發(fā)布者發(fā)布的話題cv_bridge_image,數(shù)據(jù)類型為Image,可以通過rqt_image_view命令觀察到。

self.bridge = CvBridge()定義一個(gè)句柄,之后可以靈活調(diào)用相關(guān)轉(zhuǎn)換接口。

    def callback(self,data):
        # 使用cv_bridge將ROS的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的圖像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print(e)

        # 在opencv的顯示窗口中繪制一個(gè)圓,作為標(biāo)記
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)

        # 顯示Opencv格式的圖像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

        # 再將opencv格式額數(shù)據(jù)轉(zhuǎn)換成ros image格式的數(shù)據(jù)發(fā)布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print(e)

這是回調(diào)函數(shù),為話題通信訂閱者的參數(shù),其中通過最后一個(gè)參數(shù)調(diào)用了回調(diào)函數(shù)。

self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)

?同時(shí)在主函數(shù)中,不停的spin回頭,達(dá)到不停的循環(huán)訂閱的目的。

rospy.spin()

在回調(diào)函數(shù)中:

第一步,ROS原始圖像信息轉(zhuǎn)化為opencv中的圖像信息。

cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")

第二步,在opencv中進(jìn)行圖像處理

        # 在opencv的顯示窗口中繪制一個(gè)圓,作為標(biāo)記
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)

        # 顯示Opencv格式的圖像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

第三步,opencv處理過的圖像轉(zhuǎn)化回為ROS圖像信息,同時(shí)發(fā)布出去,發(fā)布后的圖像信息可以通過ROS命令來查看。

self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))

分析完成,運(yùn)行代碼

roslaunch robot_vision usb_cam.launch
rosrun robot_vision cv_bridge_test.py
rqt_image_view

其中第二部如果是ROS—melodic版本肯定會(huì)報(bào)錯(cuò),當(dāng)然可以通過修改python版本聲明來解決,用python2運(yùn)行,但是現(xiàn)在python2已經(jīng)被淘汰了,即使運(yùn)行成功也毫無意義。

ROS報(bào)錯(cuò):ROS-Melodic中cv_bridge報(bào)錯(cuò)_機(jī)械專業(yè)的計(jì)算機(jī)小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127239566?spm=1001.2014.3001.5502如上是解決這個(gè)問題的方法。

運(yùn)行結(jié)果:

這是opencv輸出的圖像。

imgmsg_to_cv2,ROS,ros

?這是轉(zhuǎn)化后并發(fā)布出的圖像,其中話題名為cv_bridge_image,這在代碼中有跡可查,而且符合邏輯。

imgmsg_to_cv2,ROS,ros

?這是原始圖像,話題名為/usb_cam/image_raw,在代碼中訂閱者接收的圖像數(shù)據(jù)類型消息。(rqt_image_view)

imgmsg_to_cv2,ROS,ros

?這是計(jì)算圖(rqt_graph),其中只看見了兩個(gè)節(jié)點(diǎn)

imgmsg_to_cv2,ROS,ros文章來源地址http://www.zghlxwxcb.cn/news/detail-599364.html

到了這里,關(guān)于2.ROS機(jī)器視覺——ROS圖像(imgmsg)與opencv(cv2)對(duì)接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 我在Vscode學(xué)OpenCV 圖像處理四(輪廓查找 cv2.findContours() cv2.drawContours())-- 待補(bǔ)充

    我在Vscode學(xué)OpenCV 圖像處理四(輪廓查找 cv2.findContours() cv2.drawContours())-- 待補(bǔ)充

    在OpenCV中,邊緣檢測(cè)和輪廓查找是兩個(gè)不同的圖像處理任務(wù),它們有不同的目標(biāo)和應(yīng)用。 1.1.1 邊緣檢測(cè): 定義: 邊緣檢測(cè)是指尋找圖像中灰度級(jí)別變化明顯的地方,即圖像中物體之間的界限。這些變化通常表示圖像中的邊緣或輪廓。 方法: 常用的邊緣檢測(cè)算法包括Sobel、

    2024年02月03日
    瀏覽(95)
  • opencv-25 圖像幾何變換04- 透視 cv2.warpPerspective()

    opencv-25 圖像幾何變換04- 透視 cv2.warpPerspective()

    透視是一種幾何學(xué)概念,用于描述在三維空間中觀察物體時(shí),由于視角的不同而產(chǎn)生的變形效果。在現(xiàn)實(shí)世界中,當(dāng)我們從不同的角度或位置觀察物體時(shí),它們會(huì)呈現(xiàn)出不同的形狀和大小。這種現(xiàn)象被稱為透視效果。 透視效果主要由以下幾個(gè)因素造成: 遠(yuǎn)近關(guān)系 :在視野范

    2024年02月15日
    瀏覽(30)
  • Opencv之圖像濾波:5.中值濾波(cv2.medianBlur)

    Opencv之圖像濾波:5.中值濾波(cv2.medianBlur)

    ????????之前介紹的均值濾波、方框?yàn)V波、高斯濾波,都是線性濾波方式。由于線性濾波的結(jié)果是所有像素值的線性組合,因此含有噪聲的像素也會(huì)被考慮進(jìn)去,噪聲不會(huì)被消除,而是以更柔和的方式存在。這時(shí)使用非線性濾波效果可能會(huì)更好。中值濾波與前面介紹的濾波

    2024年02月06日
    瀏覽(27)
  • opencv-34 圖像平滑處理-雙邊濾波cv2.bilateralFilter()

    opencv-34 圖像平滑處理-雙邊濾波cv2.bilateralFilter()

    雙邊濾波(BilateralFiltering)是一種圖像處理濾波技術(shù),用于平滑圖像并同時(shí)保留邊緣信息。與其他傳統(tǒng)的線性濾波方法不同,雙邊濾波在考慮像素之間的空間距離之外,還考慮了像素之間的灰度值相似性。這使得雙邊濾波能夠有效地去除噪聲,同時(shí)保持圖像的細(xì)節(jié)和邊緣。

    2024年02月14日
    瀏覽(23)
  • opencv 31-圖像平滑處理-方框?yàn)V波cv2.boxFilter()

    opencv 31-圖像平滑處理-方框?yàn)V波cv2.boxFilter()

    方框?yàn)V波(Box Filtering)是一種簡(jiǎn)單的圖像平滑處理方法,它主要用于去除圖像中的噪聲和減少細(xì)節(jié),同時(shí)保持圖像的整體亮度分布。 方框?yàn)V波的原理很簡(jiǎn)單:對(duì)于圖像中的每個(gè)像素,將其周圍的一個(gè)固定大小的鄰域內(nèi)的像素值取平均,然后將這個(gè)平均值賦值給當(dāng)前像素。這

    2024年02月14日
    瀏覽(19)
  • Opencv之圖像濾波:6.雙邊濾波(cv2.bilateralFilter)

    Opencv之圖像濾波:6.雙邊濾波(cv2.bilateralFilter)

    ????????前面我們介紹的濾波方法都會(huì)對(duì)圖像造成模糊,使得邊緣信息變?nèi)趸蛘呦?,因此需要一種能夠?qū)D像邊緣信息進(jìn)行保留的濾波算法,雙邊濾波是綜合考慮空間信息和色彩信息的濾波方式,在濾波過程中能夠有效地保護(hù) 圖像內(nèi)的邊緣信息。 ????????之前介紹的

    2024年02月05日
    瀏覽(21)
  • opencv-19 圖像色彩空間轉(zhuǎn)換函數(shù)cv2.cvtColor()

    opencv-19 圖像色彩空間轉(zhuǎn)換函數(shù)cv2.cvtColor()

    cv2.cvtColor() 函數(shù)是 OpenCV 中用于圖像顏色空間轉(zhuǎn)換的函數(shù)。它允許你將圖像從一個(gè)色彩空間轉(zhuǎn)換為另一個(gè)色彩空間。在 Python 中,你可以使用這個(gè)函數(shù)來實(shí)現(xiàn)不同色彩空間之間的轉(zhuǎn)換。 函數(shù)的基本語(yǔ)法為: 參數(shù)說明: src:輸入圖像,可以是 NumPy 數(shù)組或 OpenCV 中的 Mat 對(duì)象。

    2024年02月15日
    瀏覽(24)
  • opencv-23 圖像幾何變換02-翻轉(zhuǎn)-cv2.flip()

    opencv-23 圖像幾何變換02-翻轉(zhuǎn)-cv2.flip()

    在 OpenCV 中,圖像的翻轉(zhuǎn)采用函數(shù) cv2.flip()實(shí)現(xiàn) ,該函數(shù)能夠?qū)崿F(xiàn)圖像在水平方向翻轉(zhuǎn)、垂直方向翻轉(zhuǎn)、兩個(gè)方向同時(shí)翻轉(zhuǎn),其語(yǔ)法結(jié)構(gòu)為: 式中: ? dst 代表和原始圖像具有同樣大小、類型的目標(biāo)圖像。 ? src 代表要處理的原始圖像。 ? flipCode 代表旋轉(zhuǎn)類型。該參數(shù)的意

    2024年02月15日
    瀏覽(93)
  • OpenCV: 圖像縮放(cv2.resize)【一分鐘弄清楚】

    OpenCV: 圖像縮放(cv2.resize)【一分鐘弄清楚】

    OpenCV: 圖像縮放(cv2.resize)【一分鐘弄清楚】 ?? 個(gè)人主頁(yè):高斯小哥 ?? 高質(zhì)量專欄:Matplotlib之旅:零基礎(chǔ)精通數(shù)據(jù)可視化、Python基礎(chǔ)【高質(zhì)量合集】、PyTorch零基礎(chǔ)入門教程 ?? 希望得到您的訂閱和支持~ ?? 創(chuàng)作高質(zhì)量博文,分享更多關(guān)于深度學(xué)習(xí)、PyTorch、Python領(lǐng)域的優(yōu)質(zhì)

    2024年04月16日
    瀏覽(104)
  • Python OpenCV 圖像縮放:使用 cv2.resize() 方法

    圖像縮放是計(jì)算機(jī)視覺和圖像處理中常用的操作之一。OpenCV 是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺庫(kù),提供了許多圖像處理功能。在 Python 中使用 OpenCV 進(jìn)行圖像縮放非常簡(jiǎn)單,可以使用 cv2.resize() 方法來實(shí)現(xiàn)。 cv2.resize() 方法可以根據(jù)指定的尺寸調(diào)整圖像的大小。它可以縮小圖像,也可以

    2024年02月02日
    瀏覽(98)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包