Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenCV扭曲透视和欧几里德距离问题_Java_C#_Android_Opencv_Euclidean Distance - Fatal编程技术网

Java OpenCV扭曲透视和欧几里德距离问题

Java OpenCV扭曲透视和欧几里德距离问题,java,c#,android,opencv,euclidean-distance,Java,C#,Android,Opencv,Euclidean Distance,我的程序使用OpenCV的C#端口查找场景中最大的矩形并扭曲透视图。它几乎可以工作,但有一个非常恼人的错误,我就是想不出来 在正方形上使用它可以完美地工作,但它只能在一个方向的矩形上正确工作 例如,如果我给它一张便笺卡的图像,我会得到: 但如果我把同一张卡片旋转90度,我会得到: 我知道查找矩形的代码是正确的,因此它必须在扭曲透视过程中,如下所示: public Mat GetPerspective (List<Point> corners, Mat sub) { //P

我的程序使用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;
}
public Mat GetPerspective(列出角点,Mat sub)
{
//很确定这四条线就是问题所在
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.zero(新大小(Math.Max(顶部,底部),Math.Max(左侧,右侧)),CvType.CV_8UC3);
列表结果_点=新列表();
结果_点。添加(新点(0,0));
结果_points.Add(新点(quad.cols(),0));
结果_points.Add(新点(quad.cols(),quad.rows());
结果_points.Add(新点(0,quad.rows());
Mat cornerPts=转换器。向量_点2f_到_Mat(角);
Mat resultPts=转换器。向量_点2f_到_Mat(结果_点);
Mat transformation=Imgproc.getPerspectiveTransform(cornerPts,resultPts);
warpPerspective(sub,quad,transformation,quad.size());
返回四元组;
}
试试这个

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);
试试这个

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);

这与Java和Android有什么关系?我在unity中使用enox软件的OpenCv for unity端口进行开发,它是OpenCv Java的直接端口。因此,通常当我遇到问题时,查看java文档比查看其他c#Port更容易。抱歉混淆了。这与Java和Android有什么关系?我在unity中使用enox软件的OpenCv for unity端口进行开发,这是OpenCv Java的直接端口。因此,通常当我遇到问题时,查看java文档比查看其他c#Port更容易。抱歉造成混淆。虽然纯代码答案可能提供解决方案,但它们被视为不好的答案。请提供补充资料。解释您的代码的作用以及您使用/更改特定命令的原因。虽然纯代码答案可能提供解决方案,但它们被视为不好的答案。请提供补充资料。解释代码的作用以及使用/更改特定命令的原因。