圆形目标中心点在tof相机坐标系下的三维坐标的计算(1)

圆形目标中心点在tof相机坐标系下的三维坐标的计算(1)将tof相机得到的深度图像转换为灰度图像,然后对灰度图像进行双边滤波,去除噪声的同时使边缘得到较好的保持,然后对滤波后的灰度图像进行hough圆变换,得到圆心在图像中的像素坐标,然后利用tof相机的点云数据,求得圆心在tof相机坐标系下的三维坐标。程序如下:#include”opencv2/core/core.hpp”#include”opencv2/highgui/highgui.h

大家好,又见面了,我是你们的朋友全栈君。

将tof相机得到的深度图像转换为灰度图像,然后对灰度图像进行双边滤波,去除噪声的同时使边缘得到较好的保持,然后对滤波后的灰度图像进行hough圆变换,得到圆心在图像中的像素坐标,然后利用tof相机的点云数据,求得圆心在tof相机坐标系下的三维坐标。
程序如下:

#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/features2d/features2d.hpp" //需要添加该头文件 
#include <iostream> 
#include "Math.h"

using namespace cv;
using namespace std;


int main(int argc, char**argv)
{
    Mat src, gray, edge, erzhitu, bifilter;
    //读入图像
    src = imread("D:\\yanxiaopan\\my project\\2017.2.22\\X\\250\\f.jpg");
    if (!src.data)
        return -1;
    //灰度化
    cvtColor(src, gray, CV_BGR2GRAY);
    //双边滤波,双边滤波既可以滤除噪声,也能较好的保持图像中的边缘
    bilateralFilter(gray, bifilter, 25, 25 * 2, 25 / 2);
    //huogh圆变换
    vector<Vec3f> circles;
    HoughCircles(bifilter, circles, HOUGH_GRADIENT, 1.5, 3, 50, 25, 0, 25);
    cout << "circles.size()=" << circles.size() << endl;
    Point final_center;
    for (size_t i = 0; i < circles.size(); i++)
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        final_center = center;
        int radius = cvRound(circles[i][2]);
        cout << "center(" << i << ")=(" << cvRound(circles[i][0]) << "," << cvRound(circles[i][1]) << ")" << endl;
        cout << "radius=" << radius << endl;
        circle(src, center, 1, Scalar(0, 255, 0), -1, 8, 0);
        circle(src, center, radius, Scalar(155, 50, 255), 1, 8, 0);
    }
    imshow("src", src);
    imshow("gray", gray);
    imshow("bifilter", bifilter);
    //读入点云数据
    FILE *fp = fopen("D:\\yanxiaopan\\my project\\2017.2.22\\X\\250\\clo31.txt", "r");
    if (fp == NULL)
    {
        cout << "file open error\n" << endl;
        return -1;
    }
    //将所有像素点的三维坐标分别保存在以下数组中
    double xx[25344];//所有像素点的x坐标
    double yy[25344];
    double zz[25344];

    for (int i = 0; i <25344; i++)
    {
        fscanf(fp, "%lf,%lf,%lf", &xx[i], &yy[i], &zz[i]);
    }
    fclose(fp);

    double center_x = xx[(final_center.x - 1) * 176 + final_center.y];
    double center_y = yy[(final_center.x - 1) * 176 + final_center.y];
    double center_z = zz[(final_center.x - 1) * 176 + final_center.y];
    cout << "center_x=" << center_x << endl;
    cout << "center_y=" << center_y << endl;
    cout << "center_z=" << center_z << endl;

    waitKey(0);
    return 0;
}

这里写图片描述
这里写图片描述
此方法计算出的圆心在相机下三维坐标与其实际值存在一定的误差,因圆形目标中心与相机中心在X轴或Y轴方向偏离较大时,圆形目标在相机场景下呈现椭圆状态,后续对此进行了改进。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141627.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • gom登录器配置教程_谷歌浏览器如何使用谷歌搜索引擎

    gom登录器配置教程_谷歌浏览器如何使用谷歌搜索引擎使用双引擎,让kbmmw 的客户端访问更方便

    2022年4月21日
    72
  • 10道线程池面试题

    10道线程池面试题面试题1:ThreadPoolExecutor有哪些常用的方法?ThreadPoolExecutor有如下常用方法:submit()/execute():执行线程池shutdown()/shutdownNow():终止线程池isShutdown():判断线程是否终止getActiveCount():正在运行的线程数getCorePoolSize():获取核心线程数getMaximumPoolSize():获取最大线程数getQueue():获取线程池中的任务队列allowCoreThr

    2022年5月26日
    40
  • windows安装mysql8.0_windows7哪个版本功能最多

    windows安装mysql8.0_windows7哪个版本功能最多Windows系统Mysql8.0.28的安装教程

    2022年9月14日
    2
  • python中unittest框架_unittest框架原理

    python中unittest框架_unittest框架原理unittest简介参考:https://urlify.cn/e6rAr2为什么要使用unittest在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行。使用测试框架可以互不影响的用例执行及更灵活的执行控制。unittest特点 •python自带的单元测试框架,无需安装; •用例执行互不干扰; •提供不同范围的setUp(测试准备)和t..

    2022年10月10日
    2
  • 正则表达式

    正则表达式

    2022年1月15日
    45
  • DataLoader详解

    DataLoader详解对数据集处理虽说很方便但在参数选取和其他的细节方面还容易出问题,尤其是最后一个Batch长度不足,会导致输出维度发生问题,若直接舍去,我还想要全部的数据结果使用方法①创建一个Dataset对象②创建一个DataLoader对象③循环这个DataLoader对象,将xx,xx加载到模型中进行训练train_loader=DataLoader(dataset,batch_size=batch_size,shuffle=shuffle,collate_fn=pad

    2022年5月4日
    74

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号