1. 程式人生 > >圓形目標中心點在tof相機座標系下的三維座標的計算(1)

圓形目標中心點在tof相機座標系下的三維座標的計算(1)

將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軸方向偏離較大時,圓形目標在相機場景下呈現橢圓狀態,後續對此進行了改進。