root/modules/imgproc/misc/java/test/ImgprocTest.java

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. setUp
  2. testAccumulateMatMat
  3. testAccumulateMatMatMat
  4. testAccumulateProductMatMatMat
  5. testAccumulateProductMatMatMatMat
  6. testAccumulateSquareMatMat
  7. testAccumulateSquareMatMatMat
  8. testAccumulateWeightedMatMatDouble
  9. testAccumulateWeightedMatMatDoubleMat
  10. testAdaptiveThreshold
  11. testApproxPolyDP
  12. testArcLength
  13. testBilateralFilterMatMatIntDoubleDouble
  14. testBilateralFilterMatMatIntDoubleDoubleInt
  15. testBlurMatMatSize
  16. testBlurMatMatSizePoint
  17. testBlurMatMatSizePointInt
  18. testBoundingRect
  19. testBoxFilterMatMatIntSize
  20. testBoxFilterMatMatIntSizePointBoolean
  21. testBoxFilterMatMatIntSizePointBooleanInt
  22. testCalcBackProject
  23. testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloat
  24. testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloat2D
  25. testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloat3D
  26. testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloatBoolean
  27. testCannyMatMatDoubleDouble
  28. testCannyMatMatDoubleDoubleIntBoolean
  29. testCompareHist
  30. testContourAreaMat
  31. testContourAreaMatBoolean
  32. testConvertMapsMatMatMatMatInt
  33. testConvertMapsMatMatMatMatIntBoolean
  34. testConvexHullMatMat
  35. testConvexHullMatMatBooleanBoolean
  36. testConvexityDefects
  37. testCornerEigenValsAndVecsMatMatIntInt
  38. testCornerEigenValsAndVecsMatMatIntIntInt
  39. testCornerHarrisMatMatIntIntDouble
  40. testCornerHarrisMatMatIntIntDoubleInt
  41. testCornerMinEigenValMatMatInt
  42. testCornerMinEigenValMatMatIntInt
  43. testCornerMinEigenValMatMatIntIntInt
  44. testCornerSubPix
  45. testCvtColorMatMatInt
  46. testCvtColorMatMatIntInt
  47. testDilateMatMatMat
  48. testDilateMatMatMatPoint
  49. testDilateMatMatMatPointInt
  50. testDilateMatMatMatPointIntInt
  51. testDilateMatMatMatPointIntIntScalar
  52. testDistanceTransformWithLabels
  53. testDrawContoursMatListOfMatIntScalar
  54. testDrawContoursMatListOfMatIntScalarInt
  55. testDrawContoursMatListOfMatIntScalarIntIntMatIntPoint
  56. testEqualizeHist
  57. testErodeMatMatMat
  58. testErodeMatMatMatPointInt
  59. testErodeMatMatMatPointIntIntScalar
  60. testFilter2DMatMatIntMat
  61. testFilter2DMatMatIntMatPointDouble
  62. testFilter2DMatMatIntMatPointDoubleInt
  63. testFindContoursMatListOfMatMatIntInt
  64. testFindContoursMatListOfMatMatIntIntPoint
  65. testFitEllipse
  66. testFitLine
  67. testFloodFillMatMatPointScalar
  68. testFloodFillMatMatPointScalar_WithoutMask
  69. testFloodFillMatMatPointScalarRect
  70. testFloodFillMatMatPointScalarRectScalar
  71. testFloodFillMatMatPointScalarRectScalarScalar
  72. testFloodFillMatMatPointScalarRectScalarScalarInt
  73. testGaussianBlurMatMatSizeDouble
  74. testGaussianBlurMatMatSizeDoubleDouble
  75. testGaussianBlurMatMatSizeDoubleDoubleInt
  76. testGetAffineTransform
  77. testGetDefaultNewCameraMatrixMat
  78. testGetDefaultNewCameraMatrixMatSizeBoolean
  79. testGetDerivKernelsMatMatIntIntInt
  80. testGetDerivKernelsMatMatIntIntIntBooleanInt
  81. testGetGaussianKernelIntDouble
  82. testGetGaussianKernelIntDoubleInt
  83. testGetPerspectiveTransform
  84. testGetRectSubPixMatSizePointMat
  85. testGetRectSubPixMatSizePointMatInt
  86. testGetRotationMatrix2D
  87. testGetStructuringElementIntSize
  88. testGetStructuringElementIntSizePoint
  89. testGoodFeaturesToTrackMatListOfPointIntDoubleDouble
  90. testGoodFeaturesToTrackMatListOfPointIntDoubleDoubleMatIntBooleanDouble
  91. testGrabCutMatMatRectMatMatInt
  92. testGrabCutMatMatRectMatMatIntInt
  93. testHoughCirclesMatMatIntDoubleDouble
  94. testHoughCirclesMatMatIntDoubleDouble1
  95. testHoughCirclesMatMatIntDoubleDoubleDoubleDoubleIntInt
  96. testHoughLinesMatMatDoubleDoubleInt
  97. testHoughLinesMatMatDoubleDoubleIntDouble
  98. testHoughLinesMatMatDoubleDoubleIntDoubleDouble
  99. testHoughLinesPMatMatDoubleDoubleInt
  100. testHoughLinesPMatMatDoubleDoubleIntDouble
  101. testHoughLinesPMatMatDoubleDoubleIntDoubleDouble
  102. testHuMoments
  103. testInitUndistortRectifyMap
  104. testInitWideAngleProjMapMatMatSizeIntIntMatMat
  105. testInitWideAngleProjMapMatMatSizeIntIntMatMatInt
  106. testInitWideAngleProjMapMatMatSizeIntIntMatMatIntDouble
  107. testIntegral2MatMatMat
  108. testIntegral2MatMatMatInt
  109. testIntegral3MatMatMatMat
  110. testIntegral3MatMatMatMatInt
  111. testIntegralMatMat
  112. testIntegralMatMatInt
  113. testInvertAffineTransform
  114. testIsContourConvex
  115. testLaplacianMatMatInt
  116. testLaplacianMatMatIntIntDoubleDouble
  117. testLaplacianMatMatIntIntDoubleDoubleInt
  118. testMatchShapes
  119. testMatchTemplate
  120. testMedianBlur
  121. testMinAreaRect
  122. testMinEnclosingCircle
  123. testMomentsMat
  124. testMomentsMatBoolean
  125. testMorphologyExMatMatIntMat
  126. testMorphologyExMatMatIntMatPointInt
  127. testMorphologyExMatMatIntMatPointIntIntScalar
  128. testPointPolygonTest
  129. testPreCornerDetectMatMatInt
  130. testPreCornerDetectMatMatIntInt
  131. testPyrDownMatMat
  132. testPyrDownMatMatSize
  133. testPyrMeanShiftFilteringMatMatDoubleDouble
  134. testPyrMeanShiftFilteringMatMatDoubleDoubleInt
  135. testPyrMeanShiftFilteringMatMatDoubleDoubleIntTermCriteria
  136. testPyrUpMatMat
  137. testPyrUpMatMatSize
  138. testRemapMatMatMatMatInt
  139. testRemapMatMatMatMatIntIntScalar
  140. testResizeMatMatSize
  141. testResizeMatMatSizeDoubleDoubleInt
  142. testScharrMatMatIntIntInt
  143. testScharrMatMatIntIntIntDoubleDouble
  144. testScharrMatMatIntIntIntDoubleDoubleInt
  145. testSepFilter2DMatMatIntMatMat
  146. testSepFilter2DMatMatIntMatMatPointDouble
  147. testSepFilter2DMatMatIntMatMatPointDoubleInt
  148. testSobelMatMatIntIntInt
  149. testSobelMatMatIntIntIntIntDoubleDouble
  150. testSobelMatMatIntIntIntIntDoubleDoubleInt
  151. testThreshold
  152. testUndistortMatMatMatMat
  153. testUndistortMatMatMatMatMat
  154. testUndistortPointsListOfPointListOfPointMatMat
  155. testWarpAffineMatMatMatSize
  156. testWarpAffineMatMatMatSizeInt
  157. testWarpAffineMatMatMatSizeIntInt
  158. testWarpAffineMatMatMatSizeIntIntScalar
  159. testWarpPerspectiveMatMatMatSize
  160. testWarpPerspectiveMatMatMatSizeInt
  161. testWarpPerspectiveMatMatMatSizeIntInt
  162. testWarpPerspectiveMatMatMatSizeIntIntScalar
  163. testWatershed
  164. testGetTextSize
  165. testCircleMatPointIntScalar
  166. testCircleMatPointIntScalarInt
  167. testCircleMatPointIntScalarIntIntInt
  168. testClipLine
  169. testEllipse2Poly
  170. testEllipseMatPointSizeDoubleDoubleDoubleScalar
  171. testEllipseMatPointSizeDoubleDoubleDoubleScalarInt
  172. testEllipseMatPointSizeDoubleDoubleDoubleScalarIntIntInt
  173. testEllipseMatRotatedRectScalar
  174. testEllipseMatRotatedRectScalarInt
  175. testEllipseMatRotatedRectScalarIntInt
  176. testPolylinesMatListOfListOfPointBooleanScalar
  177. testPolylinesMatListOfListOfPointBooleanScalarInt
  178. testPolylinesMatListOfListOfPointBooleanScalarIntIntInt
  179. testPutTextMatStringPointIntDoubleScalar
  180. testPutTextMatStringPointIntDoubleScalarInt
  181. testPutTextMatStringPointIntDoubleScalarIntIntBoolean

package org.opencv.test.imgproc;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfInt;
import org.opencv.core.MatOfInt4;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.RotatedRect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.core.TermCriteria;
import org.opencv.imgproc.Imgproc;
import org.opencv.test.OpenCVTestCase;

public class ImgprocTest extends OpenCVTestCase {

    Point anchorPoint;
    private int imgprocSz;
    Size size;

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        imgprocSz = 2;
        anchorPoint = new Point(2, 2);
        size = new Size(3, 3);
    }

    public void testAccumulateMatMat() {
        Mat src = getMat(CvType.CV_64F, 2);
        Mat dst = getMat(CvType.CV_64F, 0);
        Mat dst2 = src.clone();

        Imgproc.accumulate(src, dst);
        Imgproc.accumulate(src, dst2);

        assertMatEqual(src, dst, EPS);
        assertMatEqual(getMat(CvType.CV_64F, 4), dst2, EPS);
    }

    public void testAccumulateMatMatMat() {
        Mat src = getMat(CvType.CV_64F, 2);
        Mat mask = makeMask(getMat(CvType.CV_8U, 1));
        Mat dst = getMat(CvType.CV_64F, 0);
        Mat dst2 = src.clone();

        Imgproc.accumulate(src, dst, mask);
        Imgproc.accumulate(src, dst2, mask);

        assertMatEqual(makeMask(getMat(CvType.CV_64F, 2)), dst, EPS);
        assertMatEqual(makeMask(getMat(CvType.CV_64F, 4), 2), dst2, EPS);
    }

    public void testAccumulateProductMatMatMat() {
        Mat src = getMat(CvType.CV_64F, 2);
        Mat dst = getMat(CvType.CV_64F, 0);
        Mat dst2 = src.clone();

        Imgproc.accumulateProduct(src, src, dst);
        Imgproc.accumulateProduct(src, dst, dst2);

        assertMatEqual(getMat(CvType.CV_64F, 4), dst, EPS);
        assertMatEqual(getMat(CvType.CV_64F, 10), dst2, EPS);
    }

    public void testAccumulateProductMatMatMatMat() {
        Mat src = getMat(CvType.CV_64F, 2);
        Mat mask = makeMask(getMat(CvType.CV_8U, 1));
        Mat dst = getMat(CvType.CV_64F, 0);
        Mat dst2 = src.clone();

        Imgproc.accumulateProduct(src, src, dst, mask);
        Imgproc.accumulateProduct(src, dst, dst2, mask);

        assertMatEqual(makeMask(getMat(CvType.CV_64F, 4)), dst, EPS);
        assertMatEqual(makeMask(getMat(CvType.CV_64F, 10), 2), dst2, EPS);
    }

    public void testAccumulateSquareMatMat() {
        Mat src = getMat(CvType.CV_64F, 2);
        Mat dst = getMat(CvType.CV_64F, 0);
        Mat dst2 = src.clone();

        Imgproc.accumulateSquare(src, dst);
        Imgproc.accumulateSquare(src, dst2);

        assertMatEqual(getMat(CvType.CV_64F, 4), dst, EPS);
        assertMatEqual(getMat(CvType.CV_64F, 6), dst2, EPS);
    }

    public void testAccumulateSquareMatMatMat() {
        Mat src = getMat(CvType.CV_64F, 2);
        Mat mask = makeMask(getMat(CvType.CV_8U, 1));
        Mat dst = getMat(CvType.CV_64F, 0);
        Mat dst2 = src.clone();

        Imgproc.accumulateSquare(src, dst, mask);
        Imgproc.accumulateSquare(src, dst2, mask);

        assertMatEqual(makeMask(getMat(CvType.CV_64F, 4)), dst, EPS);
        assertMatEqual(makeMask(getMat(CvType.CV_64F, 6), 2), dst2, EPS);
    }

    public void testAccumulateWeightedMatMatDouble() {
        Mat src = getMat(CvType.CV_64F, 2);
        Mat dst = getMat(CvType.CV_64F, 4);
        Mat dst2 = src.clone();

        Imgproc.accumulateWeighted(src, dst, 0.5);
        Imgproc.accumulateWeighted(src, dst2, 2);

        assertMatEqual(getMat(CvType.CV_64F, 3), dst, EPS);
        assertMatEqual(getMat(CvType.CV_64F, 2), dst2, EPS);
    }

    public void testAccumulateWeightedMatMatDoubleMat() {
        Mat src = getMat(CvType.CV_64F, 2);
        Mat mask = makeMask(getMat(CvType.CV_8U, 1));
        Mat dst = getMat(CvType.CV_64F, 4);
        Mat dst2 = src.clone();

        Imgproc.accumulateWeighted(src, dst, 0.5, mask);
        Imgproc.accumulateWeighted(src, dst2, 2, mask);

        assertMatEqual(makeMask(getMat(CvType.CV_64F, 3), 4), dst, EPS);
        assertMatEqual(getMat(CvType.CV_64F, 2), dst2, EPS);
    }

    public void testAdaptiveThreshold() {
        Mat src = makeMask(getMat(CvType.CV_8U, 50), 20);
        Mat dst = new Mat();

        Imgproc.adaptiveThreshold(src, dst, 1, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 3, 0);

        assertEquals(src.rows(), Core.countNonZero(dst));
    }

    public void testApproxPolyDP() {
        MatOfPoint2f curve = new MatOfPoint2f(new Point(1, 3), new Point(2, 4), new Point(3, 5), new Point(4, 4), new Point(5, 3));

        MatOfPoint2f approxCurve = new MatOfPoint2f();

        Imgproc.approxPolyDP(curve, approxCurve, EPS, true);

        List<Point> approxCurveGold =  new ArrayList<Point>(3);
        approxCurveGold.add(new Point(1, 3));
        approxCurveGold.add(new Point(3, 5));
        approxCurveGold.add(new Point(5, 3));

        assertListPointEquals(approxCurve.toList(), approxCurveGold, EPS);
    }

    public void testArcLength() {
        MatOfPoint2f curve = new MatOfPoint2f(new Point(1, 3), new Point(2, 4), new Point(3, 5), new Point(4, 4), new Point(5, 3));

        double arcLength = Imgproc.arcLength(curve, false);

        assertEquals(5.656854249, arcLength, 0.000001);
    }

    public void testBilateralFilterMatMatIntDoubleDouble() {
        Imgproc.bilateralFilter(gray255, dst, 5, 10, 5);

        assertMatEqual(gray255, dst);
        // TODO_: write better test
    }

    public void testBilateralFilterMatMatIntDoubleDoubleInt() {
        Imgproc.bilateralFilter(gray255, dst, 5, 10, 5, Core.BORDER_REFLECT);

        assertMatEqual(gray255, dst);
        // TODO_: write better test
    }

    public void testBlurMatMatSize() {
        Imgproc.blur(gray0, dst, size);
        assertMatEqual(gray0, dst);

        Imgproc.blur(gray255, dst, size);
        assertMatEqual(gray255, dst);
        // TODO_: write better test
    }

    public void testBlurMatMatSizePoint() {
        Imgproc.blur(gray0, dst, size, anchorPoint);
        assertMatEqual(gray0, dst);
        // TODO_: write better test
    }

    public void testBlurMatMatSizePointInt() {
        Imgproc.blur(gray0, dst, size, anchorPoint, Core.BORDER_REFLECT);
        assertMatEqual(gray0, dst);
        // TODO_: write better test
    }

    public void testBoundingRect() {
        MatOfPoint points = new MatOfPoint(new Point(0, 0), new Point(0, 4), new Point(4, 0), new Point(4, 4));
        Point p1 = new Point(1, 1);
        Point p2 = new Point(-5, -2);

        Rect bbox = Imgproc.boundingRect(points);

        assertTrue(bbox.contains(p1));
        assertFalse(bbox.contains(p2));
    }

    public void testBoxFilterMatMatIntSize() {
        Size size = new Size(3, 3);
        Imgproc.boxFilter(gray0, dst, 8, size);
        assertMatEqual(gray0, dst);
        // TODO_: write better test
    }

    public void testBoxFilterMatMatIntSizePointBoolean() {
        Imgproc.boxFilter(gray255, dst, 8, size, anchorPoint, false);
        assertMatEqual(gray255, dst);
        // TODO_: write better test
    }

    public void testBoxFilterMatMatIntSizePointBooleanInt() {
        Imgproc.boxFilter(gray255, dst, 8, size, anchorPoint, false, Core.BORDER_REFLECT);
        assertMatEqual(gray255, dst);
        // TODO_: write better test
    }

    public void testCalcBackProject() {
        List<Mat> images = Arrays.asList(grayChess);
        MatOfInt channels = new MatOfInt(0);
        MatOfInt histSize = new MatOfInt(10);
        MatOfFloat ranges = new MatOfFloat(0f, 256f);

        Mat hist = new Mat();
        Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges);
        Core.normalize(hist, hist);

        Imgproc.calcBackProject(images, channels, hist, dst, ranges, 255);

        assertEquals(grayChess.size(), dst.size());
        assertEquals(grayChess.depth(), dst.depth());
        assertFalse(0 == Core.countNonZero(dst));
    }

    public void testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloat() {
        List<Mat> images = Arrays.asList(gray128);
        MatOfInt channels = new MatOfInt(0);
        MatOfInt histSize = new MatOfInt(10);
        MatOfFloat ranges = new MatOfFloat(0f, 256f);
        Mat hist = new Mat();

        Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges);

        truth = new Mat(10, 1, CvType.CV_32F, Scalar.all(0)) {
            {
                put(5, 0, 100);
            }
        };
        assertMatEqual(truth, hist, EPS);
    }

    public void testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloat2D() {
        List<Mat> images = Arrays.asList(gray255, gray128);
        MatOfInt channels = new MatOfInt(0, 1);
        MatOfInt histSize = new MatOfInt(10, 10);
        MatOfFloat ranges = new MatOfFloat(0f, 256f, 0f, 256f);
        Mat hist = new Mat();

        Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges);

        truth = new Mat(10, 10, CvType.CV_32F, Scalar.all(0)) {
            {
                put(9, 5, 100);
            }
        };
        assertMatEqual(truth, hist, EPS);
    }

    public void testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloat3D() {
        List<Mat> images = Arrays.asList(rgbLena);

        Mat hist3D = new Mat();
        List<Mat> histList = Arrays.asList( new Mat[] {new Mat(), new Mat(), new Mat()} );

        MatOfInt histSize = new MatOfInt(10);
        MatOfFloat ranges = new MatOfFloat(0f, 256f);

        for(int i=0; i<rgbLena.channels(); i++)
        {
            Imgproc.calcHist(images, new MatOfInt(i), new Mat(), histList.get(i), histSize, ranges);

            assertEquals(10, histList.get(i).checkVector(1));
        }

        Core.merge(histList, hist3D);

        assertEquals(CvType.CV_32FC3, hist3D.type());
        assertEquals(10, hist3D.checkVector(3));

        Mat truth = new Mat(10, 1, CvType.CV_32FC3);
        truth.put(0, 0,
                 0, 24870, 0,
                 1863, 31926, 1,
                 56682, 37677, 2260,
                 77278, 44751, 32436,
                 69397, 41343, 18526,
                 27180, 40407, 18658,
                 21101, 15993, 32042,
                 8343, 18585, 47786,
                 300, 6567, 80988,
                 0, 25, 29447
                );

        assertMatEqual(truth, hist3D, EPS);
    }

    public void testCalcHistListOfMatListOfIntegerMatMatListOfIntegerListOfFloatBoolean() {
        List<Mat> images = Arrays.asList(gray255, gray128);
        MatOfInt channels = new MatOfInt(0, 1);
        MatOfInt histSize = new MatOfInt(10, 10);
        MatOfFloat ranges = new MatOfFloat(0f, 256f, 0f, 256f);
        Mat hist = new Mat();

        Imgproc.calcHist(images, channels, new Mat(), hist, histSize, ranges, true);

        truth = new Mat(10, 10, CvType.CV_32F, Scalar.all(0)) {
            {
                put(9, 5, 100);
            }
        };
        assertMatEqual(truth, hist, EPS);
    }

    public void testCannyMatMatDoubleDouble() {
        Imgproc.Canny(gray255, dst, 5, 10);
        assertMatEqual(gray0, dst);
        // TODO_: write better test
    }

    public void testCannyMatMatDoubleDoubleIntBoolean() {
        Imgproc.Canny(gray0, dst, 5, 10, 5, true);
        assertMatEqual(gray0, dst);
        // TODO_: write better test
    }

    public void testCompareHist() {
        Mat H1 = new Mat(3, 1, CvType.CV_32F);
        Mat H2 = new Mat(3, 1, CvType.CV_32F);
        H1.put(0, 0, 1, 2, 3);
        H2.put(0, 0, 4, 5, 6);

        double distance = Imgproc.compareHist(H1, H2, Imgproc.CV_COMP_CORREL);

        assertEquals(1., distance);
    }

    public void testContourAreaMat() {
        Mat contour = new Mat(1, 4, CvType.CV_32FC2);
        contour.put(0, 0, 0, 0, 10, 0, 10, 10, 5, 4);

        double area = Imgproc.contourArea(contour);

        assertEquals(45., area);
    }

    public void testContourAreaMatBoolean() {
        Mat contour = new Mat(1, 4, CvType.CV_32FC2);
        contour.put(0, 0, 0, 0, 10, 0, 10, 10, 5, 4);

        double area = Imgproc.contourArea(contour, true);

        assertEquals(45., area);
        // TODO_: write better test
    }

    public void testConvertMapsMatMatMatMatInt() {
        Mat map1 = new Mat(1, 4, CvType.CV_32FC1, new Scalar(1));
        Mat map2 = new Mat(1, 4, CvType.CV_32FC1, new Scalar(2));
        Mat dstmap1 = new Mat(1, 4, CvType.CV_16SC2);
        Mat dstmap2 = new Mat(1, 4, CvType.CV_16UC1);

        Imgproc.convertMaps(map1, map2, dstmap1, dstmap2, CvType.CV_16SC2);

        Mat truthMap1 = new Mat(1, 4, CvType.CV_16SC2);
        truthMap1.put(0, 0, 1, 2, 1, 2, 1, 2, 1, 2);
        assertMatEqual(truthMap1, dstmap1);
        Mat truthMap2 = new Mat(1, 4, CvType.CV_16UC1, new Scalar(0));
        assertMatEqual(truthMap2, dstmap2);
    }

    public void testConvertMapsMatMatMatMatIntBoolean() {
        Mat map1 = new Mat(1, 3, CvType.CV_32FC1, new Scalar(2));
        Mat map2 = new Mat(1, 3, CvType.CV_32FC1, new Scalar(4));
        Mat dstmap1 = new Mat(1, 3, CvType.CV_16SC2);
        Mat dstmap2 = new Mat(1, 3, CvType.CV_16UC1);

        Imgproc.convertMaps(map1, map2, dstmap1, dstmap2, CvType.CV_16SC2, false);
        // TODO_: write better test (last param == true)

        Mat truthMap1 = new Mat(1, 3, CvType.CV_16SC2);
        truthMap1.put(0, 0, 2, 4, 2, 4, 2, 4);
        assertMatEqual(truthMap1, dstmap1);
        Mat truthMap2 = new Mat(1, 3, CvType.CV_16UC1, new Scalar(0));
        assertMatEqual(truthMap2, dstmap2);
    }

    public void testConvexHullMatMat() {
        MatOfPoint points = new MatOfPoint(
                new Point(20, 0),
                new Point(40, 0),
                new Point(30, 20),
                new Point(0,  20),
                new Point(20, 10),
                new Point(30, 10)
        );

        MatOfInt hull = new MatOfInt();

        Imgproc.convexHull(points, hull);

        MatOfInt expHull = new MatOfInt(
                1, 2, 3, 0
        );
        assertMatEqual(expHull, hull, EPS);
    }

    public void testConvexHullMatMatBooleanBoolean() {
        MatOfPoint points = new MatOfPoint(
                new Point(2, 0),
                new Point(4, 0),
                new Point(3, 2),
                new Point(0, 2),
                new Point(2, 1),
                new Point(3, 1)
        );

        MatOfInt hull = new MatOfInt();

        Imgproc.convexHull(points, hull, true);

        MatOfInt expHull = new MatOfInt(
                3, 2, 1, 0
        );
        assertMatEqual(expHull, hull, EPS);
    }

    public void testConvexityDefects() {
        MatOfPoint points = new MatOfPoint(
                new Point(20, 0),
                new Point(40, 0),
                new Point(30, 20),
                new Point(0,  20),
                new Point(20, 10),
                new Point(30, 10)
        );

        MatOfInt hull = new MatOfInt();
        Imgproc.convexHull(points, hull);

        MatOfInt4 convexityDefects = new MatOfInt4();
        Imgproc.convexityDefects(points, hull, convexityDefects);

        assertMatEqual(new MatOfInt4(3, 0, 5, 3620), convexityDefects);
    }

    public void testCornerEigenValsAndVecsMatMatIntInt() {
        fail("Not yet implemented");
        // TODO: write better test
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32FC1);
        src.put(0, 0, 1, 2);
        src.put(1, 0, 4, 2);

        int blockSize = 3;
        int ksize = 5;

        // TODO: eigen vals and vectors returned = 0 for most src matrices
        Imgproc.cornerEigenValsAndVecs(src, dst, blockSize, ksize);
        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32FC(6), new Scalar(0));
        assertMatEqual(truth, dst, EPS);
    }

    public void testCornerEigenValsAndVecsMatMatIntIntInt() {
        fail("Not yet implemented");
        // TODO: write better test
        Mat src = new Mat(4, 4, CvType.CV_32FC1, new Scalar(128));

        int blockSize = 3;
        int ksize = 5;

        truth = new Mat(4, 4, CvType.CV_32FC(6), new Scalar(0));

        Imgproc.cornerEigenValsAndVecs(src, dst, blockSize, ksize, Core.BORDER_REFLECT);
        assertMatEqual(truth, dst, EPS);
    }

    public void testCornerHarrisMatMatIntIntDouble() {
        fail("Not yet implemented");
        // TODO: write better test

        truth = new Mat(matSize, matSize, CvType.CV_32FC1, new Scalar(0));
        int blockSize = 5;
        int ksize = 7;
        double k = 0.1;
        Imgproc.cornerHarris(gray128, dst, blockSize, ksize, k);
        assertMatEqual(truth, dst, EPS);
    }

    public void testCornerHarrisMatMatIntIntDoubleInt() {
        fail("Not yet implemented");
        // TODO: write better test

        truth = new Mat(matSize, matSize, CvType.CV_32FC1, new Scalar(0));
        int blockSize = 5;
        int ksize = 7;
        double k = 0.1;
        Imgproc.cornerHarris(gray255, dst, blockSize, ksize, k, Core.BORDER_REFLECT);
        assertMatEqual(truth, dst, EPS);
    }

    public void testCornerMinEigenValMatMatInt() {
        fail("Not yet implemented");
        // TODO: write better test

        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32FC1);
        src.put(0, 0, 1, 2);
        src.put(1, 0, 2, 1);
        int blockSize = 5;

        Imgproc.cornerMinEigenVal(src, dst, blockSize);

        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32FC1, new Scalar(0));
        assertMatEqual(truth, dst, EPS);

        Imgproc.cornerMinEigenVal(gray255, dst, blockSize);

        truth = new Mat(matSize, matSize, CvType.CV_32FC1, new Scalar(0));
        assertMatEqual(truth, dst, EPS);
    }

    public void testCornerMinEigenValMatMatIntInt() {
        Mat src = Mat.eye(3, 3, CvType.CV_32FC1);
        int blockSize = 3;
        int ksize = 5;

        Imgproc.cornerMinEigenVal(src, dst, blockSize, ksize);

        truth = new Mat(3, 3, CvType.CV_32FC1) {
            {
                put(0, 0, 1. / 18, 1. / 36, 1. / 18);
                put(1, 0, 1. / 36, 1. / 18, 1. / 36);
                put(2, 0, 1. / 18, 1. / 36, 1. / 18);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testCornerMinEigenValMatMatIntIntInt() {
        Mat src = Mat.eye(3, 3, CvType.CV_32FC1);
        int blockSize = 3;
        int ksize = 5;

        Imgproc.cornerMinEigenVal(src, dst, blockSize, ksize, Core.BORDER_REFLECT);

        truth = new Mat(3, 3, CvType.CV_32FC1) {
            {
                put(0, 0, 0.68055558, 0.92708349, 0.5868057);
                put(1, 0, 0.92708343, 0.92708343, 0.92708343);
                put(2, 0, 0.58680564, 0.92708343, 0.68055564);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testCornerSubPix() {
        Mat img = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(128));
        Point truthPosition = new Point(img.cols() / 2, img.rows() / 2);

        Rect r = new Rect(new Point(0, 0), truthPosition);
        Imgproc.rectangle(img, r.tl(), r.br(), new Scalar(0), Core.FILLED);
        MatOfPoint2f corners = new MatOfPoint2f(new Point(truthPosition.x + 1, truthPosition.y + 1));
        Size winSize = new Size(2, 2);
        Size zeroZone = new Size(-1, -1);
        TermCriteria criteria = new TermCriteria(TermCriteria.EPS, 0, 0.01);

        Imgproc.cornerSubPix(img, corners, winSize, zeroZone, criteria);

        assertPointEquals(truthPosition, corners.toList().get(0), weakEPS);
    }

    public void testCvtColorMatMatInt() {
        fail("Not yet implemented");
    }

    public void testCvtColorMatMatIntInt() {
        fail("Not yet implemented");
    }

    public void testDilateMatMatMat() {
        Mat kernel = new Mat();

        Imgproc.dilate(gray255, dst, kernel);

        assertMatEqual(gray255, dst);

        Imgproc.dilate(gray1, dst, kernel);

        assertMatEqual(gray1, dst);
        // TODO_: write better test
    }

    public void testDilateMatMatMatPoint() {
        fail("Not yet implemented");
    }

    public void testDilateMatMatMatPointInt() {
        fail("Not yet implemented");
    }

    public void testDilateMatMatMatPointIntInt() {
        fail("Not yet implemented");
    }

    public void testDilateMatMatMatPointIntIntScalar() {
        fail("Not yet implemented");
    }

    public void testDistanceTransformWithLabels() {
        Mat dstLables = getMat(CvType.CV_32SC1, 0);
        Mat labels = new Mat();

        Imgproc.distanceTransformWithLabels(gray128, dst, labels, Imgproc.CV_DIST_L2, 3);

        assertMatEqual(dstLables, labels);
        assertMatEqual(getMat(CvType.CV_32FC1, 8192), dst, EPS);
    }

    public void testDrawContoursMatListOfMatIntScalar() {
        Imgproc.rectangle(gray0, new Point(1, 2), new Point(7, 8), new Scalar(100));
        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
        Imgproc.findContours(gray0, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

        Imgproc.drawContours(gray0, contours, -1, new Scalar(0));

        assertEquals(0, Core.countNonZero(gray0));
    }

    public void testDrawContoursMatListOfMatIntScalarInt() {
        Imgproc.rectangle(gray0, new Point(1, 2), new Point(7, 8), new Scalar(100));
        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
        Imgproc.findContours(gray0, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

        Imgproc.drawContours(gray0, contours, -1, new Scalar(0), Core.FILLED);

        assertEquals(0, Core.countNonZero(gray0));
    }


    public void testDrawContoursMatListOfMatIntScalarIntIntMatIntPoint() {
        fail("Not yet implemented");
    }

    public void testEqualizeHist() {
        Imgproc.equalizeHist(gray0, dst);
        assertMatEqual(gray0, dst);

        Imgproc.equalizeHist(gray255, dst);
        assertMatEqual(gray255, dst);
        // TODO_: write better test
    }

    public void testErodeMatMatMat() {
        Mat kernel = new Mat();

        Imgproc.erode(gray128, dst, kernel);

        assertMatEqual(gray128, dst);
    }

    public void testErodeMatMatMatPointInt() {
        Mat src = new Mat(3, 3, CvType.CV_8U) {
            {
                put(0, 0, 15, 9, 10);
                put(1, 0, 10, 8, 12);
                put(2, 0, 12, 20, 25);
            }
        };
        Mat kernel = new Mat();

        Imgproc.erode(src, dst, kernel, anchorPoint, 10);

        truth = new Mat(3, 3, CvType.CV_8U, new Scalar(8));
        assertMatEqual(truth, dst);
    }

    public void testErodeMatMatMatPointIntIntScalar() {
        Mat src = new Mat(3, 3, CvType.CV_8U) {
            {
                put(0, 0, 15, 9, 10);
                put(1, 0, 10, 8, 12);
                put(2, 0, 12, 20, 25);
            }
        };
        Mat kernel = new Mat();
        Scalar sc = new Scalar(3, 3);

        Imgproc.erode(src, dst, kernel, anchorPoint, 10, Core.BORDER_REFLECT, sc);

        truth = new Mat(3, 3, CvType.CV_8U, new Scalar(8));
        assertMatEqual(truth, dst);
    }

    public void testFilter2DMatMatIntMat() {
        Mat src = Mat.eye(4, 4, CvType.CV_32F);
        Mat kernel = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(1));

        Imgproc.filter2D(src, dst, -1, kernel);

        truth = new Mat(4, 4, CvType.CV_32F) {
            {
                put(0, 0, 2, 2, 1, 0);
                put(1, 0, 2, 2, 1, 0);
                put(2, 0, 1, 1, 2, 1);
                put(3, 0, 0, 0, 1, 2);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testFilter2DMatMatIntMatPointDouble() {
        fail("Not yet implemented");
    }

    public void testFilter2DMatMatIntMatPointDoubleInt() {
        Mat kernel = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(0));
        Point point = new Point(0, 0);

        Imgproc.filter2D(gray128, dst, -1, kernel, point, 2, Core.BORDER_CONSTANT);

        assertMatEqual(gray2, dst);
    }

    public void testFindContoursMatListOfMatMatIntInt() {
        Mat img = new Mat(50, 50, CvType.CV_8UC1, new Scalar(0));
        List<MatOfPoint> contours = new ArrayList<MatOfPoint>(5);
        Mat hierarchy = new Mat();

        Imgproc.findContours(img, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

        // no contours on empty image
        assertEquals(contours.size(), 0);
        assertEquals(contours.size(), hierarchy.total());

        Imgproc.rectangle(img, new Point(10, 20), new Point(20, 30), new Scalar(100), 3, Imgproc.LINE_AA, 0);
        Imgproc.rectangle(img, new Point(30, 35), new Point(40, 45), new Scalar(200));

        Imgproc.findContours(img, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

        // two contours of two rectangles
        assertEquals(contours.size(), 2);
        assertEquals(contours.size(), hierarchy.total());
    }

    public void testFindContoursMatListOfMatMatIntIntPoint() {
        Mat img = new Mat(50, 50, CvType.CV_8UC1, new Scalar(0));
        Mat img2 = img.submat(5, 50, 3, 50);
        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
        List<MatOfPoint> contours2 = new ArrayList<MatOfPoint>();
        Mat hierarchy = new Mat();

        Imgproc.rectangle(img, new Point(10, 20), new Point(20, 30), new Scalar(100), 3, Imgproc.LINE_AA, 0);
        Imgproc.rectangle(img, new Point(30, 35), new Point(40, 45), new Scalar(200));

        Imgproc.findContours(img, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
        Imgproc.findContours(img2, contours2, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(3, 5));

        assertEquals(contours.size(), contours2.size());
        assertMatEqual(contours.get(0), contours2.get(0));
        /*
        Log.d("findContours", "hierarchy=" + hierarchy);
        int iBuff[] = new int[ (int) (hierarchy.total() * hierarchy.channels()) ]; // [ Contour0 (next sibling num, previous sibling num, 1st child num, parent num), Contour1(...), ...
        hierarchy.get(0, 0, iBuff);
        Log.d("findContours", Arrays.toString(iBuff));
        */
    }

    public void testFitEllipse() {
        MatOfPoint2f points = new MatOfPoint2f(new Point(0, 0), new Point(-1, 1), new Point(1, 1), new Point(1, -1), new Point(-1, -1));
        RotatedRect rrect = new RotatedRect();

        rrect = Imgproc.fitEllipse(points);

        assertPointEquals(new Point(0, 0), rrect.center, EPS);
        assertEquals(2.828, rrect.size.width, EPS);
        assertEquals(2.828, rrect.size.height, EPS);
    }

    public void testFitLine() {
        Mat points = new Mat(1, 4, CvType.CV_32FC2);
        points.put(0, 0, 0, 0, 2, 3, 3, 4, 5, 8);

        Mat linePoints = new Mat(4, 1, CvType.CV_32FC1);
        linePoints.put(0, 0, 0.53196341, 0.84676737, 2.496531, 3.7467217);

        Imgproc.fitLine(points, dst, Imgproc.CV_DIST_L12, 0, 0.01, 0.01);

        assertMatEqual(linePoints, dst, EPS);
    }

    public void testFloodFillMatMatPointScalar() {
        Mat mask = new Mat(matSize + 2, matSize + 2, CvType.CV_8U, new Scalar(0));
        Mat img = gray0;
        Imgproc.circle(mask, new Point(matSize / 2 + 1, matSize / 2 + 1), 3, new Scalar(2));

        int retval = Imgproc.floodFill(img, mask, new Point(matSize / 2, matSize / 2), new Scalar(1));

        assertEquals(Core.countNonZero(img), retval);
        Imgproc.circle(mask, new Point(matSize / 2 + 1, matSize / 2 + 1), 3, new Scalar(0));
        assertEquals(retval + 4 * (matSize + 1), Core.countNonZero(mask));
        assertMatEqual(mask.submat(1, matSize + 1, 1, matSize + 1), img);
    }

    public void testFloodFillMatMatPointScalar_WithoutMask() {
        Mat img = gray0;
        Imgproc.circle(img, new Point(matSize / 2, matSize / 2), 3, new Scalar(2));

        // TODO: ideally we should pass null instead of "new Mat()"
        int retval = Imgproc.floodFill(img, new Mat(), new Point(matSize / 2, matSize / 2), new Scalar(1));

        Imgproc.circle(img, new Point(matSize / 2, matSize / 2), 3, new Scalar(0));
        assertEquals(Core.countNonZero(img), retval);
    }

    public void testFloodFillMatMatPointScalarRect() {
        fail("Not yet implemented");
    }

    public void testFloodFillMatMatPointScalarRectScalar() {
        fail("Not yet implemented");
    }

    public void testFloodFillMatMatPointScalarRectScalarScalar() {
        fail("Not yet implemented");
    }

    public void testFloodFillMatMatPointScalarRectScalarScalarInt() {
        fail("Not yet implemented");
    }

    public void testGaussianBlurMatMatSizeDouble() {
        Imgproc.GaussianBlur(gray0, dst, size, 1);
        assertMatEqual(gray0, dst);

        Imgproc.GaussianBlur(gray2, dst, size, 1);
        assertMatEqual(gray2, dst);
    }

    public void testGaussianBlurMatMatSizeDoubleDouble() {
        Imgproc.GaussianBlur(gray2, dst, size, 0, 0);

        assertMatEqual(gray2, dst);
        // TODO_: write better test
    }

    public void testGaussianBlurMatMatSizeDoubleDoubleInt() {
        Imgproc.GaussianBlur(gray2, dst, size, 1, 3, Core.BORDER_REFLECT);

        assertMatEqual(gray2, dst);
        // TODO_: write better test
    }

    public void testGetAffineTransform() {
        MatOfPoint2f src = new MatOfPoint2f(new Point(2, 3), new Point(3, 1), new Point(1, 4));
        MatOfPoint2f dst = new MatOfPoint2f(new Point(3, 3), new Point(7, 4), new Point(5, 6));

        Mat transform = Imgproc.getAffineTransform(src, dst);

        Mat truth = new Mat(2, 3, CvType.CV_64FC1) {
            {
                put(0, 0, -8, -6, 37);
                put(1, 0, -7, -4, 29);
            }
        };
        assertMatEqual(truth, transform, EPS);
    }

    public void testGetDefaultNewCameraMatrixMat() {
        Mat mtx = Imgproc.getDefaultNewCameraMatrix(gray0);

        assertFalse(mtx.empty());
        assertEquals(0, Core.countNonZero(mtx));
    }

    public void testGetDefaultNewCameraMatrixMatSizeBoolean() {
        Mat mtx = Imgproc.getDefaultNewCameraMatrix(gray0, size, true);

        assertFalse(mtx.empty());
        assertFalse(0 == Core.countNonZero(mtx));
        // TODO_: write better test
    }

    public void testGetDerivKernelsMatMatIntIntInt() {
        Mat kx = new Mat(imgprocSz, imgprocSz, CvType.CV_32F);
        Mat ky = new Mat(imgprocSz, imgprocSz, CvType.CV_32F);
        Mat expKx = new Mat(3, 1, CvType.CV_32F);
        Mat expKy = new Mat(3, 1, CvType.CV_32F);
        kx.put(0, 0, 1, 1);
        kx.put(1, 0, 1, 1);
        ky.put(0, 0, 2, 2);
        ky.put(1, 0, 2, 2);
        expKx.put(0, 0, 1, -2, 1);
        expKy.put(0, 0, 1, -2, 1);

        Imgproc.getDerivKernels(kx, ky, 2, 2, 3);

        assertMatEqual(expKx, kx, EPS);
        assertMatEqual(expKy, ky, EPS);
    }

    public void testGetDerivKernelsMatMatIntIntIntBooleanInt() {
        Mat kx = new Mat(imgprocSz, imgprocSz, CvType.CV_32F);
        Mat ky = new Mat(imgprocSz, imgprocSz, CvType.CV_32F);
        Mat expKx = new Mat(3, 1, CvType.CV_32F);
        Mat expKy = new Mat(3, 1, CvType.CV_32F);
        kx.put(0, 0, 1, 1);
        kx.put(1, 0, 1, 1);
        ky.put(0, 0, 2, 2);
        ky.put(1, 0, 2, 2);
        expKx.put(0, 0, 1, -2, 1);
        expKy.put(0, 0, 1, -2, 1);

        Imgproc.getDerivKernels(kx, ky, 2, 2, 3, true, CvType.CV_32F);

        assertMatEqual(expKx, kx, EPS);
        assertMatEqual(expKy, ky, EPS);
        // TODO_: write better test
    }

    public void testGetGaussianKernelIntDouble() {
        dst = Imgproc.getGaussianKernel(1, 0.5);

        truth = new Mat(1, 1, CvType.CV_64FC1, new Scalar(1));
        assertMatEqual(truth, dst, EPS);
    }

    public void testGetGaussianKernelIntDoubleInt() {
        dst = Imgproc.getGaussianKernel(3, 0.8, CvType.CV_32F);

        truth = new Mat(3, 1, CvType.CV_32F);
        truth.put(0, 0, 0.23899426, 0.52201146, 0.23899426);
        assertMatEqual(truth, dst, EPS);
    }

    public void testGetPerspectiveTransform() {
        fail("Not yet implemented");
    }

    public void testGetRectSubPixMatSizePointMat() {
        Size size = new Size(3, 3);
        Point center = new Point(gray255.cols() / 2, gray255.rows() / 2);

        Imgproc.getRectSubPix(gray255, size, center, dst);

        truth = new Mat(3, 3, CvType.CV_8U, new Scalar(255));
        assertMatEqual(truth, dst);
    }

    public void testGetRectSubPixMatSizePointMatInt() {
        Mat src = new Mat(10, 10, CvType.CV_32F, new Scalar(2));
        Size patchSize = new Size(5, 5);
        Point center = new Point(src.cols() / 2, src.rows() / 2);

        Imgproc.getRectSubPix(src, patchSize, center, dst);

        truth = new Mat(5, 5, CvType.CV_32F, new Scalar(2));
        assertMatEqual(truth, dst, EPS);
    }

    public void testGetRotationMatrix2D() {
        Point center = new Point(0, 0);

        dst = Imgproc.getRotationMatrix2D(center, 0, 1);

        truth = new Mat(2, 3, CvType.CV_64F) {
            {
                put(0, 0, 1, 0, 0);
                put(1, 0, 0, 1, 0);
            }
        };

        assertMatEqual(truth, dst, EPS);
    }

    public void testGetStructuringElementIntSize() {
        dst = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, size);

        truth = new Mat(3, 3, CvType.CV_8UC1, new Scalar(1));
        assertMatEqual(truth, dst);
    }

    public void testGetStructuringElementIntSizePoint() {
        dst = Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, size, anchorPoint);

        truth = new Mat(3, 3, CvType.CV_8UC1) {
            {
                put(0, 0, 0, 0, 1);
                put(1, 0, 0, 0, 1);
                put(2, 0, 1, 1, 1);
            }
        };
        assertMatEqual(truth, dst);
    }

    public void testGoodFeaturesToTrackMatListOfPointIntDoubleDouble() {
        Mat src = gray0;
        Imgproc.rectangle(src, new Point(2, 2), new Point(8, 8), new Scalar(100), -1);
        MatOfPoint lp = new MatOfPoint();

        Imgproc.goodFeaturesToTrack(src, lp, 100, 0.01, 3);

        assertEquals(4, lp.total());
    }

    public void testGoodFeaturesToTrackMatListOfPointIntDoubleDoubleMatIntBooleanDouble() {
        Mat src = gray0;
        Imgproc.rectangle(src, new Point(2, 2), new Point(8, 8), new Scalar(100), -1);
        MatOfPoint lp = new MatOfPoint();

        Imgproc.goodFeaturesToTrack(src, lp, 100, 0.01, 3, gray1, 4, true, 0);

        assertEquals(4, lp.total());
    }

    public void testGrabCutMatMatRectMatMatInt() {
        fail("Not yet implemented");
    }

    public void testGrabCutMatMatRectMatMatIntInt() {
        fail("Not yet implemented");
    }

    public void testHoughCirclesMatMatIntDoubleDouble() {
        int sz = 512;
        Mat img = new Mat(sz, sz, CvType.CV_8U, new Scalar(128));
        Mat circles = new Mat();

        Imgproc.HoughCircles(img, circles, Imgproc.CV_HOUGH_GRADIENT, 2, img.rows() / 4);

        assertEquals(0, circles.cols());
    }

    public void testHoughCirclesMatMatIntDoubleDouble1() {
        int sz = 512;
        Mat img = new Mat(sz, sz, CvType.CV_8U, new Scalar(128));
        Mat circles = new Mat();

        Point center = new Point(img.cols() / 2, img.rows() / 2);
        int radius = Math.min(img.cols() / 4, img.rows() / 4);
        Imgproc.circle(img, center, radius, colorBlack, 3);

        Imgproc.HoughCircles(img, circles, Imgproc.CV_HOUGH_GRADIENT, 2, img.rows() / 4);

        assertEquals(1, circles.cols());
    }

    public void testHoughCirclesMatMatIntDoubleDoubleDoubleDoubleIntInt() {
        fail("Not yet implemented");
    }

    public void testHoughLinesMatMatDoubleDoubleInt() {
        int sz = 512;
        Mat img = new Mat(sz, sz, CvType.CV_8U, new Scalar(0));
        Point point1 = new Point(50, 50);
        Point point2 = new Point(img.cols() / 2, img.rows() / 2);
        Imgproc.line(img, point1, point2, colorWhite, 1);
        Mat lines = new Mat();

        Imgproc.HoughLines(img, lines, 1, 3.1415926/180, 100);

        assertEquals(1, lines.cols());

        /*
        Log.d("HoughLines", "lines=" + lines);
        int num = (int)lines.total();
        int buff[] = new int[num*4]; //[ (x1, y1, x2, y2), (...), ...]
        lines.get(0, 0, buff);
        Log.d("HoughLines", "lines=" + Arrays.toString(buff));
        */
    }

    public void testHoughLinesMatMatDoubleDoubleIntDouble() {
        fail("Not yet implemented");
    }

    public void testHoughLinesMatMatDoubleDoubleIntDoubleDouble() {
        fail("Not yet implemented");
    }

    public void testHoughLinesPMatMatDoubleDoubleInt() {
        int sz = 512;
        Mat img = new Mat(sz, sz, CvType.CV_8U, new Scalar(0));
        Point point1 = new Point(0, 0);
        Point point2 = new Point(sz, sz);
        Point point3 = new Point(sz, 0);
        Point point4 = new Point(2*sz/3, sz/3);
        Imgproc.line(img, point1, point2, Scalar.all(255), 1);
        Imgproc.line(img, point3, point4, Scalar.all(255), 1);
        Mat lines = new Mat();

        Imgproc.HoughLinesP(img, lines, 1, 3.1415926/180, 100);

        assertEquals(2, lines.cols());

        /*
        Log.d("HoughLinesP", "lines=" + lines);
        int num = (int)lines.cols();
        int buff[] = new int[num*4]; // CV_32SC4 as [ (x1, y1, x2, y2), (...), ...]
        lines.get(0, 0, buff);
        Log.d("HoughLinesP", "lines=" + Arrays.toString(buff));
        */
    }

    public void testHoughLinesPMatMatDoubleDoubleIntDouble() {
        fail("Not yet implemented");
    }

    public void testHoughLinesPMatMatDoubleDoubleIntDoubleDouble() {
        fail("Not yet implemented");
    }

    public void testHuMoments() {
        fail("Not yet implemented");
    }

    public void testInitUndistortRectifyMap() {
        fail("Not yet implemented");
        Mat cameraMatrix = new Mat(3, 3, CvType.CV_32F);
        cameraMatrix.put(0, 0, 1, 0, 1);
        cameraMatrix.put(1, 0, 0, 1, 1);
        cameraMatrix.put(2, 0, 0, 0, 1);

        Mat R = new Mat(3, 3, CvType.CV_32F, new Scalar(2));
        Mat newCameraMatrix = new Mat(3, 3, CvType.CV_32F, new Scalar(3));

        Mat distCoeffs = new Mat();
        Mat map1 = new Mat();
        Mat map2 = new Mat();

        // TODO: complete this test
        Imgproc.initUndistortRectifyMap(cameraMatrix, distCoeffs, R, newCameraMatrix, size, CvType.CV_32F, map1, map2);
    }

    public void testInitWideAngleProjMapMatMatSizeIntIntMatMat() {
        fail("Not yet implemented");
        Mat cameraMatrix = new Mat(3, 3, CvType.CV_32F);
        Mat distCoeffs = new Mat(1, 4, CvType.CV_32F);
        // Size imageSize = new Size(2, 2);

        cameraMatrix.put(0, 0, 1, 0, 1);
        cameraMatrix.put(1, 0, 0, 1, 2);
        cameraMatrix.put(2, 0, 0, 0, 1);

        distCoeffs.put(0, 0, 1, 3, 2, 4);
        truth = new Mat(3, 3, CvType.CV_32F);
        truth.put(0, 0, 0, 0, 0);
        truth.put(1, 0, 0, 0, 0);
        truth.put(2, 0, 0, 3, 0);
        // TODO: No documentation for this function
        // Imgproc.initWideAngleProjMap(cameraMatrix, distCoeffs, imageSize,
        // 5, m1type, truthput1, truthput2);
    }

    public void testInitWideAngleProjMapMatMatSizeIntIntMatMatInt() {
        fail("Not yet implemented");
    }

    public void testInitWideAngleProjMapMatMatSizeIntIntMatMatIntDouble() {
        fail("Not yet implemented");
    }

    public void testIntegral2MatMatMat() {
        Mat src = new Mat(3, 3, CvType.CV_32F, new Scalar(3));
        Mat expSum = new Mat(4, 4, CvType.CV_64F);
        Mat expSqsum = new Mat(4, 4, CvType.CV_64F);
        Mat sum = new Mat();
        Mat sqsum = new Mat();

        expSum.put(0, 0, 0, 0, 0, 0);
        expSum.put(1, 0, 0, 3, 6, 9);
        expSum.put(2, 0, 0, 6, 12, 18);
        expSum.put(3, 0, 0, 9, 18, 27);

        expSqsum.put(0, 0, 0, 0, 0, 0);
        expSqsum.put(1, 0, 0, 9, 18, 27);
        expSqsum.put(2, 0, 0, 18, 36, 54);
        expSqsum.put(3, 0, 0, 27, 54, 81);

        Imgproc.integral2(src, sum, sqsum);

        assertMatEqual(expSum, sum, EPS);
        assertMatEqual(expSqsum, sqsum, EPS);
    }

    public void testIntegral2MatMatMatInt() {
        Mat src = new Mat(3, 3, CvType.CV_32F, new Scalar(3));
        Mat expSum = new Mat(4, 4, CvType.CV_64F);
        Mat expSqsum = new Mat(4, 4, CvType.CV_64F);
        Mat sum = new Mat();
        Mat sqsum = new Mat();

        expSum.put(0, 0, 0, 0, 0, 0);
        expSum.put(1, 0, 0, 3, 6, 9);
        expSum.put(2, 0, 0, 6, 12, 18);
        expSum.put(3, 0, 0, 9, 18, 27);

        expSqsum.put(0, 0, 0, 0, 0, 0);
        expSqsum.put(1, 0, 0, 9, 18, 27);
        expSqsum.put(2, 0, 0, 18, 36, 54);
        expSqsum.put(3, 0, 0, 27, 54, 81);

        Imgproc.integral2(src, sum, sqsum, CvType.CV_64F, CvType.CV_64F);

        assertMatEqual(expSum, sum, EPS);
        assertMatEqual(expSqsum, sqsum, EPS);
    }

    public void testIntegral3MatMatMatMat() {
        Mat src = new Mat(1, 1, CvType.CV_32F, new Scalar(1));
        Mat expSum = new Mat(imgprocSz, imgprocSz, CvType.CV_64F);
        Mat expSqsum = new Mat(imgprocSz, imgprocSz, CvType.CV_64F);
        Mat expTilted = new Mat(imgprocSz, imgprocSz, CvType.CV_64F);
        Mat sum = new Mat();
        Mat sqsum = new Mat();
        Mat tilted = new Mat();

        expSum.put(0, 0, 0, 0);
        expSum.put(1, 0, 0, 1);

        expSqsum.put(0, 0, 0, 0);
        expSqsum.put(1, 0, 0, 1);

        expTilted.put(0, 0, 0, 0);
        expTilted.put(1, 0, 0, 1);

        Imgproc.integral3(src, sum, sqsum, tilted);

        assertMatEqual(expSum, sum, EPS);
        assertMatEqual(expSqsum, sqsum, EPS);
        assertMatEqual(expTilted, tilted, EPS);
    }

    public void testIntegral3MatMatMatMatInt() {
        Mat src = new Mat(1, 1, CvType.CV_32F, new Scalar(1));
        Mat expSum = new Mat(imgprocSz, imgprocSz, CvType.CV_64F);
        Mat expSqsum = new Mat(imgprocSz, imgprocSz, CvType.CV_64F);
        Mat expTilted = new Mat(imgprocSz, imgprocSz, CvType.CV_64F);
        Mat sum = new Mat();
        Mat sqsum = new Mat();
        Mat tilted = new Mat();

        expSum.put(0, 0, 0, 0);
        expSum.put(1, 0, 0, 1);

        expSqsum.put(0, 0, 0, 0);
        expSqsum.put(1, 0, 0, 1);

        expTilted.put(0, 0, 0, 0);
        expTilted.put(1, 0, 0, 1);

        Imgproc.integral3(src, sum, sqsum, tilted, CvType.CV_64F, CvType.CV_64F);

        assertMatEqual(expSum, sum, EPS);
        assertMatEqual(expSqsum, sqsum, EPS);
        assertMatEqual(expTilted, tilted, EPS);
    }

    public void testIntegralMatMat() {
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(2));

        Imgproc.integral(src, dst);

        truth = new Mat(3, 3, CvType.CV_64F) {
            {
                put(0, 0, 0, 0, 0);
                put(1, 0, 0, 2, 4);
                put(2, 0, 0, 4, 8);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testIntegralMatMatInt() {
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(2));

        Imgproc.integral(src, dst, CvType.CV_64F);

        truth = new Mat(3, 3, CvType.CV_64F) {
            {
                put(0, 0, 0, 0, 0);
                put(1, 0, 0, 2, 4);
                put(2, 0, 0, 4, 8);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testInvertAffineTransform() {
        Mat src = new Mat(2, 3, CvType.CV_64F, new Scalar(1));

        Imgproc.invertAffineTransform(src, dst);

        truth = new Mat(2, 3, CvType.CV_64F, new Scalar(0));
        assertMatEqual(truth, dst, EPS);
    }

    public void testIsContourConvex() {
        MatOfPoint contour1 = new MatOfPoint(new Point(0, 0), new Point(10, 0), new Point(10, 10), new Point(5, 4));

        assertFalse(Imgproc.isContourConvex(contour1));

        MatOfPoint contour2 = new MatOfPoint(new Point(0, 0), new Point(10, 0), new Point(10, 10), new Point(5, 6));

        assertTrue(Imgproc.isContourConvex(contour2));
    }

    public void testLaplacianMatMatInt() {
        Imgproc.Laplacian(gray0, dst, CvType.CV_8U);

        assertMatEqual(gray0, dst);
    }

    public void testLaplacianMatMatIntIntDoubleDouble() {
        Mat src = Mat.eye(imgprocSz, imgprocSz, CvType.CV_32F);

        Imgproc.Laplacian(src, dst, CvType.CV_32F, 1, 2, EPS);

        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32F) {
            {
                put(0, 0, -7.9990001, 8.0009995);
                put(1, 0, 8.0009995, -7.9990001);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testLaplacianMatMatIntIntDoubleDoubleInt() {
        Mat src = new Mat(3, 3, CvType.CV_32F, new Scalar(2));

        Imgproc.Laplacian(src, dst, CvType.CV_32F, 1, 2, EPS, Core.BORDER_REFLECT);

        truth = new Mat(3, 3, CvType.CV_32F, new Scalar(0.00099945068));
        assertMatEqual(truth, dst, EPS);
    }

    public void testMatchShapes() {
        Mat contour1 = new Mat(1, 4, CvType.CV_32FC2);
        Mat contour2 = new Mat(1, 4, CvType.CV_32FC2);
        contour1.put(0, 0, 1, 1, 5, 1, 4, 3, 6, 2);
        contour2.put(0, 0, 1, 1, 6, 1, 4, 1, 2, 5);

        double distance = Imgproc.matchShapes(contour1, contour2, Imgproc.CV_CONTOURS_MATCH_I1, 1);

        assertEquals(2.81109697365334, distance, EPS);
    }

    public void testMatchTemplate() {
        Mat image = new Mat(imgprocSz, imgprocSz, CvType.CV_8U);
        Mat templ = new Mat(imgprocSz, imgprocSz, CvType.CV_8U);
        image.put(0, 0, 1, 2, 3, 4);
        templ.put(0, 0, 5, 6, 7, 8);

        Imgproc.matchTemplate(image, templ, dst, Imgproc.TM_CCORR);

        truth = new Mat(1, 1, CvType.CV_32F, new Scalar(70));
        assertMatEqual(truth, dst, EPS);

        Imgproc.matchTemplate(gray255, gray0, dst, Imgproc.TM_CCORR);

        truth = new Mat(1, 1, CvType.CV_32F, new Scalar(0));
        assertMatEqual(truth, dst, EPS);
    }

    public void testMedianBlur() {
        Imgproc.medianBlur(gray255, dst, 5);
        assertMatEqual(gray255, dst);

        Imgproc.medianBlur(gray2, dst, 3);
        assertMatEqual(gray2, dst);
        // TODO_: write better test
    }

    public void testMinAreaRect() {
        MatOfPoint2f points = new MatOfPoint2f(new Point(1, 1), new Point(5, 1), new Point(4, 3), new Point(6, 2));

        RotatedRect rrect = Imgproc.minAreaRect(points);

        assertEquals(new Size(2, 5), rrect.size);
        assertEquals(-90., rrect.angle);
        assertEquals(new Point(3.5, 2), rrect.center);
    }

    public void testMinEnclosingCircle() {
        MatOfPoint2f points = new MatOfPoint2f(new Point(0, 0), new Point(-1, 0), new Point(0, -1), new Point(1, 0), new Point(0, 1));
        Point actualCenter = new Point();
        float[] radius = new float[1];

        Imgproc.minEnclosingCircle(points, actualCenter, radius);

        assertEquals(new Point(0, 0), actualCenter);
        assertEquals(1.03f, radius[0], EPS);
    }

    public void testMomentsMat() {
        fail("Not yet implemented");
    }

    public void testMomentsMatBoolean() {
        fail("Not yet implemented");
    }

    public void testMorphologyExMatMatIntMat() {
        Imgproc.morphologyEx(gray255, dst, Imgproc.MORPH_GRADIENT, gray0);

        assertMatEqual(gray0, dst);
        // TODO_: write better test
    }

    public void testMorphologyExMatMatIntMatPointInt() {
        Mat src = Mat.eye(imgprocSz, imgprocSz, CvType.CV_8U);

        Mat kernel = new Mat(imgprocSz, imgprocSz, CvType.CV_8U, new Scalar(0));
        Point point = new Point(0, 0);

        Imgproc.morphologyEx(src, dst, Imgproc.MORPH_CLOSE, kernel, point, 10);

        truth = Mat.eye(imgprocSz, imgprocSz, CvType.CV_8U);
        assertMatEqual(truth, dst);
        // TODO_: write better test
    }


    public void testMorphologyExMatMatIntMatPointIntIntScalar() {
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_8U);
        src.put(0, 0, 2, 1);
        src.put(1, 0, 2, 1);

        Mat kernel = new Mat(imgprocSz, imgprocSz, CvType.CV_8U, new Scalar(1));
        Point point = new Point(1, 1);
        Scalar sc = new Scalar(3, 3);

        Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, kernel, point, 10, Core.BORDER_REFLECT, sc);
        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_8U) {
            {
                put(0, 0, 1, 0);
                put(1, 0, 1, 0);
            }
        };
        assertMatEqual(truth, dst);
        // TODO_: write better test
    }

    public void testPointPolygonTest() {
        MatOfPoint2f contour = new MatOfPoint2f(new Point(0, 0), new Point(1, 3), new Point(3, 4), new Point(4, 3), new Point(2, 1));
        double sign1 = Imgproc.pointPolygonTest(contour, new Point(2, 2), false);
        assertEquals(1.0, sign1);

        double sign2 = Imgproc.pointPolygonTest(contour, new Point(4, 4), true);
        assertEquals(-Math.sqrt(0.5), sign2);
    }

    public void testPreCornerDetectMatMatInt() {
        Mat src = new Mat(4, 4, CvType.CV_32F, new Scalar(1));
        int ksize = 3;

        Imgproc.preCornerDetect(src, dst, ksize);

        truth = new Mat(4, 4, CvType.CV_32F, new Scalar(0));
        assertMatEqual(truth, dst, EPS);
    }

    public void testPreCornerDetectMatMatIntInt() {
        Mat src = new Mat(4, 4, CvType.CV_32F, new Scalar(1));
        int ksize = 3;

        Imgproc.preCornerDetect(src, dst, ksize, Core.BORDER_REFLECT);

        truth = new Mat(4, 4, CvType.CV_32F, new Scalar(0));
        assertMatEqual(truth, dst, EPS);
        // TODO_: write better test
    }

    public void testPyrDownMatMat() {
        Mat src = new Mat(4, 4, CvType.CV_32F) {
            {
                put(0, 0, 2, 1, 4, 2);
                put(1, 0, 3, 2, 6, 8);
                put(2, 0, 4, 6, 8, 10);
                put(3, 0, 12, 32, 6, 18);
            }
        };

        Imgproc.pyrDown(src, dst);

        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32F) {
            {
                put(0, 0, 2.78125, 4.609375);
                put(1, 0, 8.546875, 8.8515625);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testPyrDownMatMatSize() {
        Mat src = new Mat(4, 4, CvType.CV_32F) {
            {
                put(0, 0, 2, 1, 4, 2);
                put(1, 0, 3, 2, 6, 8);
                put(2, 0, 4, 6, 8, 10);
                put(3, 0, 12, 32, 6, 18);
            }
        };
        Size dstSize = new Size(2, 2);

        Imgproc.pyrDown(src, dst, dstSize);

        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32F) {
            {
                put(0, 0, 2.78125, 4.609375);
                put(1, 0, 8.546875, 8.8515625);
            }
        };
        assertMatEqual(truth, dst, EPS);
        // TODO_: write better test
    }

    public void testPyrMeanShiftFilteringMatMatDoubleDouble() {
        Mat src = new Mat(matSize, matSize, CvType.CV_8UC3, new Scalar(0));

        Imgproc.pyrMeanShiftFiltering(src, dst, 10, 50);

        assertMatEqual(src, dst);
        // TODO_: write better test
    }

    public void testPyrMeanShiftFilteringMatMatDoubleDoubleInt() {
        fail("Not yet implemented");
    }

    public void testPyrMeanShiftFilteringMatMatDoubleDoubleIntTermCriteria() {
        fail("Not yet implemented");
    }

    public void testPyrUpMatMat() {
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32F);
        src.put(0, 0, 2, 1);
        src.put(1, 0, 3, 2);

        Imgproc.pyrUp(src, dst);

        truth = new Mat(4, 4, CvType.CV_32F) {
            {
                put(0, 0, 2,     1.75,  1.375, 1.25);
                put(1, 0, 2.25,  2,     1.625, 1.5);
                put(2, 0, 2.625, 2.375, 2,     1.875);
                put(3, 0, 2.75,  2.5,   2.125, 2);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testPyrUpMatMatSize() {
        fail("Not yet implemented");
    }

    public void testRemapMatMatMatMatInt() {
        fail("Not yet implemented");
        // this test does something weird
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(2));
        Mat map1 = new Mat(1, 3, CvType.CV_32FC1);
        Mat map2 = new Mat(1, 3, CvType.CV_32FC1);

        map1.put(0, 0, 3, 6, 5);
        map2.put(0, 0, 4, 8, 12);

        Imgproc.remap(src, dst, map1, map2, Imgproc.INTER_LINEAR);

        truth = new Mat(1, 3, CvType.CV_32F, new Scalar(0));
        assertMatEqual(truth, dst, EPS);
    }

    public void testRemapMatMatMatMatIntIntScalar() {
        fail("Not yet implemented");
        // this test does something weird
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(2));
        Mat map1 = new Mat(1, 3, CvType.CV_32FC1);
        Mat map2 = new Mat(1, 3, CvType.CV_32FC1);

        Scalar sc = new Scalar(0);

        map1.put(0, 0, 3, 6, 5, 0);
        map2.put(0, 0, 4, 8, 12);

        truth = new Mat(1, 3, CvType.CV_32F, new Scalar(2));

        Imgproc.remap(src, dst, map1, map2, Imgproc.INTER_LINEAR, Core.BORDER_REFLECT, sc);
        assertMatEqual(truth, dst, EPS);
    }

    public void testResizeMatMatSize() {
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_8UC1, new Scalar(1));
        Size dsize = new Size(1, 1);

        Imgproc.resize(src, dst, dsize);

        truth = new Mat(1, 1, CvType.CV_8UC1, new Scalar(1));
        assertMatEqual(truth, dst);
    }

    public void testResizeMatMatSizeDoubleDoubleInt() {
        Imgproc.resize(gray255, dst, new Size(2, 2), 0, 0, Imgproc.INTER_AREA);

        truth = new Mat(2, 2, CvType.CV_8UC1, new Scalar(255));
        assertMatEqual(truth, dst);
        // TODO_: write better test
    }

    public void testScharrMatMatIntIntInt() {
        Mat src = Mat.eye(imgprocSz, imgprocSz, CvType.CV_32F);

        Imgproc.Scharr(src, dst, CvType.CV_32F, 1, 0);

        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(0));
        assertMatEqual(truth, dst, EPS);
    }

    public void testScharrMatMatIntIntIntDoubleDouble() {
        Mat src = Mat.eye(imgprocSz, imgprocSz, CvType.CV_32F);

        Imgproc.Scharr(src, dst, CvType.CV_32F, 1, 0, 1.5, 0.001);

        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(0.001));
        assertMatEqual(truth, dst, EPS);
    }

    public void testScharrMatMatIntIntIntDoubleDoubleInt() {
        Mat src = Mat.eye(3, 3, CvType.CV_32F);

        Imgproc.Scharr(src, dst, CvType.CV_32F, 1, 0, 1.5, 0, Core.BORDER_REFLECT);

        truth = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, -15, -19.5, -4.5);
                put(1, 0, 10.5, 0, -10.5);
                put(2, 0, 4.5, 19.5, 15);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testSepFilter2DMatMatIntMatMat() {
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(2));
        Mat kernelX = new Mat(1, 3, CvType.CV_32FC1);
        Mat kernelY = new Mat(1, 3, CvType.CV_32FC1);
        kernelX.put(0, 0, 4, 3, 7);
        kernelY.put(0, 0, 9, 4, 2);

        Imgproc.sepFilter2D(src, dst, CvType.CV_32F, kernelX, kernelY);

        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(420));
        assertMatEqual(truth, dst, EPS);
    }

    public void testSepFilter2DMatMatIntMatMatPointDouble() {
        Mat src = new Mat(imgprocSz, imgprocSz, CvType.CV_32FC1, new Scalar(2));
        Mat kernelX = new Mat(1, 3, CvType.CV_32FC1);
        kernelX.put(0, 0, 2, 2, 2);
        Mat kernelY = new Mat(1, 3, CvType.CV_32FC1);
        kernelY.put(0, 0, 1, 1, 1);

        Imgproc.sepFilter2D(src, dst, CvType.CV_32F, kernelX, kernelY, anchorPoint, weakEPS);

        truth = new Mat(imgprocSz, imgprocSz, CvType.CV_32F, new Scalar(36 + weakEPS));
        assertMatEqual(truth, dst, EPS);
    }

    public void testSepFilter2DMatMatIntMatMatPointDoubleInt() {
        Mat kernelX = new Mat(1, 3, CvType.CV_32FC1);
        kernelX.put(0, 0, 2, 2, 2);

        Mat kernelY = new Mat(1, 3, CvType.CV_32FC1);
        kernelY.put(0, 0, 1, 1, 1);

        Imgproc.sepFilter2D(gray0, dst, CvType.CV_32F, kernelX, kernelY, anchorPoint, weakEPS, Core.BORDER_REFLECT);

        truth = new Mat(10, 10, CvType.CV_32F, new Scalar(weakEPS));
        assertMatEqual(truth, dst, EPS);
        // TODO_: write better test
    }

    public void testSobelMatMatIntIntInt() {
        Imgproc.Sobel(gray255, dst, CvType.CV_8U, 1, 0);

        assertMatEqual(gray0, dst);
    }

    public void testSobelMatMatIntIntIntIntDoubleDouble() {
        Imgproc.Sobel(gray255, dst, CvType.CV_8U, 1, 0, 3, 2, 0.001);
        assertMatEqual(gray0, dst);
        // TODO_: write better test
    }

    public void testSobelMatMatIntIntIntIntDoubleDoubleInt() {
        Mat src = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 2, 0, 1);
                put(1, 0, 6, 4, 3);
                put(2, 0, 1, 0, 2);
            }
        };

        Imgproc.Sobel(src, dst, CvType.CV_32F, 1, 0, 3, 2, 0, Core.BORDER_REPLICATE);

        truth = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, -16, -12, 4);
                put(1, 0, -14, -12, 2);
                put(2, 0, -10, 0, 10);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testThreshold() {
        Imgproc.threshold(makeMask(gray0.clone(), 10), dst, 5, 255, Imgproc.THRESH_TRUNC);
        assertMatEqual(makeMask(gray0.clone(), 5), dst);

        Imgproc.threshold(makeMask(gray2.clone(), 10), dst, 1, 255, Imgproc.THRESH_BINARY);
        assertMatEqual(gray255, dst);

        Imgproc.threshold(makeMask(gray2.clone(), 10), dst, 3, 255, Imgproc.THRESH_BINARY_INV);
        assertMatEqual(makeMask(gray255.clone(), 0), dst);
    }

    public void testUndistortMatMatMatMat() {
        Mat src = new Mat(3, 3, CvType.CV_32F, new Scalar(3));
        Mat cameraMatrix = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 1, 0, 1);
                put(1, 0, 0, 1, 2);
                put(2, 0, 0, 0, 1);
            }
        };
        Mat distCoeffs = new Mat(1, 4, CvType.CV_32F) {
            {
                put(0, 0, 1, 3, 2, 4);
            }
        };

        Imgproc.undistort(src, dst, cameraMatrix, distCoeffs);

        truth = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 0, 0, 0);
                put(1, 0, 0, 0, 0);
                put(2, 0, 0, 3, 0);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testUndistortMatMatMatMatMat() {
        Mat src = new Mat(3, 3, CvType.CV_32F, new Scalar(3));
        Mat cameraMatrix = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 1, 0, 1);
                put(1, 0, 0, 1, 2);
                put(2, 0, 0, 0, 1);
            }
        };
        Mat distCoeffs = new Mat(1, 4, CvType.CV_32F) {
            {
                put(0, 0, 2, 1, 4, 5);
            }
        };
        Mat newCameraMatrix = new Mat(3, 3, CvType.CV_32F, new Scalar(1));

        Imgproc.undistort(src, dst, cameraMatrix, distCoeffs, newCameraMatrix);

        truth = new Mat(3, 3, CvType.CV_32F, new Scalar(3));
        assertMatEqual(truth, dst, EPS);
    }

    //undistortPoints(List<Point> src, List<Point> dst, Mat cameraMatrix, Mat distCoeffs)
    public void testUndistortPointsListOfPointListOfPointMatMat() {
        MatOfPoint2f src = new MatOfPoint2f(new Point(1, 2), new Point(3, 4), new Point(-1, -1));
        MatOfPoint2f dst = new MatOfPoint2f();
        Mat cameraMatrix = Mat.eye(3, 3, CvType.CV_64FC1);
        Mat distCoeffs = new Mat(8, 1, CvType.CV_64FC1, new Scalar(0));

        Imgproc.undistortPoints(src, dst, cameraMatrix, distCoeffs);

        assertEquals(src.size(), dst.size());
        for(int i=0; i<src.toList().size(); i++) {
            //Log.d("UndistortPoints", "s="+src.get(i)+", d="+dst.get(i));
            assertTrue(src.toList().get(i).equals(dst.toList().get(i)));
        }
    }


    public void testWarpAffineMatMatMatSize() {
        Mat src = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 2, 0, 1);
                put(1, 0, 6, 4, 3);
                put(2, 0, 1, 0, 2);
            }
        };
        Mat M = new Mat(2, 3, CvType.CV_32F) {
            {
                put(0, 0, 1, 0, 1);
                put(1, 0, 0, 1, 1);
            }
        };

        Imgproc.warpAffine(src, dst, M, new Size(3, 3));

        truth = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 0, 0, 0);
                put(1, 0, 0, 2, 0);
                put(2, 0, 0, 6, 4);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testWarpAffineMatMatMatSizeInt() {
        Mat src = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 2, 4, 1);
                put(1, 0, 6, 4, 3);
                put(2, 0, 0, 2, 2);
            }
        };
        Mat M = new Mat(2, 3, CvType.CV_32F) {
            {
                put(0, 0, 1, 0, 0);
                put(1, 0, 0, 0, 1);
            }
        };

        Imgproc.warpAffine(src, dst, M, new Size(2, 2), Imgproc.WARP_INVERSE_MAP);

        truth = new Mat(2, 2, CvType.CV_32F) {
            {
                put(0, 0, 6, 4);
                put(1, 0, 6, 4);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testWarpAffineMatMatMatSizeIntInt() {
        fail("Not yet implemented");
    }

    public void testWarpAffineMatMatMatSizeIntIntScalar() {
        fail("Not yet implemented");
    }

    public void testWarpPerspectiveMatMatMatSize() {
        Mat src = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 2, 4, 1);
                put(1, 0, 0, 4, 5);
                put(2, 0, 1, 2, 2);
            }
        };
        Mat M = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 1, 0, 1);
                put(1, 0, 0, 1, 1);
                put(2, 0, 0, 0, 1);
            }
        };

        Imgproc.warpPerspective(src, dst, M, new Size(3, 3));

        truth = new Mat(3, 3, CvType.CV_32F) {
            {
                put(0, 0, 0, 0, 0);
                put(1, 0, 0, 2, 4);
                put(2, 0, 0, 0, 4);
            }
        };
        assertMatEqual(truth, dst, EPS);
    }

    public void testWarpPerspectiveMatMatMatSizeInt() {
        fail("Not yet implemented");
    }

    public void testWarpPerspectiveMatMatMatSizeIntInt() {
        fail("Not yet implemented");
    }

    public void testWarpPerspectiveMatMatMatSizeIntIntScalar() {
        fail("Not yet implemented");
    }

    public void testWatershed() {
        Mat image = Mat.eye(4, 4, CvType.CV_8UC(3));
        Mat markers = new Mat(4, 4, CvType.CV_32SC1, new Scalar(0));

        Imgproc.watershed(image, markers);

        truth = new Mat(4, 4, CvType.CV_32SC1) {
            {
                put(0, 0, -1, -1, -1, -1);
                put(1, 0, -1, 0, 0, -1);
                put(2, 0, -1, 0, 0, -1);
                put(3, 0, -1, -1, -1, -1);
            }
        };
        assertMatEqual(truth, markers);
    }

    public void testGetTextSize() {
        String text = "Android all the way";
        double fontScale = 2;
        int thickness = 3;
        int baseLine[] = new int[1];

        Imgproc.getTextSize(text, Core.FONT_HERSHEY_SCRIPT_SIMPLEX, fontScale, thickness, null);
        Size res = Imgproc.getTextSize(text, Core.FONT_HERSHEY_SCRIPT_SIMPLEX, fontScale, thickness, baseLine);

        assertEquals(543.0, res.width);
        assertEquals(44.0, res.height);
        assertEquals(20, baseLine[0]);
    }

    public void testCircleMatPointIntScalar() {
        Point center = new Point(gray0.cols() / 2, gray0.rows() / 2);
        int radius = Math.min(gray0.cols() / 4, gray0.rows() / 4);
        Scalar color = new Scalar(128);

        Imgproc.circle(gray0, center, radius, color);

        assertTrue(0 != Core.countNonZero(gray0));
    }

    public void testCircleMatPointIntScalarInt() {
        Point center = new Point(gray0.cols() / 2, gray0.rows() / 2);
        int radius = Math.min(gray0.cols() / 4, gray0.rows() / 4);
        Scalar color = new Scalar(128);

        Imgproc.circle(gray0, center, radius, color, Core.FILLED);

        assertTrue(0 != Core.countNonZero(gray0));
    }

    public void testCircleMatPointIntScalarIntIntInt() {
        Point center = new Point(gray0.cols() / 2, gray0.rows() / 2);
        Point center2 = new Point(gray0.cols(), gray0.rows());
        int radius = Math.min(gray0.cols() / 4, gray0.rows() / 4);
        Scalar color128 = new Scalar(128);
        Scalar color0 = new Scalar(0);

        Imgproc.circle(gray0, center2, radius * 2, color128, 2, Imgproc.LINE_4, 1/*
                                                                            * Number
                                                                            * of
                                                                            * fractional
                                                                            * bits
                                                                            */);
        assertFalse(0 == Core.countNonZero(gray0));

        Imgproc.circle(gray0, center, radius, color0, 2, Imgproc.LINE_4, 0);

        assertTrue(0 == Core.countNonZero(gray0));
    }

    public void testClipLine() {
        Rect r = new Rect(10, 10, 10, 10);
        Point pt1 = new Point(5.0, 15.0);
        Point pt2 = new Point(25.0, 15.0);

        assertTrue(Imgproc.clipLine(r, pt1, pt2));

        Point pt1Clipped = new Point(10.0, 15.0);
        Point pt2Clipped = new Point(19.0, 15.0);
        assertEquals(pt1Clipped, pt1);
        assertEquals(pt2Clipped, pt2);

        pt1 = new Point(5.0, 5.0);
        pt2 = new Point(25.0, 5.0);
        pt1Clipped = new Point(5.0, 5.0);
        pt2Clipped = new Point(25.0, 5.0);

        assertFalse(Imgproc.clipLine(r, pt1, pt2));

        assertEquals(pt1Clipped, pt1);
        assertEquals(pt2Clipped, pt2);
    }

    public void testEllipse2Poly() {
        Point center = new Point(4, 4);
        Size axes = new Size(2, 2);
        int angle = 30;
        int arcStart = 30;
        int arcEnd = 60;
        int delta = 2;
        MatOfPoint pts = new MatOfPoint();

        Imgproc.ellipse2Poly(center, axes, angle, arcStart, arcEnd, delta, pts);

        Point truth[] = {
                new Point(5, 6),
                new Point(4, 6)
        };
        assertArrayPointsEquals(truth, pts.toArray(), EPS);
    }

    public void testEllipseMatPointSizeDoubleDoubleDoubleScalar() {
        Point center = new Point(gray0.cols() / 2, gray0.rows() / 2);
        Size axes = new Size(2, 2);
        double angle = 30, startAngle = 60, endAngle = 90;

        Imgproc.ellipse(gray0, center, axes, angle, startAngle, endAngle, colorWhite);

        assertTrue(0 != Core.countNonZero(gray0));
    }

    public void testEllipseMatPointSizeDoubleDoubleDoubleScalarInt() {
        Point center = new Point(gray0.cols() / 2, gray0.rows() / 2);
        Size axes = new Size(2, 2);
        double angle = 30, startAngle = 60, endAngle = 90;

        Imgproc.ellipse(gray0, center, axes, angle, startAngle, endAngle, colorWhite, Core.FILLED);

        assertTrue(0 != Core.countNonZero(gray0));
    }

    public void testEllipseMatPointSizeDoubleDoubleDoubleScalarIntIntInt() {
        Point center = new Point(gray0.cols() / 2, gray0.rows() / 2);
        Size axes = new Size(2, 2);
        Point center2 = new Point(gray0.cols(), gray0.rows());
        Size axes2 = new Size(4, 4);
        double angle = 30, startAngle = 0, endAngle = 30;

        Imgproc.ellipse(gray0, center, axes, angle, startAngle, endAngle, colorWhite, Core.FILLED, Imgproc.LINE_4, 0);

        assertTrue(0 != Core.countNonZero(gray0));

        Imgproc.ellipse(gray0, center2, axes2, angle, startAngle, endAngle, colorBlack, Core.FILLED, Imgproc.LINE_4, 1);

        assertEquals(0, Core.countNonZero(gray0));
    }

    public void testEllipseMatRotatedRectScalar() {
        int matSize = 10;
        Mat gray0 = Mat.zeros(matSize, matSize, CvType.CV_8U);
        Point center = new Point(matSize / 2, matSize / 2);
        Size size = new Size(matSize / 4, matSize / 2);
        RotatedRect box = new RotatedRect(center, size, 45);

        Imgproc.ellipse(gray0, box, new Scalar(1));

        final byte[] truth = new byte[] {
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
                0, 0, 0, 0, 1, 1, 0, 1, 0, 0,
                0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
                0, 0, 0, 1, 0, 1, 1, 0, 0, 0,
                0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

        assertMatEqual(new Mat(matSize, matSize, CvType.CV_8U) {
            {
                put(0, 0, truth);
            }
        }, gray0);
    }

    public void testEllipseMatRotatedRectScalarInt() {
        Point center = new Point(matSize / 2, matSize / 2);
        Size size = new Size(matSize / 4, matSize / 2);
        RotatedRect box = new RotatedRect(center, size, 45);

        Imgproc.ellipse(gray0, box, new Scalar(1), Core.FILLED);
        Imgproc.ellipse(gray0, box, new Scalar(0));

        assertTrue(0 < Core.countNonZero(gray0));
    }

    public void testEllipseMatRotatedRectScalarIntInt() {
        Point center = new Point(matSize / 2, matSize / 2);
        Size size = new Size(2, matSize * 2 / 3);
        RotatedRect box = new RotatedRect(center, size, 20);

        Imgproc.ellipse(gray0, box, new Scalar(9), 1, Imgproc.LINE_AA);
        Imgproc.ellipse(gray0, box, new Scalar(0), 1, Imgproc.LINE_4);

        assertTrue(0 < Core.countNonZero(gray0));
    }

    public void testPolylinesMatListOfListOfPointBooleanScalar() {
        Mat img = gray0;
        List<MatOfPoint> polyline = new ArrayList<MatOfPoint>();
        polyline.add(new MatOfPoint(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));

        Imgproc.polylines(img, polyline, true, new Scalar(100));

        assertEquals(22, Core.countNonZero(img));

        Imgproc.polylines(img, polyline, false, new Scalar(0));

        assertEquals(4, Core.countNonZero(img));
    }

    public void testPolylinesMatListOfListOfPointBooleanScalarInt() {
        Mat img = gray0;
        List<MatOfPoint> polyline = new ArrayList<MatOfPoint>();
        polyline.add(new MatOfPoint(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));

        Imgproc.polylines(img, polyline, true, new Scalar(100), 2);

        assertEquals(62, Core.countNonZero(img));
    }

    public void testPolylinesMatListOfListOfPointBooleanScalarIntIntInt() {
        Mat img = gray0;
        List<MatOfPoint> polyline1 = new ArrayList<MatOfPoint>();
        polyline1.add(new MatOfPoint(new Point(1, 1), new Point(7, 1), new Point(7, 6), new Point(1, 6)));
        List<MatOfPoint> polyline2 = new ArrayList<MatOfPoint>();
        polyline2.add(new MatOfPoint(new Point(2, 2), new Point(14, 2), new Point(14, 12), new Point(2, 12)));

        Imgproc.polylines(img, polyline1, true, new Scalar(100), 2, Imgproc.LINE_8, 0);

        assertTrue(Core.countNonZero(img) > 0);

        Imgproc.polylines(img, polyline2, true, new Scalar(0), 2, Imgproc.LINE_8, 1);

        assertEquals(0, Core.countNonZero(img));
    }

    public void testPutTextMatStringPointIntDoubleScalar() {
        String text = "Hello World";
        Size labelSize = new Size(175, 22);
        Mat img = new Mat(20 + (int) labelSize.height, 20 + (int) labelSize.width, CvType.CV_8U, colorBlack);
        Point origin = new Point(10, labelSize.height + 10);

        Imgproc.putText(img, text, origin, Core.FONT_HERSHEY_SIMPLEX, 1.0, colorWhite);

        assertTrue(Core.countNonZero(img) > 0);
        // check that border is not corrupted
        Imgproc.rectangle(img, new Point(11, 11), new Point(labelSize.width + 10, labelSize.height + 10), colorBlack, Core.FILLED);
        assertEquals(0, Core.countNonZero(img));
    }

    public void testPutTextMatStringPointIntDoubleScalarInt() {
        String text = "Hello World";
        Size labelSize = new Size(176, 22);
        Mat img = new Mat(20 + (int) labelSize.height, 20 + (int) labelSize.width, CvType.CV_8U, colorBlack);
        Point origin = new Point(10, labelSize.height + 10);

        Imgproc.putText(img, text, origin, Core.FONT_HERSHEY_SIMPLEX, 1.0, colorWhite, 2);

        assertTrue(Core.countNonZero(img) > 0);
        // check that border is not corrupted
        Imgproc.rectangle(img, new Point(10, 10), new Point(labelSize.width + 10 + 1, labelSize.height + 10 + 1), colorBlack, Core.FILLED);
        assertEquals(0, Core.countNonZero(img));
    }

    public void testPutTextMatStringPointIntDoubleScalarIntIntBoolean() {
        String text = "Hello World";
        Size labelSize = new Size(175, 22);

        Mat img = new Mat(20 + (int) labelSize.height, 20 + (int) labelSize.width, CvType.CV_8U, colorBlack);
        Point origin = new Point(10, 10);

        Imgproc.putText(img, text, origin, Core.FONT_HERSHEY_SIMPLEX, 1.0, colorWhite, 1, Imgproc.LINE_8, true);

        assertTrue(Core.countNonZero(img) > 0);
        // check that border is not corrupted
        Imgproc.rectangle(img, new Point(10, 10), new Point(labelSize.width + 9, labelSize.height + 9), colorBlack, Core.FILLED);
        assertEquals(0, Core.countNonZero(img));
    }
}

/* [<][>][^][v][top][bottom][index][help] */