在Android中使用OpenCV将inputFrame从摄像头转换为HSI
我想使用OpenCV将Android摄像头的图像转换为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[]
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);