/*************霍夫圆检测**********************************************************/
cv::Point cir_cent; /*圆心坐标*/
int rad = 0; /*圆的半径*/
cv::cvtColor(liujiaoxing, liujiaoxing, cv::COLOR_BGR2GRAY); /*图像灰度化*/
vector<cv::Vec3f> circles;
//第五个参数 是圆心与圆心之间的距离
//第六个参数 就设为默认值就OK
//第七个参数这个根据你的图像中的圆 大小设置,如果圆越小,则设置越小
//第八个和第九个参数 是你检测圆 最小半径和最大半径是多少 这个是经验值
cv::HoughCircles(liujiaoxing, circles, CV_HOUGH_GRADIENT,1,1000, 100,10,30,500);
//cv::HoughCircles(liujiaoxing, circles, CV_HOUGH_GRADIENT, 2, 100000, 100, 100, 30, 300); /*霍夫圆*/
cir_cent = cv::Point(circles[0][0], circles[0][1]); /*获得圆心坐标*/
rad = circles[0][2]; /*获得圆的半径*/
cv::Mat dst = liujiaoxing.clone();
cv::cvtColor(dst, dst, cv::COLOR_GRAY2BGR);
//绘制圆心和半径
circle(dst, cir_cent, 3, cv::Scalar(0, 0, 255), -1, 8, 0);
circle(dst, cir_cent, rad, cv::Scalar(0, 255, 0), 3, 8, 0);
pcl::PointXYZRGB centPoint;
float centPointd = depimage.at<float>(detectData.at<float>(0, 1)+cir_cent.y,detectData.at<float>(0, 0)+cir_cent.x);
if (centPointd == 0)
{
cout << "exit exit exit exit" << endl;
return 0;
}
centPoint.z = float(centPointd) / intrinsics.ptr<float>(2)[2];
centPoint.x = (detectData.at<float>(0, 0)+cir_cent.x - intrinsics.ptr<float>(0)[2]) * centPoint.z / intrinsics.ptr<float>(0)[0];
centPoint.y = (detectData.at<float>(0, 1)+cir_cent.y - intrinsics.ptr<float>(1)[2]) * centPoint.z / intrinsics.ptr<float>(1)[1];
// double scale=1.0;
// cv::Size dsize = cv::Size(dst.cols*scale,dst.rows*scale);
// cv::Mat image2 = cv::Mat(dsize,CV_8U);
// cv::resize(dst, image2, dsize);
// cv::namedWindow("Poly1");
// cv::imshow("Poly1", image2);
// cv::waitKey();
霍夫算法求ROI的圆心(2维)--将圆心通过整幅图的深度图转换为三维点
最新推荐文章于 2023-05-28 10:26:22 发布