使用OpenCv获取Android Studio中某种颜色的像素数

时间:2016-07-29 13:08:52

标签: java android opencv android-studio

我正在编写一个相当简单的应用程序,它会实时告诉用户图像中特定颜色值之上有多少像素。

也就是说,它会从相机拍摄预览图像并在用户移动相机时对其进行分析。

现在,我有这个代码,技术上有效:

    mRgba = inputFrame.rgba();

    Rect sample = new Rect();
    Mat sampleRegionRgba;

    numPixs = 0;
    boundary.add(100); boundary.add(100);boundary.add(100);

    int cols = mRgba.cols();
    int rows = mRgba.rows();

    double yLow = (double)mOpenCvCameraView.getHeight() * 0.2401961;
    double yHigh = (double)mOpenCvCameraView.getHeight() * 0.7696078;

    double xScale = (double)cols / (double)mOpenCvCameraView.getWidth();
    double yScale = (double)rows / (yHigh-yLow);

    int tmpX;
    int tmpY;

    for (int x = 0; x < cols-6; x++) {
        for (int y = (int)yLow; y < yHigh-6; y++){

            tmpX = (int)((double)x * xScale);

            tmpY = (int)((double)y * yScale);

            sample.x = tmpX+3;
            sample.y = tmpY+3;



            sample.width = 2;
            sample.height = 2;

            sampleRegionRgba = mRgba.submat(sample);
            Mat sampleRegionHsv = new Mat();
            Imgproc.cvtColor(sampleRegionRgba, sampleRegionHsv, Imgproc.COLOR_RGB2HSV_FULL);

            mBlobColorHsv = Core.sumElems(sampleRegionHsv);
            int pointCount = sample.width * sample.height;
            for (int i = 0; i < mBlobColorHsv.val.length; i++){
                mBlobColorHsv.val[i] /= pointCount;
            }

            mBlobColorRgba = convertScalarToRgba(mBlobColorHsv);

//                System.out.println(mBlobColorRgba.toString());

            if (mBlobColorRgba.val[0] > boundary.get(0)
                    && mBlobColorRgba.val[1] > boundary.get(1)
                    && mBlobColorRgba.val[2] > boundary.get(2)){
                numPixs += 1;
            }


//                System.out.println(sampleRegionRgba.toString());
        }
    }

    System.out.println("number of pixels above boundary: "+Integer.toString(numPixs));

    massflow = m*(Math.pow(numPixs,.25))+b;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            massflow_text.setText("Massflow: "+Double.valueOf(massflow));
        }
    });

虽然此代码有效,但每张图片运行大约需要6秒钟。

我希望它具有更合理的帧速率。我知道这可以用numpy完成(我已经用np.where()完成了)。是否可以使用Java / OpenCv / Android Studio?

0 个答案:

没有答案