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


相关推荐

  • 指针基础知识笔记

    指针基础知识笔记指针式C语言中的重要概念,也是C语言的一个重要特色,C的精华所在吧。1.指针-内存地址;2.指针变量:定义为,存放指向存储什么数据类型的地址的变量;它的值就是地址; 定义指针变量: 类型名*指针变量名;//类型名就是指向地址上的数据的类型; 例如: char*pa; int*pb;(注意的是):避免访问未初始化的指针; 3.取地址运算符:&获取某个变量的地址;//初始化指针; 例如:(chara;intb); char

    2022年5月1日
  • hive的数据存储(元数据,表数据)和内部表,外部表,分区表的创建和区别作用

    hive的数据存储(元数据,表数据)和内部表,外部表,分区表的创建和区别作用hive的数据存储(元数据,表数据)和内部表,外部表,分区表的创建和区别作用

    2022年4月23日
  • js nextSibling属性和previousSibling属性

    js nextSibling属性和previousSibling属性   1:nextSibling属性       该属性表示当前节点的下一个节点(其后的节点与当前节点同属一个级别);如果其后没有与其同级的节点,则返回null。      需要特别注意的是:该属性在不同的浏览器中的执行结果并不都相同,见下面例示:     先来看一个例子: [javascript] viewplain copy&lt;body&gt;  &lt;div&gt;  &lt;…

    2022年7月15日
  • html session修改,session.setattribute

    html session修改,session.setattribute关于JSP的session.setAttribute()方法是做什么用session对象的方法setAttribute()有什么具体作用啊,请详细点,不设置行吗?session.setAttribute(“username”,username);session.setAttribute(“username”,username);将后者的username内容放到前者username中并保存起来…

    2022年10月17日
  • volatile禁止指令重排的原理_警告禁止指令提示颜色顺序

    volatile禁止指令重排的原理_警告禁止指令提示颜色顺序Volatile禁止指令重排什么是指令重排?你写的程序,计算机并不是按照你写的那样去执行的。源代码->编译器优化的重排->指令并行可能会重排->内存系统可能会重排->执行处理器在进行指令重排的时候,考虑,数据之间的依赖性!指令重排不会造成影响的例子intx=1;//1inty=2;//2x=x+5;//3y=x*x;//4我们所期望的:1234执行的时候可能会变成21341324但是不可能是4321

    2022年10月17日
  • 使用 Linux 命令行发送邮件

    使用 Linux 命令行发送邮件mailx与sendmail辨析mailx是邮件客户端。人们可以使用它编写邮件,然后把邮件传递给本地的邮件传输服务器。sendmail是邮件服务器。它可以与远端的邮件服务器通信,收发邮件

    2022年7月2日

发表回复

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

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