ROS+Python-opencv(1)

这篇具有很好参考价值的文章主要介绍了ROS+Python-opencv(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2021 PS-Micro, Co. Ltd.
#
# SPDX-License-Identifier: Apache-2.0
#

#该python文件可以当作节点放在工作空间中启动

import time

import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image
import numpy as np
from math import *
from geometry_msgs.msg import Pose
from std_msgs.msg import Float32


lower_color = np.array([0, 0, 0])
upper_color = np.array([50, 50, 70])
kernel_size = 5

def find_line_center(binary_image):
    contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if not contours:
        return None

    # 找到最大轮廓,假设它是线条
    max_contour = max(contours, key=cv2.contourArea)
    M = cv2.moments(max_contour)

    # 如果矩存在,则计算轮廓的中心
    if M["m00"] != 0:
        cX = int(M["m10"] / M["m00"])
        cY = int(M["m01"] / M["m00"])
        return (cX, cY)

class ImageConverter:
    def __init__(self):
        # 创建图像缓存相关的变量
        self.cv_image = None
        self.get_image = False

        # 创建cv_bridge
        self.bridge = CvBridge()

        # 声明图像的发布者和订阅者
        self.image_pub = rospy.Publisher("line_detect_image",
                                         Image,
                                         queue_size=1)
        self.target_pub = rospy.Publisher("line_detect_dispose",
                                          Pose,
                                          queue_size=1)
        self.image_shape_pub = rospy.Publisher("image_shape",
                                          Pose,
                                          queue_size=1)
        self.image_sub = rospy.Subscriber("/iris_0/camera/image_raw",
                                          Image,
                                          self.callback,
                                          queue_size=1)

    def callback(self, data):
        # 判断当前图像是否处理完
        if not self.get_image:
            # 使用cv_bridge将ROS的图像数据转换成OpenCV的图像格式
            try:
                self.cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
            except CvBridgeError as e:
                print(e)
            # 设置标志,表示收到图像
            self.get_image = True
    

    
    
    def detect_object(self):
        gray = cv2.cvtColor(self.cv_image, cv2.COLOR_BGR2GRAY)

        height, width = self.cv_image.shape[:2]
        shape = Pose()
        shape.position.x = width
        shape.position.y = height
        self.image_shape_pub.publish(shape)
        # 应用高斯模糊以减少图像噪声
        blurred = cv2.GaussianBlur(gray, (5, 5), 0)

        # 使用Canny边缘检测来检测线条
        edges = cv2.Canny(blurred, 50, 150)

        # 使用颜色阈值创建一个黑色线条的掩模
        mask = cv2.inRange(self.cv_image, lower_color, upper_color)

        # 应用形态学操作来清理和增强线条
        mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, np.ones((kernel_size, kernel_size)), iterations=4)
        mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, np.ones((kernel_size, kernel_size)), iterations=4)

        line_center = find_line_center(mask)

        # 如果找到线条中心,绘制一个点或线条来指示它
        if line_center:
            cv2.circle(self.cv_image, line_center, 10, (0, 255, 0), -1)  # 在原图上绘制一个绿色的点
            cv2.line(self.cv_image, (0, line_center[1]), (self.cv_image.shape[1], line_center[1]), (0, 255, 0), 2)  
            disPose = Pose()
            disPose.position.x = line_center[0]
            disPose.position.y = line_center[1]
            self.target_pub.publish(disPose)
                
        # 再将opencv格式额数据转换成ros image格式的数据发布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(self.cv_image, "bgr8"))
        except CvBridgeError as e:
            print (e)
    def loop(self):
        if self.get_image:
            self.detect_object()
            self.get_image = False


if __name__ == '__main__':
    try:
        # 初始化ros节点
        rospy.init_node("line_detect")
        rospy.loginfo("Starting detect object")
        image_converter = ImageConverter()
        rate = rospy.Rate(100)
        while not rospy.is_shutdown():
            image_converter.loop()
            rate.sleep()
    except KeyboardInterrupt:
        print ("Shutting down object_detect node.")
        cv2.destroyAllWindows()

 文章来源地址https://www.toymoban.com/news/detail-841338.html

到了这里,关于ROS+Python-opencv(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python与人工智能

    目录      ​编辑 一、Python 二.使用Python实现人工智能的几个具体案例 2.1图像分类 2.2自然语言处理 2.3语音识别 2.4推荐系统 2.5机器翻译 三.以下是使用Python实现的一个具体案例 案例:垃圾邮件分类器   是一种广泛用于人工智能(AI)开发的编程语言。Python具有简洁的语法和

    2024年02月02日
    浏览(39)
  • python人工智能技术

    人工智能(AI)已成为当今世界的热门话题,它的应用范围越来越广泛。其中,Python成为AI开发中最受欢迎的编程语言之一。Python提供了许多功能强大的库和框架,大大简化了开发人员的工作。在本文中,我们将介绍Python在人工智能领域中的三个主要应用。 机器学习是人工智

    2024年02月12日
    浏览(46)
  • 开发ROS机器人的人工智能功能

    机器人技术的发展已经进入了一个新的高潮,随着计算能力的不断提高和传感器技术的不断发展,机器人在各个领域的应用也越来越广泛。在这个背景下,机器人的人工智能功能也变得越来越重要。ROS(Robot Operating System)是一个开源的机器人操作系统,它提供了一系列的库和

    2024年01月23日
    浏览(59)
  • 利用人工智能模型学习Python爬虫

    爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 网络爬虫(又称为网页蜘蛛,网络机器人)是其中一种类型。 爬虫可以自动化浏览网络中的信息,当然浏览信息的时候需要按照我们制定的规则进行,这些规则我们称之为网络爬虫算法。 ——使用讯飞星火

    2024年02月09日
    浏览(47)
  • Python人工智能应用--图像识别&&深度学习

    像素(缩写为px)是图像中的最小单位,由一个个小方格组成。 这些小方格都有一个固定的位置和颜色,共同决定了图像所呈现出来的样子。 这些小方格的行数与列数又被叫做分辨率。我们常说的某幅图像的分辨率是1280×720,指的就是这张图中的每一行都有1280个像素,每一列都

    2024年04月09日
    浏览(71)
  • 基于虚拟现实的游戏中的人工智能:如何使用Python和Pygame实现人工智能

    作者:禅与计算机程序设计艺术 《基于虚拟现实的游戏中的人工智能:如何使用Python和Pygame实现人工智能》 1.1. 背景介绍 随着虚拟现实 (VR) 和增强现实 (AR) 技术的发展,游戏行业也在不断进步。在这个虚拟世界中,玩家可以扮演不同的角色,探索各种奇妙的世界,体验沉浸

    2024年02月11日
    浏览(60)
  • 人工智能——“kmeans实现图片分割”(Python实现)

    (2)边缘分割:对图像边缘进行检测,即检测图像中灰度值发生跳变的地方,则为一片 区域的边缘。 (3)直方图法:对图像的颜色建立直方图,而直方图的波峰波谷能够表示一块区域的颜 色值的范围,来达到分割的目的。 (4)特定理论:基于 聚类分析 、小波变换等理论完成图像

    2024年04月17日
    浏览(38)
  • 人工智能教程(三):更多有用的 Python 库

    目录 前言 推荐 JupyterLab 入门 复杂的矩阵运算 其它人工智能和机器学习的 Python 库 前言 在本系列的上一篇人工智能教程(二):人工智能的历史以及再探矩阵中,我们回顾了人工智能的历史,然后详细地讨论了矩阵。在本系列的第三篇文章中,我们将了解更多的矩阵操作,

    2024年02月05日
    浏览(49)
  • python人工智能【隔空手势控制鼠标】“解放双手“

     大家好,我是csdn的博主: lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主 lqj_本人擅长微信小程序,前端,python,等方面的知识 https://blog.csdn.net/lbcyllqj?spm=1011.2415.3001.5343 哔哩哔哩欢迎关注: 小淼Develop 本文\\\"python人工智能【隔空手势控制

    2024年02月09日
    浏览(65)
  • 【人工智能】简单线性回归模型介绍及python实现

    简单线性回归是人工智能和统计学中一个基本的预测技术,用于分析两个连续变量之间的线性关系。在简单线性回归中,我们试图找到一个线性方程来最好地描述这两个变量之间的关系。 变量 :简单线性回归涉及两个变量 - 自变量(independent variable)和因变量(dependent vari

    2024年01月17日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包