ROS机械臂——ROS结合OpenCV案例(含资源)

news2024/11/17 1:29:52

纲要

在这里插入图片描述

摄像头驱动

在这里插入图片描述

图像属性

在这里插入图片描述

图像压缩

在这里插入图片描述### Realsense摄像头
在这里插入图片描述

点云展示

在这里插入图片描述### 点云图像属性
在这里插入图片描述## 摄像头标定
在这里插入图片描述

摄像头标定流程

在这里插入图片描述

如何使用标定文件

在这里插入图片描述

OpenCV

在这里插入图片描述

ROS与OpenCV的集成框架

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b0ff143b710543839325d19c7a3c04c5.png

ROS+OpenCV 图像绘制(cpp)

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

static const std::string OPENCV_WINDOW = "image_window";
 
class ImageConverter{
     ros::NodeHandle nh;
     image_transport::ImageTransport it;
     image_transport::Subscriber image_sub;
     image_transport::Publisher image_pub;

     public:
       ImageConverter()
       :it(nh){
             //订阅图像输入流 、发布图像输出流(话题名称,处理队列的大小为1,回调函数的名称,回调函数所处的类)
             image_sub = it.subscribe("/usb_cam/image_raw",1,&ImageConverter::imageCb,this);
             image_pub = it.advertise("cv_bridge_image",1);

             cv::namedWindow(OPENCV_WINDOW);
       }

    ~ImageConverter(){
           cv::destroyWindow(OPENCV_WINDOW);
    }

      void imageCb(const sensor_msgs::ImageConstPtr& msg){
          //msg为图像信息在ROS中的地址
           cv_bridge::CvImagePtr cv_ptr;

           try{
            //创建一个图像数据的拷贝
            //toCvCopy复制数据并返回复制数据地址指针cv_bridge::CvImagePtr
            //将ROS图像消息转换为了CvImage以在OpenCV中使用
            //sensor_msgs::image_encodings::BGR8是”bgr8”字符串常量。
               cv_ptr = cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
           }
           catch (cv_bridge::Exception& e){
                ROS_ERROR("cv_bridge exception: %s",e.what());
                return;
           }
       
       //在opencv窗口画红圈
       if(cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
            cv::circle(cv_ptr->image,cv::Point(50,50) , 10 , CV_RGB(255,0,0));

       //生成opencv窗口
       cv::imshow(OPENCV_WINDOW,cv_ptr->image);
       cv::waitKey(3);

       //将opencv生成的话题信息,转换为Image图像信息,通过iamge_pub发布出去,可以通过rqt_image_view订阅话题,查看opencv生成的红圈
       image_pub.publish(cv_ptr->toImageMsg());    
    }
};

int main(int argc,char ** argv){
     ros::init(argc,argv,"image_converter");
     ImageConverter ic;
     ros::spin();
     return 0;

}

ROS+OpenCV 图像绘制(python)

#!/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):    
        # 创建cv_bridge,声明图像的发布者和订阅者
        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的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print e

        # 在opencv的显示窗口中绘制一个圆,作为标记
        (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格式额数据转换成ros image格式的数据发布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print e

if __name__ == '__main__':
    try:
        # 初始化ros节点
        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()

ROS+OpenCV物体识别

在这里插入图片描述

源码

get2DLocation():获取桌面以及桌面物体的坐标
在这里插入图片描述
设置红色、绿色通道,通过像素点灰度值判断出黑色桌子的具体位置,将黑色像素点具体位置的二进制数值设置为255,非黑设置为0,计算出桌子中心点,最后将非0点画上方框
在这里插入图片描述找红点、画蓝框
在这里插入图片描述
识别绿色圆柱(contours:轮廓)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析

在这里插入图片描述
在这里插入图片描述

结果

在这里插入图片描述

小结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mysql】Xtrabackup备份恢复(Mysql5.6/5.7/8.0)

目录 一、前言 二、Mysql8.0为例 1、安装Xtraback工具 1&#xff09;mysql8.0.x版本 2&#xff09;mysql5.6、5.7版本 2、备份操作 3、恢复操作 一、前言 官网下载地址&#xff1a;Software Downloads - Percona 本测试环境&#xff1a;centos_x86、mysql8.0.39、mysq…

Nginx的源码编译

一:Nginx 介绍 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务 器 解决C10K问题&#xff08;10K Connections&#xff09; Nginx功能&#xff1a;静态的web资源服务器html&#xff0c;图片&#xff0c;js&#xff0c;css&#xff…

【记git 重命名文件失败,和正确方法】

【背景】 想要重命名一个文件&#xff0c;并同步到远程 【过程】 1.我是直接把 “驱动增加he.c” 文件重命名为 “驱动增加播放he接口方法” &#xff0c;想着直接提交就会同步重命名git仓记录的文件名。然后就可以推送到远程仓库&#xff0c;同步重命名远程仓库的文件名。 2.然…

计算机的错误计算(六十五)

摘要 计算机的错误计算&#xff08;五十五&#xff09;展示了大数的余弦函数值的错误计算 。本节探讨另外一类数值&#xff1a; 附近数 的余弦函数的计算精度问题。 例1. 已知 计算 先用 Python计算&#xff1a; 然后在 Visual Studio 2010中用下列代码计算&#xff1a; …

c语言中比较特殊的输入函数

目录 一.getchar()函数 1.基本功能 2.使用方法 (1).读取单个字符 (2).读取多个字符&#xff08;直到遇到换行符&#xff09; (3).处理输入中的空白字符 3.返回值 4.应用场景 5.注意事项 二.fgets()函数 1.函数原型 2.工作原理 3.使用示例 (1).从标准输入读取一行…

qt笔记之qml中的TextEdit、TextInput、TextArea、TextField的区别

qt笔记之qml中的TextEdit、TextInput、TextArea、TextField的区别 code review! 文章目录 qt笔记之qml中的TextEdit、TextInput、TextArea、TextField的区别一.对比二.C环境中类似功能的控件 一.对比 TextEdit、TextInput、TextArea和TextField都是用于文本输入的组件&#…

基于PostGIS(Postgres)+Node.js实现的xyz瓦片地图服务器

背景介绍 前两天研究GeoServer发布存储在PostGIS中栅格数据&#xff0c;最终目的是想在PostGIS中存储金字塔瓦片&#xff0c;用GeoServer发布&#xff0c;但是最后经过研究不改GeoServer源码的情况下&#xff0c;好像只支持将大图tif存在PostGIS数据库中进行发布&#xff0c;金…

XSS漏洞复现(包括xssgame和三个高级xss漏洞)

文章目录 XSS GAME1、Ma Spaghet!2、Jefff3、Ugandan Knuckles4、Ricardo Milos5、Ah Thats Hawt6、Ligma7、Mafia8、Ok, Boomer 全删除属性dom破坏WW3 XSS GAME 地址&#xff1a;https://xss.pwnfunction.com/ 关卡难度层层递进&#xff0c;各个漏洞都有特点&#xff0c;值得…

【最大公约数和最小公倍数】求最大公约数和最小公倍数

输入两个正整数m和n&#xff0c;求其最大公约数和最小公倍数 使用C语言实现&#xff0c;具体代码&#xff1a; 使用辗转相除法&#xff08;也称欧几里得算法&#xff09;计算最大公约数 while(b ! 0){ temp a % b; a b; b temp; } 最小公倍数&#xff08;LCM&…

大模型高效微调工具 Hugging Face PEFT

概述 HF PEFT是一个为大型预训练模型提供高效微调方法的Python库。它通过采用训练少量提示参数或使用低秩适应等重新参数化方法&#xff0c;减少微调时训练参数的数量。本文主要介绍了PEFT库的内容、与Transformers的集成、核心知识点如AutoPeftModels、PeftConfig、PeftType和…

知识改变命运 数据结构【链表面试题】

1. 删除链表中等于给定值 val 的所有节点。 OJ链接 public ListNode removeElements(ListNode head, int val) {if (headnull) {return null;}ListNode curhead.next;ListNode prehead;while(cur!null) {if(cur.valval) {pre.nextcur.next;curcur.next;}else {precur;curcur.ne…

日拱一卒(5)——leetcode学习记录:股票购买

一、任务 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…

【qt】跳转到另一个界面

如何在一个界面跳转到另一个界面呢&#xff1f; 1.具体步骤 1.先新建一个界面 2.选择qt设计师界面 3.选择W 4.新界面名称 5.界面设计 因为我们要实现通信&#xff0c;需要一个发送信息栏&#xff0c;一个发送按钮&#xff0c;一个清空发送栏按钮 6.实现跳转 我们可以参…

链表反转算法

链表的反转有较多的方法&#xff0c;如原地算法&#xff0c;迭代法、头插法、递归法&#xff0c;本文使用递归法和迭代法两种方式进行演示。 一、定义链表 typedef struct SinglyLinkNode {/**后继节点 */struct SinglyLinkNode* next;/** 节点数据域 */int data; } Lin…

海外代理IP网速快慢取决因素有哪些

在全球化日益加深的今天&#xff0c;海外代理IP成为许多用户进行跨境网络活动的重要工具。然而&#xff0c;用户在使用海外代理IP时&#xff0c;往往会遇到网速快慢不一的问题。本文将从多个角度探讨影响海外代理IP网速快慢的因素&#xff0c;帮助用户更好地理解并选择适合自己…

使用 prefetchComponents 进行组件预取

title: 使用 prefetchComponents 进行组件预取 date: 2024/8/17 updated: 2024/8/17 author: cmdragon excerpt: 摘要&#xff1a;本文介绍Nuxt.js中的prefetchComponents功能&#xff0c;用于预取组件以提高用户体验。通过在客户端后台下载和缓存组件&#xff0c;确保在用户…

普通人如何做文献阅读汇报?

最强小说推文——AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 用AI啊&#xff01;以前啃个文献小半天&#xff0c;现在AI 2min搞定&#xff0c;从提取核心论点、参考文献到摘要、翻…

如何将 Windows 11/10/8/7 克隆到另一台计算机

为什么需要将 Windows克隆到新计算机 “我有一台新笔记本电脑来替换我的旧电脑&#xff0c;因为它运行几年后变得越来越慢。我现在面临的问题是如何让 Windows 10、程序和文件与旧 PC 保持相同。我不想重新安装 Windows 和应用程序。有没有快速简便的方法可以做到这一点&#…

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一&#xff1a; nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求&#xff0c;如果没有显式定义&#xff0c;则会选取第一个定义的 server 作为 default_server。 server { …

数据结构——关于队列

1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出的特性 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头 2.队列的…