二维和三维联合进行圆孔空间定位

0.任务描述

  • 对空间圆孔进行三维空间的定位,方便后续的抓取或装配
  • 流程:使用二维图与opencv霍夫圆检测进行二维上的定位,再从深度图上查询深度信息,结合相机内参计算出相机坐标系下圆孔的三维坐标信息,并在点云上进行标注

1.二维定位与圆周点获取

  • 使用opencv霍夫圆检测,下段程序可以鼠标拖动来调整参数,检测到的圆心坐标和半径以x,y,r的顺序打印出来
  • 在图片相同路径下生成同名的txt文档,一共四行,分别是圆心x坐标,圆心y坐标,半径,圆周上若干点的坐标(格式x,y;x,y;)
import cv2
import numpy as np
from math import sin,cos# 更新阈值
def updateThreshold(x):# 缩放参数resize_scale = cv2.getTrackbarPos('resize_scale', 'param_select')# 裁减的坐标参数x1 = cv2.getTrackbarPos('x1', 'param_select')x2 = cv2.getTrackbarPos('x2', 'param_select')y1 = cv2.getTrackbarPos('y1', 'param_select')y2 = cv2.getTrackbarPos('y2', 'param_select')# 滤波参数blur_type = cv2.getTrackbarPos('blur_type', 'param_select')# 霍夫圆检测参数dp = cv2.getTrackbarPos('dp', 'param_select')minDist = cv2.getTrackbarPos('minDist', 'param_select')param1 = cv2.getTrackbarPos('param1', 'param_select')param2 = cv2.getTrackbarPos('param2', 'param_select')minRadius = cv2.getTrackbarPos('minRadius', 'param_select')maxRadius = cv2.getTrackbarPos('maxRadius', 'param_select')#在圆周上画出点num = cv2.getTrackbarPos('num', 'param_select')# 缩放操作img_resize = cv2.resize(img,None,fx=resize_scale*0.1,fy=resize_scale*0.1) cv2.imshow('resize', img_resize)# 裁减操作img_crop = img_resize[y1:y2, x1:x2]cv2.imshow('crop', img_crop)# 灰度化和滤波img_gray = cv2.cvtColor(img_crop, cv2.COLOR_BGR2GRAY)  img_blur = cv2.blur(img_gray, (2 * blur_type + 1, 2 * blur_type + 1))  cv2.imshow('img_blur', img_blur)# 检测主函数circles = cv2.HoughCircles(img_blur, cv2.HOUGH_GRADIENT, dp=dp, minDist=minDist, param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius)# 用于循环显示更新pro_result = np.zeros_like(img_crop)result = np.zeros_like(img)points_datas = datas+'.txt'if circles is not None:points_datas = open(points_datas,'w')circles = np.uint16(np.around(circles))print('circles numbers:', circles.shape[1])print('draw on image!') # 用于更新pro_result[:] = img_cropresult[:] = imgfor i in circles[0, :]:# 在预处理的图片上标记cv2.circle(pro_result, (i[0], i[1]), i[2], (0, 255, 0), 2)cv2.circle(pro_result, (i[0], i[1]), 2, (0, 0, 255), 3)# 计算坐标和半径result_x = (i[0] + x1)/resize_scale/0.1result_y = (i[1] + y1)/resize_scale/0.1result_r = i[2]/resize_scale/0.1points_datas.write(str(int(result_x))+'\n')points_datas.write(str(int(result_y))+'\n')points_datas.write(str(int(result_r))+'\n')#计算圆周上的点for i in range(num):points_x,points_y = int(result_r * cos(360/num*i) + result_x), int(result_r * sin(360/num*i) + result_y)cv2.circle(result, (int(points_x), int(points_y)), 2, (0, 0, 255), 10)# print(i,points_x,points_y)points_datas.write(str(int(points_x))+',' + str(int(points_y)) + ';')points_datas.write('\n')# 在原图片上标记cv2.circle(result, (int(result_x), int(result_y)), int(result_r), (0, 255, 8), 1)cv2.circle(result, (int(result_x), int(result_y)), 2, (0, 0, 255), 10)# 输出坐标和半径print(int(result_x), int(result_y), result_r)points_datas.close()else:print("No circles detected.")cv2.imshow('pro_result', pro_result)cv2.imshow('result', result)if __name__ == "__main__":# 载入图片datas = 'detectimages/example/depth_image_00000'img = cv2.imread(datas + '.png')# 创建显示框cv2.namedWindow('param_select', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)cv2.namedWindow('resize', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)cv2.namedWindow('crop', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)cv2.namedWindow('img_blur', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)cv2.namedWindow('pro_result', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)cv2.namedWindow('result', flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)# 创建滑动条 当滑动条有变化时调用updateThreshold函数cv2.createTrackbar('resize_scale','param_select',1,10,updateThreshold)cv2.createTrackbar('x1','param_select',0,3072,updateThreshold)cv2.createTrackbar('x2','param_select',3072,3072,updateThreshold)cv2.createTrackbar('y1','param_select',0,2048,updateThreshold)cv2.createTrackbar('y2','param_select',2048,2048,updateThreshold)cv2.createTrackbar('blur_type','param_select',3,5,updateThreshold)cv2.createTrackbar('dp','param_select',1,15,updateThreshold)cv2.createTrackbar('minDist','param_select',40,255,updateThreshold)cv2.createTrackbar('param1','param_select',70,255,updateThreshold)cv2.createTrackbar('param2','param_select',23,255,updateThreshold)cv2.createTrackbar('minRadius','param_select',10,255,updateThreshold)cv2.createTrackbar('maxRadius','param_select',30,255,updateThreshold)cv2.createTrackbar('num','param_select',1,360,updateThreshold)# 循环更新显示 空格退出while cv2.waitKey(0) != ord(' '):continue# 关闭所有窗口cv2.destroyAllWindows()

在这里插入图片描述

2.查询深度信息

  • 常用的深度图格式为png和tiff

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode算法题之floodfill算法---深搜(dfs)

本章目录 1.图像渲染2.岛屿数量3.岛屿的最大面积4.被围绕的区域5.太平洋大西洋水流问题6.扫雷游戏7.机器人的运动范围 1.图像渲染 图像渲染 class Solution {int dx[4] {0,0,1,-1};int dy[4] {1,-1,0,0};int newColor,prev;int m,n; public:vector<vector<int>&g…

【C++】带你学会使用C++线程库thread、原子库atomic、互斥量库mutex、条件变量库condition_variable

C线程相关知识讲解 前言正式开始C官方为啥要提供线程库thread构造函数代码演示this_threadget_id()yield()sleep_until和sleep_for mutex构造函数lock和unlock上锁全局锁局部锁lambda表达式 try_lock 其他锁时间锁递归版本专用锁recursive_mutex 锁的异常处理lock_guardunique_…

redis可视化工具 RedisInsight

redis可视化工具 RedisInsight 1、RedisInsight是什么2、下载RedisInsight3、使用RedisInsight4、其他redsi可视化工具 1、RedisInsight是什么 RedisInsight 是一个用于管理和监控 Redis 数据库的图形用户界面&#xff08;GUI&#xff09;工具。它是由 Redis Labs 开发的&…

IIS+SDK+VS2010+SP1+SQL server2012全套工具包及安装教程

前言 今天花了两个半小时安装这一整套配置&#xff0c;这个文章的目标是将安装时间缩短到1个小时 正文 安装步骤如下&#xff1a; VS2010 —> service pack 1 —>SQL server2012 —> IIS —> SDK 工具包链接如下&#xff1a; https://pan.baidu.com/s/1WQD-KfiUW…

python实现windows内存看门狗程序(带GUI界面)

python实现windows内存看门狗程序&#xff08;带GUI界面&#xff09; 效果图 1、程序核心 看门狗程序核心&#xff1a; 1、运行特定程序任务进程 2、监控任务管理器上的内存使用率 3、如果超过阈值则关闭该特定程序进程 4、重新开启该特定程序 5、重复过程2持续监控2、程序流…

三种主流流协议的浏览器播放解决方案

三种主流流协议的浏览器播放解决方案 流协议介绍 主流的流协议&#xff08;streaming protocol&#xff09;包括HLS、RTMP、RTSP&#xff0c;下面依次介绍下三种视频流。 HLS HLS&#xff08;Http Live Streaming) 是一个由苹果公司提出的基于HTTP的流媒体网络传输协议&…

【前端设计】文字聚光灯

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…

【霹雳吧啦】手把手带你入门语义分割の番外12:U2-Net 源码讲解(PyTorch)—— 网络的搭建

目录 前言 Preparation 一、U2-Net 网络结构图 二、U2-Net 网络源代码 1、model.py &#xff08;1&#xff09;ConvBNReLU 类 &#xff08;2&#xff09;DownConvBNReLU 类 &#xff08;3&#xff09;UpConvBNReLU 类 &#xff08;4&#xff09;RSU 类 & RSU4F 类…

并发(5)

目录 26.说说final类型的类如何扩展&#xff1f; 27.final方法可以被重载吗&#xff1f; 28.父类的final方法能不能被子类重写&#xff1f; 29.说说基本类型的final域重排序规则&#xff1f; 30.说说final的原理&#xff1f; 26.说说final类型的类如何扩展&#xff1f; 比…

IDEA 每次新建工程都要重新配置 Maven的解决方案

文章目录 IDEA 每次新建工程都要重新配置 Maven 解决方案一、选择 File -> New Projects Setup -> Settingsfor New Projects…二、选择 Build,Execution,Deployment -> Build Tools -> Maven IDEA 每次新建工程都要重新配置 Maven 解决方案 DEA 每次新建工程都要…

STM32之模拟IIC总线控制SHT20温湿度芯片

一、IIC总线概述 1、IIC总线介绍 I2C (Inter&#xff0d;Integrated Circuit)总线产生于在80年代&#xff0c; 由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备, 最初为音频和视频设备开发。I2C总线两线制包括&#xff1a;串行数据SDA&#xff08…

基于JAVA的服装店库存管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…