【问题标题】:Issue with OpenCV Warp perspective and euclidean distanceOpenCV Warp 透视和欧几里得距离的问题
【发布时间】:2016-08-16 17:12:11
【问题描述】:

我的程序使用 OpenCV 的 C# 端口来查找场景中最大的矩形并扭曲透视图。它几乎可以工作,但有一个非常烦人的错误,我就是想不通。

在正方形上使用它可以完美地工作,但它只能在一个方向的矩形上正常工作。

例如,如果我给它一张便条卡的图像,我会得到:

但如果我将同一张记事卡旋转 90 度,我会得到:

我知道查找矩形的代码是正确的,所以它必须在扭曲透视过程中,如下所示:

public Mat GetPerspective (List<Point> corners, Mat sub)
{
    //Pretty sure these four lines are the problem
    double top = Math.Sqrt(Math.Pow(corners[0].x - corners[1].x, 2) + Math.Pow(corners[0].y - corners[1].y, 2));
    double right = Math.Sqrt(Math.Pow(corners[1].x - corners[2].x, 2) + Math.Pow(corners[1].y - corners[2].y, 2));
    double bottom = Math.Sqrt(Math.Pow(corners[2].x - corners[3].x, 2) + Math.Pow(corners[2].y - corners[3].y, 2));
    double left = Math.Sqrt(Math.Pow(corners[3].x - corners[1].x, 2) + Math.Pow(corners[3].y - corners[1].y, 2));

    Mat quad = Mat.zeros(new Size(Math.Max(top, bottom), Math.Max(left, right)), CvType.CV_8UC3);
    List<Point> result_points = new List<Point>();

    result_points.Add(new Point(0,0));
    result_points.Add(new Point(quad.cols(), 0));
    result_points.Add(new Point(quad.cols(), quad.rows()));
    result_points.Add(new Point(0, quad.rows()));

    Mat cornerPts = Converters.vector_Point2f_to_Mat(corners);
    Mat resultPts = Converters.vector_Point2f_to_Mat(result_points);

    Mat transformation = Imgproc.getPerspectiveTransform(cornerPts, resultPts);
    Imgproc.warpPerspective(sub, quad, transformation, quad.size());
    return quad;
}

【问题讨论】:

  • 这与 Java 和 Android 有什么关系?
  • 我使用 OpenCv for unity 端口通过 enox 软件在统一内开发,这是 opencv java 的直接端口。所以通常当我遇到问题时,查看 java 文档而不是其他 c# 端口更容易。很抱歉造成混乱。

标签: java c# android opencv euclidean-distance


【解决方案1】:

试试这个

long[] tl = corners[0];

long[] tr = corners[1];

long[] br = corners[2];

long[] bl = corners[3];

float widthA = (float) Math.sqrt((Math.pow((br[0] - bl[0]), 2)) + Math.pow((br[1] - bl[1]), 2));

float widthB = (float) Math.sqrt((Math.pow((tr[0] - tl[0]), 2)) + Math.pow((tr[1] - tl[1]), 2));

int maxWidth = (int) Math.max((widthA), (widthB));

float heightA = (float) Math.sqrt((Math.pow((tr[0] - br[0]), 2)) + Math.pow((tr[1] - br[1]), 2));

float heightB = (float) Math.sqrt((Math.pow((tl[0] - bl[0]), 2)) + Math.pow((tl[1] - bl[1]), 2));

int maxHeight = (int) Math.max(heightA, heightB);

【讨论】:

  • 虽然只有代码的答案可能会提供解决方案,但它们被认为不是好的答案。请提供补充信息。解释您的代码的作用以及您使用/更改特定命令的原因。
猜你喜欢
  • 2013-03-02
  • 2015-07-15
  • 2014-02-04
  • 1970-01-01
  • 2020-09-13
  • 2021-10-01
  • 2012-12-21
相关资源
最近更新 更多