我想检测相机预览中的面孔。 我在OpenCV示例中看到了这个例子:
@Override
protected Bitmap processFrame(VideoCapture capture) {
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
if (mCascade != null) {
int height = mGray.rows();
int faceSize = Math.round(height * FdActivity.minFaceSize);
List<Rect> faces = new LinkedList<Rect>();
mCascade.detectMultiScale(mGray, faces, 1.1, 2, 2 // TODO: objdetect.CV_HAAR_SCALE_IMAGE
, new Size(faceSize, faceSize));
for (Rect r : faces)
Core.rectangle(mRgba, r.tl(), r.br(), new Scalar(0, 255, 0, 255), 3);
}
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
if (Utils.matToBitmap(mRgba, bmp))
return bmp;
bmp.recycle();
return null;
}
我为我的项目重写了这段代码(来自PreviewCallback的onPreviewFrame()输入byte []数据):
public Highlighting[] get(byte[] data) {
matYuv = new Mat(480, 320, CvType.CV_8UC1);
matYuv.put(0, 0, data);
Imgproc.cvtColor(matYuv, matRgb, Imgproc.COLOR_YUV420sp2RGB, 4);
Highlighting[] hl = null;
Imgproc.cvtColor(matRgb, matGray, Imgproc.COLOR_RGB2GRAY, 0);
if (cascade != null) {
int faceSize = 50;
List<Rect> faces = new LinkedList<Rect>();
cascade.detectMultiScale(matGray, faces, 1.1, 2, 2, new Size(
faceSize, faceSize));
hl = new Highlighting[faces.size()];
int i = 0;
for (Rect r : faces) {
hl[i] = new Highlighting((int) r.tl().x, (int) r.tl().y,
(int) r.br().x, (int) r.br().y, "");
i++;
}
Log.i("FACES", String.valueOf(faces.size()));
}
return hl;
}
但是我有问题,我的代码不能正常工作 - 它不会检测到面孔。转换字节数组会有问题吗?
答案 0 :(得分:3)
480 + 240(高度)来自YUV 420格式。
这种格式具有带有480x320,U和V平面的Y平面,每个0.5 *分辨率的Y平面(详细查找YUV格式)。由于一个帧的所有3个平面都存储在一个图像中,因此您必须分配足够的空间。