请编写完整的函数 public Point2d refineSubPixel(Mat image, Point2d lower, Point2d upper) { // 提取感兴趣区域 Mat roi = new Mat(image, new Rect((int)lower.X, (int)lower.Y, (int)(upper.X - lower.X), (int)(upper.Y - lower.Y))); // 初始化初始点 Point2d refinedPoint = new Point2d(roi.cols() / 2.0, roi.rows() / 2.0); // 定义优化终止标准 TermCriteria termCriteria = new TermCriteria(CriteriaType.Iteration | CriteriaType.Epsilon, 20, 0.03); // 执行优化迭代 if ((roi.width() > 1) && (roi.height() > 1)) { Imgproc.pyrMeanShiftFiltering(roi, roi, 2, 2); Imgproc.cvtColor(roi, roi, Imgproc.COLOR_BGR2GRAY); Imgproc.threshold(roi, roi, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU); double[] derivX = new double[1]; double[] derivY = new double[1]; double[] hessian = new double[3]; for (int i = 0; i < termCriteria.maxCount; i++) { // 计算当前点周围的梯度信息 int x = (int)Math.round(refinedPoint.x); int y = (int)Math.round(refinedPoint.y); if (x <= 0 || y <= 0 || x >= roi.cols() - 1 || y >= roi.rows() - 1) break; derivX[0] = (roi.get(y, x + 1)[0] - roi.get(y, x - 1)[0]) / 2.0; derivY[0] = (roi.get(y + 1, x)[0] - roi.get(y - 1, x)[0]) / 2.0; hessian[0] = roi.get(y, x + 1)[0] + roi.get(y, x - 1)[0] - 2 * roi.get(y, x)[0]; hessian[1] = (roi.get(y + 1, x + 1)[0] - roi.get(y + 1, x - 1)[0] - roi.get(y -