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


相关推荐

  • QT之QFile[通俗易懂]

    QT之QFile[通俗易懂]1、QFile::QFile()构造一个没有名字的QFile对象2、QFile::QFile(constQString&name)构造一个以name为文件名的QFile对象。注:也可以QFile::QFile(),然后调用setName()方法来实现类似动作。3、bootQFile::atEnd()const[虚函数]如果已经到达文件末尾则返回TR

    2022年6月8日
    49
  • 简单网络管理协议SNMP(史上最全)

    简单网络管理协议SNMP(史上最全)简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案;由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能。现在,已经有了SNMPv3版本。SNMP版本…

    2022年10月17日
    3
  • Eclipse 安装 SVN 插件的两种方法「建议收藏」

    Eclipse 安装 SVN 插件的两种方法「建议收藏」Eclipse 安装 SVN 插件的两种方法

    2022年4月23日
    102
  • Java操作MongoDB

    Java操作MongoDB

    2022年3月12日
    65
  • LSTM和双向LSTM

    LSTM和双向LSTM文章目录1.RNN2.LSTM2.1简介2.2细胞状态2.3遗忘门2.4输入门2.5输出门3.双向LSTM(Bi-directionalLSTM)4.keras实现4.1LSTM模型4.2Bi-LSTM模型4.3训练模型4.4预测参考连接:https://www.cnblogs.com/Allen-rg/p/11712703.html1.RNN循环神经网络(RecurrentNeuralNetwork,RNN)是一种处理序列数据的网络。其中xt为t时刻的输入,h

    2022年6月16日
    42
  • 2014年度总结

    2014年度总结2015都过了近1个月了,早该好好总结一下了。   2014年,对我来说,意味着忙乱、匆促、迷惑、徘徊,还有最准确的表达:抉择!   还是老规矩,分别从生活、工作、学习三个维度来回顾。  【生活篇】   (1)陪伴妻儿     看着儿子一天天长大,仿佛每一天都有新的变化:从可以走路,到能说完整的句子,每一个关键事件,都让我和老婆欣喜不已!当

    2022年7月12日
    19

发表回复

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

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