在Android中使用OpenCV将inputFrame从相机转换为HSI



我想使用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;
}

它显示错误

java.lang.UnsupportedOperationException: Provided data element number (3) should be multiple of the Mat channels count (4)

我搜索了一段时间以找出此错误的原因。
我发现我放了一个大小为 3 而不是 4 的数组。
Android 将字节数组从 Camera API 转换为颜色 Mat 对象 openCV
我想知道从安卓相机接收什么类型的图像。
为什么当我得到一个大小为 4 的数组时?
如何将从Android相机接收的图像转换为HSI并在屏幕上预览?

以下是被覆盖的方法 onCameraFrame

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("Redn" + Double.toString(mRgb_pixel[0]));
            mGreen_textview.setText("Greenn" + Double.toString(mRgb_pixel[1]));
            mBlue_textview.setText("Bluen" + 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;
    }
}

My MainActivity 实现了 CameraBridgeViewBase.CvCameraViewListener2

[编辑]
我认为它返回大小为 4 的数组的原因是因为帧是 RGBA 格式,而不是 RGB 格式。
因此,如何将RGBA转换为HSI并在屏幕上预览帧?

这里的问题是你的 hsiFrame 是一个 4 通道的图像,而你的数组只有 3 个值。你需要添加一个对应于阿尔法通道的项到你的数组中。进行以下任一更改应该适合您:

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

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新