在Android中使用OpenCV将inputFrame从摄像头转换为HSI

在Android中使用OpenCV将inputFrame从摄像头转换为HSI,android,opencv,Android,Opencv,我想使用OpenCV将Android摄像头的图像转换为HSI格式。 问题是当我使用以下方法时 private Mat rgb2hsi(Mat rgbFrame) { Mat hsiFrame = rgbFrame.clone(); for( int i = 0; i < rgbFrame.rows(); ++i ) { for( int j = 0; j < rgbFrame.cols(); ++j ) { double[]

我想使用OpenCV将Android摄像头的图像转换为HSI格式。 问题是当我使用以下方法时

private Mat rgb2hsi(Mat rgbFrame) {
    Mat hsiFrame = rgbFrame.clone();

    for( int i = 0; i < rgbFrame.rows(); ++i ) {
        for( int j = 0; j < rgbFrame.cols(); ++j ) {
            double[] rgb = rgbFrame.get(i, j);
            Log.d(MAINTAG, "rgbFrame.get(i, j) array size = " + rgb.length);
            double colorR = rgb[0];
            double colorG = rgb[1];
            double colorB = rgb[2];

            double minRGB = min(colorR, colorG, colorB);
            double colorI = (colorR + colorG + colorB) / 3;
            double colorS = 0.0;

            if(colorI > 0) colorS = 1.0 - (minRGB / colorI);

            double colorH;
            double const1 = colorR - (colorG / 2) - (colorB / 2);
            double const2 = Math.sqrt(Math.pow(colorR, 2) + Math.pow(colorG, 2) + Math.pow(colorR, 2)
                            - (colorR * colorG) - (colorR * colorB) - (colorG * colorB));

            colorH = Math.acos(const1 / const2);
            if(colorB > colorG) colorH = 360 - colorH;

            double[] hsi = {colorH, colorS, colorI};
            hsiFrame.put(i, j, hsi);
        }
    }


    return hsiFrame;
}
我搜索了一段时间以找出此错误的原因。
我发现我放置了一个大小为3而不是4的数组。

我想知道安卓摄像头接收到的图像类型。
为什么当我得到一个大小为4的数组时?
如何将从Android摄像头接收到的图像转换为HSI并在屏幕上预览?

以下是在CameraFrame上重写的方法

我的主要活动实现CameraBridgeViewBase.CvCameraViewListener2

[编辑]
我认为它返回大小为4的数组的原因是帧是RGBA格式,而不是RGB格式。

因此,如何将RGBA转换为HSI并在屏幕上预览帧?

这里的问题是,HSI帧是4通道图像,HSI数组只有3个值。您需要向hsi阵列中添加一个与alpha通道对应的项。进行以下更改中的任何一项都应适用于您:

1. double[] hsi = {colorH, colorS, colorI, rgb[3]};
2. Mat hsiFrame = new Mat(rgbFrame.size(), CvType.CV_8UC3);
希望这有帮助

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    Mat outputFrame = inputFrame.rgba();

    /* Get RGB color from the pixel at [index_row, index_column] */
    int index_row = 0;
    int index_column = 0;
    final double[] mRgb_pixel = outputFrame.get(index_row, index_column);

    /* Show the result */
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            int r = (int) mRgb_pixel[0];
            int g = (int) mRgb_pixel[1];
            int b = (int) mRgb_pixel[2];
        /* Set RGB color */
            mRred_textview.setText("Red\n" + Double.toString(mRgb_pixel[0]));
            mGreen_textview.setText("Green\n" + Double.toString(mRgb_pixel[1]));
            mBlue_textview.setText("Blue\n" + Double.toString(mRgb_pixel[2]));
            mColor_textview.setBackgroundColor(Color.rgb(r, g, b));
        }
    });

    if(mPreviewType == PreviewType.GB) {
        outputFrame.convertTo(outputFrame, CvType.CV_64FC3);
        return getGBColor(rgb2hsi(outputFrame));
    } else if (mPreviewType == PreviewType.HSI) {
        outputFrame.convertTo(outputFrame, CvType.CV_64FC3);
        return rgb2hsi(outputFrame);
    } else {
        return outputFrame;
    }
}
1. double[] hsi = {colorH, colorS, colorI, rgb[3]};
2. Mat hsiFrame = new Mat(rgbFrame.size(), CvType.CV_8UC3);