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

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_crop
        result[:] = img
        for 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.1
            result_y = (i[1] + y1)/resize_scale/0.1
            result_r = i[2]/resize_scale/0.1
            points_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
  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿航626

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值