圆形目标中心点在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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数百万辆汽车的最强大脑——云端车联网架构实战

    数百万辆汽车的最强大脑——云端车联网架构实战

    2022年3月6日
    52
  • 信号处理中包络是什么意思_重庆邮电大学复试通信原理

    信号处理中包络是什么意思_重庆邮电大学复试通信原理第一章绪论1.基带信号的定义基带信号是指信号的频谱从零频附近开始的,没有经过调制的信号2.什么是数字信号和模拟信号?二者的区别是什么?数字信号是信号参量的取值是离散的,模拟信号是信号参量的取值是连续的。区别是信号参量的取值是连续还是离散。3.什么是数字通信?描述数字通信系统的主要优缺点?数字通信就是用数字信号传输信息的通信系统。数字通信系统的优点有差错可控,抗干扰能力强,易于存储,处理和…

    2022年8月10日
    8
  • maven jar 中没有主清单属性「建议收藏」

    maven jar 中没有主清单属性「建议收藏」mavenjar中没有主清单属性

    2025年9月12日
    8
  • Linux中修改文件权限方法「建议收藏」

    Linux中修改文件权限方法「建议收藏」​一、文件类型在Linux操作系统中,一切皆文件,Linux不以扩展名来区分文件类型,而是在文件属性中有一列专门记录文件类型。普通文件:.c.cpp.h.txt.pdf用’-‘表示目录文件(文件夹):用’d‘表示管道文件(用于进程间通信的一种文件):用’p’表示链接文件(相当于Windows上的快捷方式):用’l’表示设备文件:字符设备文件(c)块设备文件(b)套接字(s)用ls-l查看文件属性信息

    2025年8月30日
    6
  • 5分钟入门mp4文件格式是多少_Mp4格式

    5分钟入门mp4文件格式是多少_Mp4格式写在前面本文主要内容包括,什么是MP4、MP4文件的基本结构、Box的基本结构、常见且重要的box介绍、普通MP4与fMP4的区别、如何通过代码解析MP4文件等。写作背景:最近经常回答团队小伙伴关于直播&短视频的问题,比如“flv.js的实现原理”、“为什么设计同学给的mp4文件浏览器里播放不了、但本地可以正常播放”、“MP4兼容性很好,可不可以用来做直播”等。在解答的过程中,发现经常涉及MP4协议的介绍。之前这块有简单了解过并做了笔记,这里稍微整理一下,顺便作为团队参考文档,如

    2022年10月16日
    2
  • 请慎用ASP.Net的validateRequest=”false”属性

    请慎用ASP.Net的validateRequest=”false”属性阅读全文下载代码:http://www.cckan.net/forum.php?mod=viewthread&tid=74在客户端的文体框里输入“例如”等字符的时候为出现这样的错误序安全的尝试,如跨站点的脚本攻击。通过在Page指令或配置节中设置validateRequest=false可以禁用请求验证。但是,在这种情况下,强烈建议应用程序显式检查所有输入。 异常

    2022年6月10日
    31

发表回复

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

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