圓形目標中心點在tof相機座標系下的三維座標的計算(1)
阿新 • • 發佈:2019-02-07
將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軸方向偏離較大時,圓形目標在相機場景下呈現橢圓狀態,後續對此進行了改進。