OpenCV Hu Moments Android

时间:2016-02-26 20:53:22

标签: java android image opencv android-studio

我正在开发一个应用程序,它可以获取使用设备相机拍摄的图像的HU时刻。在达到HU矩计算之前的图像是:灰度,gausseanBlurr,二值化,canny算法,应用方法findcontour(),最后计算HU矩。所有这些都是在Android Studio上使用OpenCV完成的。

public void Hu()
{

    Mat imagenOriginal;
    imagenOriginal = new Mat();
    Mat binario;
    binario = new Mat();
    Mat Canny;
    Canny = new Mat();

    Utils.bitmapToMat(bitmap, imagenOriginal);
    Mat gris= new Mat(imagenOriginal.width() ,imagenOriginal.height(),imagenOriginal.type());
    Imgproc.cvtColor(imagenOriginal, gris, Imgproc.COLOR_RGB2GRAY);
    org.opencv.core.Size s = new Size(3,3);
    Imgproc.GaussianBlur(gris, gris, s, 2);

    Imgproc.threshold(gris, binario, 100, 255, Imgproc.THRESH_BINARY);
    Imgproc.Canny(gris, Canny, 50, 50 * 3);

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();

    Mat hierarcy = new Mat();

    Imgproc.findContours(Canny, contours, hierarcy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
    Imgproc.drawContours(Canny, contours, -1, new Scalar(Math.random() * 255, Math.random() * 255, Math.random() * 255));

    Moments momento = new Moments();
    Mat hu= new Mat();

    momento = Imgproc.moments(contours.get(0), false); // ERROR LINE

    Imgproc.HuMoments(momento, hu);

}

当我执行计算时,Hu时刻就是我有错误的原因,因为每次q对图像应用某些算法时我都会进行测试。 如何获得HU时刻的代码来自这里:

Android: using hu moments opencv function to get the feature value

我也明白HU时刻保存在Hu变量中,但是我看不到打印所有值的方法。

谢谢!

1 个答案:

答案 0 :(得分:0)

嗨,大哥:是的,我有同样的问题,我在寻找没有结果的WEB :(但是经过一段时间的思考,我得到了一个清晰的时刻:如果我有所有的时刻(中心,标准化,原始,等)在Moments函数中为什么我不能直接使用公式来获得Hu时刻,所以我做了它并且它有效!!请检查下面是否对你有帮助...

 Moments p = new Moments();

        List<Moments> nu = new ArrayList<Moments>(contours.size());

        for(int i=0; i<contours.size(); i++)
        {
            nu.add(i, Imgproc.moments(contours.get(i),false));
             p=nu.get(i);

        }

//现在完成手动计算HU时刻             double [] moment = new double [8];

        double
                n20 = p.get_nu20(),
                n02 = p.get_nu02(),
                n30 = p.get_nu30(),
                n12 = p.get_nu12(),
                n21 = p.get_nu21(),
                n03 = p.get_nu03(),
                n11 = p.get_nu11();

        //First moment
        moments[0] = n20 + n02;

        //Second moment
        moments[1] = Math.pow((n20 - 02), 2) + Math.pow(2 * n11, 2);

        //Third moment
        moments[2] = Math.pow(n30 - (3 * (n12)), 2)
                + Math.pow((3 * n21 - n03), 2);

        //Fourth moment
        moments[3] = Math.pow((n30 + n12), 2) + Math.pow((n12 + n03), 2);

        //Fifth moment
        moments[4] = (n30 - 3 * n12) * (n30 + n12)
                * (Math.pow((n30 + n12), 2) - 3 * Math.pow((n21 + n03), 2))
                + (3 * n21 - n03) * (n21 + n03)
                * (3 * Math.pow((n30 + n12), 2) - Math.pow((n21 + n03), 2));

        //Sixth moment
        moments[5] = (n20 - n02)
                * (Math.pow((n30 + n12), 2) - Math.pow((n21 + n03), 2))
                + 4 * n11 * (n30 + n12) * (n21 + n03);

        //Seventh moment
        moments[6] = (3 * n21 - n03) * (n30 + n12)
                * (Math.pow((n30 + n12), 2) - 3 * Math.pow((n21 + n03), 2))
                + (n30 - 3 * n12) * (n21 + n03)
                * (3 * Math.pow((n30 + n12), 2) - Math.pow((n21 + n03), 2));

        //Eighth moment
        moments[7] = n11 * (Math.pow((n30 + n12), 2) - Math.pow((n03 + n21), 2))
                - (n20 - n02) * (n30 + n12) * (n03 + n21);

        return moments;