private Mat PerspectiveTransform(Mat image, MatOfPoint corners) { if (corners.size().area() <= 0 || corners.rows() < 4) { return(image); } Point[] pts = corners.toArray(); Point tl = pts[0]; Point tr = pts[1]; Point br = pts[2]; Point bl = pts[3]; double widthA = Math.Sqrt((br.x - bl.x) * (br.x - bl.x) + (br.y - bl.y) * (br.y - bl.y)); double widthB = Math.Sqrt((tr.x - tl.x) * (tr.x - tl.x) + (tr.y - tl.y) * (tr.y - tl.y)); int maxWidth = Math.Max((int)widthA, (int)widthB); double heightA = Math.Sqrt((tr.x - br.x) * (tr.x - br.x) + (tr.y - br.y) * (tr.y - br.y)); double heightB = Math.Sqrt((tl.x - bl.x) * (tl.x - bl.x) + (tl.y - bl.y) * (tl.y - bl.y)); int maxHeight = Math.Max((int)heightA, (int)heightB); maxWidth = (maxWidth < 1) ? 1 : maxWidth; maxHeight = (maxHeight < 1) ? 1 : maxHeight; Mat src = new Mat(); corners.convertTo(src, CvType.CV_32FC2); Mat dst = new Mat(4, 1, CvType.CV_32FC2); dst.put(0, 0, 0, 0, maxWidth - 1, 0, maxWidth - 1, maxHeight - 1, 0, maxHeight - 1); // compute and apply the perspective transformation matrix. Mat outputMat = new Mat(maxHeight, maxWidth, image.type(), new Scalar(0, 0, 0, 255)); Mat perspectiveTransform = Imgproc.getPerspectiveTransform(src, dst); Imgproc.warpPerspective(image, outputMat, perspectiveTransform, new Size(outputMat.cols(), outputMat.rows())); // return the transformed image. return(outputMat); }