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

ROS學(xué)習(xí)筆記15:ROS與OpenCV結(jié)合處理圖像

這篇具有很好參考價值的文章主要介紹了ROS學(xué)習(xí)筆記15:ROS與OpenCV結(jié)合處理圖像。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、安裝ROS-OpenCV

??安裝OpenCVsudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv
??ROS進行圖像處理是依賴于OpenCV庫的。ROS通過一個叫CvBridge的功能包,將獲取的圖像數(shù)據(jù)轉(zhuǎn)換成OpenCV的格式,OpenCV處理之后,傳回給ROS進行圖像顯示(應(yīng)用),如下圖:
ROS學(xué)習(xí)筆記15:ROS與OpenCV結(jié)合處理圖像

二、簡單案例分析

??我們使用ROS驅(qū)動獲取攝像頭數(shù)據(jù),將ROS獲得的數(shù)據(jù)通過CvBridge轉(zhuǎn)換成OpenCV需要的格式,調(diào)用OpenCV的算法庫對這個圖片進行處理(如畫一個圓),然后返回給ROS進行rviz顯示。

1.usb_cam.launch

??首先我們建立一個launch文件,可以調(diào)用攝像頭驅(qū)動獲取圖像數(shù)據(jù)。運行l(wèi)aunch文件roslaunch xxx(功能包名) usb_cam.launch

<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="1280" />
      <param name="image_height" value="720" />
      <param name="pixel_format" value="yuyv" />
      <param name="camera_frame_id" value="usb_cam" />
      <param name="io_method" value="mmap"/>
    </node>
</launch>

2.cv_bridge_test.py

??建立一個py文件,是python2的。實現(xiàn)接收ROS發(fā)的圖像信息,在圖像上畫一個圓后,返回給ROS。返回的話題名稱是cv_bridge_image。運行py文件rosrun xxx(功能包名) cv_bridge_test.py
??如果出現(xiàn)權(quán)限不夠的情況,記得切換到py文件目錄下執(zhí)行:sudo chmod +x *.py

#!/usr/bin/env python
# -*- 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的顯示窗口中繪制一個圓,作為標(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é)點
        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()

3.rqt_image_view

??在終端下執(zhí)行rqt_image_view,訂閱cv_bridge_image話題,可以發(fā)現(xiàn)OpenCV處理之后的圖像在ROS中顯示出來。
ROS學(xué)習(xí)筆記15:ROS與OpenCV結(jié)合處理圖像

三、CvBridge相關(guān)API

1.imgmsg_to_cv2()

??將ROS圖像消息轉(zhuǎn)換成OpenCV圖像數(shù)據(jù);

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

2.cv2_to_imgmsg()

??將OpenCV格式的圖像數(shù)據(jù)轉(zhuǎn)換成ROS圖像消息;

# 再將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

四、利用ROS+OpenCV實現(xiàn)人臉檢測案例

1.usb_cam.launch

??這個launch和上一個案例一樣先打開攝像頭驅(qū)動獲取圖像數(shù)據(jù)。運行l(wèi)aunch文件roslaunch xxx(功能包名) usb_cam.launch

<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="1280" />
      <param name="image_height" value="720" />
      <param name="pixel_format" value="yuyv" />
      <param name="camera_frame_id" value="usb_cam" />
      <param name="io_method" value="mmap"/>
    </node>
</launch>

2.face_detector.launch

??人臉檢測算法采用基于Harr特征的級聯(lián)分類器對象檢測算法,檢測效果并不佳。但是這里只是為了演示如何使用ROS和OpenCV進行圖像處理,所以不必在乎算法本身效果。整個launch調(diào)用了一個py文件和兩個xml文件,分別如下:

2.1 launch

(注意py文件和xml文件的存放位置)

<launch>
    <node pkg="robot_vision" name="face_detector" type="face_detector.py" output="screen">
        <remap from="input_rgb_image" to="/usb_cam/image_raw" />
        <rosparam>
            haar_scaleFactor: 1.2
            haar_minNeighbors: 2
            haar_minSize: 40
            haar_maxSize: 60
        </rosparam>
        <param name="cascade_1" value="$(find robot_vision)/data/haar_detectors/haarcascade_frontalface_alt.xml" />
        <param name="cascade_2" value="$(find robot_vision)/data/haar_detectors/haarcascade_profileface.xml" />
    </node>
</launch>

2.2 face_detector.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import cv2
import numpy as np
from sensor_msgs.msg import Image, RegionOfInterest
from cv_bridge import CvBridge, CvBridgeError

class faceDetector:
    def __init__(self):
        rospy.on_shutdown(self.cleanup);

        # 創(chuàng)建cv_bridge
        self.bridge = CvBridge()
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)

        # 獲取haar特征的級聯(lián)表的XML文件,文件路徑在launch文件中傳入
        cascade_1 = rospy.get_param("~cascade_1", "")
        cascade_2 = rospy.get_param("~cascade_2", "")

        # 使用級聯(lián)表初始化haar特征檢測器
        self.cascade_1 = cv2.CascadeClassifier(cascade_1)
        self.cascade_2 = cv2.CascadeClassifier(cascade_2)

        # 設(shè)置級聯(lián)表的參數(shù),優(yōu)化人臉識別,可以在launch文件中重新配置
        self.haar_scaleFactor  = rospy.get_param("~haar_scaleFactor", 1.2)
        self.haar_minNeighbors = rospy.get_param("~haar_minNeighbors", 2)
        self.haar_minSize      = rospy.get_param("~haar_minSize", 40)
        self.haar_maxSize      = rospy.get_param("~haar_maxSize", 60)
        self.color = (50, 255, 50)

        # 初始化訂閱rgb格式圖像數(shù)據(jù)的訂閱者,此處圖像topic的話題名可以在launch文件中重映射
        self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)

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

        # 創(chuàng)建灰度圖像
        grey_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 創(chuàng)建平衡直方圖,減少光線影響
        grey_image = cv2.equalizeHist(grey_image)

        # 嘗試檢測人臉
        faces_result = self.detect_face(grey_image)

        # 在opencv的窗口中框出所有人臉區(qū)域
        if len(faces_result)>0:
            for face in faces_result: 
                x, y, w, h = face
                cv2.rectangle(cv_image, (x, y), (x+w, y+h), self.color, 2)

        # 將識別后的圖像轉(zhuǎn)換成ROS消息并發(fā)布
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))

    def detect_face(self, input_image):
        # 首先匹配正面人臉的模型
        if self.cascade_1:
            faces = self.cascade_1.detectMultiScale(input_image, 
                    self.haar_scaleFactor, 
                    self.haar_minNeighbors, 
                    cv2.CASCADE_SCALE_IMAGE, 
                    (self.haar_minSize, self.haar_maxSize))
                                         
        # 如果正面人臉匹配失敗,那么就嘗試匹配側(cè)面人臉的模型
        if len(faces) == 0 and self.cascade_2:
            faces = self.cascade_2.detectMultiScale(input_image, 
                    self.haar_scaleFactor, 
                    self.haar_minNeighbors, 
                    cv2.CASCADE_SCALE_IMAGE, 
                    (self.haar_minSize, self.haar_maxSize))
        
        return faces

    def cleanup(self):
        print "Shutting down vision node."
        cv2.destroyAllWindows()

if __name__ == '__main__':
    try:
        # 初始化ros節(jié)點
        rospy.init_node("face_detector")
        faceDetector()
        rospy.loginfo("Face detector is started..")
        rospy.loginfo("Please subscribe the ROS image.")
        rospy.spin()
    except KeyboardInterrupt:
        print "Shutting down face detector node."
        cv2.destroyAllWindows()

2.3 兩個xml文件

鏈接

3.rqt_image_view

??運行完上述兩個launch文件后,在終端下執(zhí)行rqt_image_view,訂閱cv_bridge_image話題,可以發(fā)現(xiàn)OpenCV處理之后的圖像在ROS中顯示出來。
ROS學(xué)習(xí)筆記15:ROS與OpenCV結(jié)合處理圖像

五、利用ROS+OpenCV實現(xiàn)幀差法物體追蹤

1.usb_cam.launch

??這個launch和前兩個案例一樣先打開攝像頭驅(qū)動獲取圖像數(shù)據(jù)。運行l(wèi)aunch文件roslaunch xxx(功能包名) usb_cam.launch

<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="1280" />
      <param name="image_height" value="720" />
      <param name="pixel_format" value="yuyv" />
      <param name="camera_frame_id" value="usb_cam" />
      <param name="io_method" value="mmap"/>
    </node>
</launch>

2.motion_detector.launch

??物體追蹤方法采用幀差法,追蹤效果并不佳。但是這里只是為了演示如何使用ROS和OpenCV進行圖像處理,所以不必在乎算法本身效果。整個launch調(diào)用了一個py文件,如下:

2.1 launch

<launch>
    <node pkg="robot_vision" name="motion_detector" type="motion_detector.py" output="screen">
        <remap from="input_rgb_image" to="/usb_cam/image_raw" />
        <rosparam>
            minArea: 500
            threshold: 25
        </rosparam>
    </node>
</launch>

2.1 motion_detector.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import cv2
import numpy as np
from sensor_msgs.msg import Image, RegionOfInterest
from cv_bridge import CvBridge, CvBridgeError

class motionDetector:
    def __init__(self):
        rospy.on_shutdown(self.cleanup);

        # 創(chuàng)建cv_bridge
        self.bridge = CvBridge()
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)

        # 設(shè)置參數(shù):最小區(qū)域、閾值
        self.minArea   = rospy.get_param("~minArea",   500)
        self.threshold = rospy.get_param("~threshold", 25)

        self.firstFrame = None
        self.text = "Unoccupied"

        # 初始化訂閱rgb格式圖像數(shù)據(jù)的訂閱者,此處圖像topic的話題名可以在launch文件中重映射
        self.image_sub = rospy.Subscriber("input_rgb_image", Image, self.image_callback, queue_size=1)

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

        # 創(chuàng)建灰度圖像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (21, 21), 0)

        # 使用兩幀圖像做比較,檢測移動物體的區(qū)域
        if self.firstFrame is None:
            self.firstFrame = gray
            return  
        frameDelta = cv2.absdiff(self.firstFrame, gray)
        thresh = cv2.threshold(frameDelta, self.threshold, 255, cv2.THRESH_BINARY)[1]

        thresh = cv2.dilate(thresh, None, iterations=2)
        binary, cnts, hierarchy= cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        for c in cnts:
            # 如果檢測到的區(qū)域小于設(shè)置值,則忽略
            if cv2.contourArea(c) < self.minArea:
               continue 

            # 在輸出畫面上框出識別到的物體
            (x, y, w, h) = cv2.boundingRect(c)
            cv2.rectangle(frame, (x, y), (x + w, y + h), (50, 255, 50), 2)
            self.text = "Occupied"

        # 在輸出畫面上打當(dāng)前狀態(tài)和時間戳信息
        cv2.putText(frame, "Status: {}".format(self.text), (10, 20),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

        # 將識別后的圖像轉(zhuǎn)換成ROS消息并發(fā)布
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(frame, "bgr8"))

    def cleanup(self):
        print "Shutting down vision node."
        cv2.destroyAllWindows()

if __name__ == '__main__':
    try:
        # 初始化ros節(jié)點
        rospy.init_node("motion_detector")
        rospy.loginfo("motion_detector node is started...")
        rospy.loginfo("Please subscribe the ROS image.")
        motionDetector()
        rospy.spin()
    except KeyboardInterrupt:
        print "Shutting down motion detector node."
        cv2.destroyAllWindows()

3.rqt_image_view

??運行完上述兩個launch文件后,在終端下執(zhí)行rqt_image_view,訂閱cv_bridge_image話題,可以發(fā)現(xiàn)OpenCV處理之后的圖像在ROS中顯示出來。(鑒于我的測試環(huán)境比較糟糕,并且這個算法本身精度不高,就不展示最終效果了)文章來源地址http://www.zghlxwxcb.cn/news/detail-451961.html

到了這里,關(guān)于ROS學(xué)習(xí)筆記15:ROS與OpenCV結(jié)合處理圖像的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 數(shù)字圖像處理第三章 學(xué)習(xí)筆記附部分例子代碼(C++ & opencv)

    數(shù)字圖像處理第三章 學(xué)習(xí)筆記附部分例子代碼(C++ & opencv)

    本系列博客參考書為, 數(shù)字圖像處理第三版-岡薩雷斯 第三版教材中圖片下載地址: book images downloads vs2019配置opencv可以查看:VS2019 Opencv4.5.4配置教程 后續(xù)劇情: 數(shù)字圖像處理 第四章 頻率域濾波 學(xué)習(xí)筆記 數(shù)字圖像處理 第六章 彩色圖像處理 學(xué)習(xí)筆記 數(shù)字圖像處理 第七章 小

    2024年02月03日
    瀏覽(32)
  • 隨手筆記——通過OpenCV獲取圖像轉(zhuǎn)為ROS圖像話題發(fā)布(C++版)

    通過OpenCV獲取圖像轉(zhuǎn)為ROS圖像話題發(fā)布 注:sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), “bgr8”, image).toImageMsg(); //核心代碼

    2024年02月12日
    瀏覽(28)
  • Opencv-C++筆記 (15) : 像素重映射 與 圖像扭曲

    Opencv-C++筆記 (15) : 像素重映射 與 圖像扭曲

    重映射,就是把一幅圖像中某位置的像素放置到另一圖像指定位置的過程。即: 在重映射過程中,圖像的大小也可以同時發(fā)生改變。此時像素與像素之間的關(guān)系就不是一一對應(yīng)關(guān)系,因此在重映射過程中,可能會涉及到像素值的插值計算。 頭文件 quick_opencv.h:聲明類與公共

    2024年02月13日
    瀏覽(91)
  • opencv(15) 圖像平滑處理之二:cv2.GaussianBlur()高斯濾波

    opencv(15) 圖像平滑處理之二:cv2.GaussianBlur()高斯濾波

    高斯濾波是一種線性平滑濾波,適用于消除高斯噪聲,廣泛應(yīng)用于圖像處理的減噪過程。 高斯模板是通過對二維高斯函數(shù)進行采樣(高斯模糊的卷積核里的數(shù)值滿足高斯分布)、量化并歸一化得到的,它考慮了鄰域像素位置的影響,距離當(dāng)前被平滑像素越近的點,加權(quán)系數(shù)越大

    2024年02月10日
    瀏覽(97)
  • 數(shù)字圖像處理 - 圖像處理結(jié)合機器學(xué)習(xí)的應(yīng)用示例

    ????????在本文中,特別關(guān)注樹葉分類機器學(xué)習(xí)技術(shù)的實現(xiàn)。我們的目標(biāo)是演示如何利用機器學(xué)習(xí)算法來分析一系列葉子照片,從而實現(xiàn)準(zhǔn)確分類并提供對植物領(lǐng)域有價值的算法。 ????????圖像處理中機器學(xué)習(xí)的本質(zhì) ????????機器學(xué)習(xí)使計算機能夠?qū)W習(xí)模式并根據(jù)

    2024年02月13日
    瀏覽(25)
  • 【高性能計算】opencl語法及相關(guān)概念(四):結(jié)合opencv進行圖像高斯模糊處理

    【高性能計算】opencl語法及相關(guān)概念(四):結(jié)合opencv進行圖像高斯模糊處理

    高斯模糊是一種常用的圖像處理技術(shù),用于減少圖像中的噪點和細(xì)節(jié),并實現(xiàn)圖像的平滑效果。它是基于高斯函數(shù)的卷積操作,通過對每個像素周圍的鄰域像素進行加權(quán)平均來實現(xiàn)模糊效果。 具體而言,高斯模糊通過在圖像上滑動一個卷積核,將卷積核與輸入圖像的對應(yīng)像素

    2024年02月10日
    瀏覽(19)
  • 【計算機視覺—python 】 圖像處理入門教程 —— 圖像屬性、像素編輯、創(chuàng)建與復(fù)制、裁剪與拼接【 openCV 學(xué)習(xí)筆記 005 to 010 and 255】

    【計算機視覺—python 】 圖像處理入門教程 —— 圖像屬性、像素編輯、創(chuàng)建與復(fù)制、裁剪與拼接【 openCV 學(xué)習(xí)筆記 005 to 010 and 255】

    OpenCV中讀取圖像文件后的數(shù)據(jù)結(jié)構(gòu)符合Numpy的ndarray多維數(shù)組結(jié)構(gòu),因此 ndarray 數(shù)組的屬性和操作方法可用于圖像處理的一些操作。數(shù)據(jù)結(jié)構(gòu)如下圖所示: img.ndim:查看代表圖像的維度。彩色圖像的維數(shù)為3,灰度圖像的維度為2。 img.shape:查看圖像的形狀,代表矩陣的行數(shù)(高

    2024年01月19日
    瀏覽(104)
  • Opencv+Python筆記(五)圖像閾值化處理

    Opencv+Python筆記(五)圖像閾值化處理

    圖像閾值化可以理解為一個簡單的圖像分割操作,閾值又稱為臨界值,它的目的是確定出一個范圍,然后這個范圍內(nèi)的像素點使用同一種方法處理,而閾值之外的部分則使用另一種處理方法或保持原樣。 閾值處理有2種方式,一種是固定閾值方式,又包括多種處理模式,另一

    2023年04月26日
    瀏覽(35)
  • ROS高效進階第四章 -- 機器視覺處理之圖像格式,usb_cam,攝像頭標(biāo)定,opencv和cv_bridge引入

    ROS高效進階第四章 -- 機器視覺處理之圖像格式,usb_cam,攝像頭標(biāo)定,opencv和cv_bridge引入

    從本文開始,我們用四篇文章學(xué)習(xí)ROS機器視覺處理,本文先學(xué)習(xí)一些外圍的知識,為后面的人臉識別,目標(biāo)跟蹤和yolov5目標(biāo)檢測做準(zhǔn)備。 我的筆記本是Thinkpad T14 i7 + Nvidia MX450,系統(tǒng)是ubuntu20.04,ros是noetic。由于很多驅(qū)動與硬件強相關(guān),請讀者注意這點。 本文的參考資料有:

    2024年02月04日
    瀏覽(25)
  • 實驗二 ROS結(jié)合OpenCV示例——人臉識別

    實驗二 ROS結(jié)合OpenCV示例——人臉識別

    Opencv庫是一個基于BSD許可發(fā)行的跨平臺開源計算機視覺庫,基于opencv庫,可以很方便的入手機器視覺方面的應(yīng)用,ros已經(jīng)集成了opencv庫和相關(guān)接口功能包; 人臉識別的目的是在輸入圖像中確定人臉的位置、大小、姿態(tài)。利用大量樣本的Haar特征進行分類器訓(xùn)練,然后調(diào)用訓(xùn)練

    2024年02月09日
    瀏覽(49)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包