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

server/2024/10/16 2:22:59/

纲要

在这里插入图片描述

摄像头驱动

在这里插入图片描述

图像属性

在这里插入图片描述

图像压缩

在这里插入图片描述### 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 Imageclass 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.shapeif 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 eif __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.ppmy.cn/server/101972.html

相关文章

NVDLA专题10:具体模块介绍——Planar Data Processor

概述 平面数据处理器(Planar Data Processor, PDP)沿宽x高的前两个维度平面执行操作&#xff0c;在NVDLA版中&#xff0c;PDPD旨在实现池化层&#xff0c;module定义在NV_NVDLA_pdp.v。支持最大、最小和平均池化方法。平面内的几个相邻输入元素将被发送到非线性函数来计算一个…

讲解机器学习中的 K-均值聚类算法及其优缺点。

K-均值聚类算法是机器学习中一种常用的无监督学习算法&#xff0c;用于将数据集中的样本分为 K 个不同的类别。 算法步骤如下&#xff1a; 选择 K 个初始的中心点&#xff08;聚类中心&#xff09;作为初始的类别中心。将数据集中的每个样本点分配到距离其最近的中心点所在的…

了解Android

Android 系统架构 从图中可以看出&#xff0c;整个Android操作系统分为五层。它们分别是&#xff1a; 内核层 Android系统是基于Linux内核的&#xff0c;这一层为Android设备的各种硬件提供了底层的驱动。硬件抽象层 该层为硬件厂商定义了一套标准的接口。这样可以在不影响上层…

HarmonyOS开发:长列表界面实现详解(使用懒加载)

目录 前言长列表界面开发挑战关于懒加载HarmonyOS中的LazyForEach组件的创建关于长列表拖拽排序番外篇:NodeAdapter使用结束语前言 随着大数据的快速发展,在移动应用开发中,多数据的长列表是非常常见的情况,需要允许用户浏览大量的数据项,比如商品列表、新闻资讯等。但是长…

7.实时时钟(RTC)

理论 使用时钟晶振&#xff1a;32.768KHz(2{15}) 代码编写 OLED显示实时时间&#xff0c;串口打印 晶体、RTC配置 晶体配置 RTC配置 串口配置参考&#xff1a;链接 Cube IDE代码 mian.c /* USER CODE BEGIN Includes */ #include "string.h" //27行 /* USER CODE EN…

基于springboot的智能家居系统

TOC springboot198基于springboot的智能家居系统 研究背景与现状 时代的进步使人们的生活实现了部分自动化&#xff0c;由最初的全手动办公已转向手动自动相结合的方式。比如各种办公系统、智能电子电器的出现&#xff0c;都为人们生活的享受提供帮助。采用新型的自动化方式…

苹果上架没有iphone、没有ipad也可以生成截屏

使用flutter、uniapp或其他跨平台框架开发ios的APP&#xff0c;上架的时候都会遇到一个问题&#xff0c;上架的时候需要各种尺寸的设备来做ios截屏。 比如目前最新的要求是&#xff0c;iphone需要三种不同尺寸的设备的截屏&#xff0c;假如支持ipad则还需要使用ipad 2代和ipad…

斗破C++编程入门系列之四:运算符和表达式

斗破C目录&#xff1a; 斗破C编程入门系列之前言&#xff08;斗之气三段&#xff09; 斗破C编程入门系列之二&#xff1a;Qt的使用介绍&#xff08;斗之气三段&#xff09; 斗破C编程入门系列之三&#xff1a;数据结构&#xff08;斗之气三段&#xff09; 斗破C编程入门系列之…