我想使用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);
希望这有帮助。