我遇到了一些关于检测上传图片中人脸的问题。我知道问题在于我不知道如何将正在测试的人脸检测代码应用于导入的图片上。我正在测试的示例代码是针对本地存储的图像编写的。我相信我已经接近成功,但你能帮我吗?
首先,我创建了一个图库方法。
任何建议?我离让它工作非常接近!
首先,我创建了一个图库方法。
protected void gallery() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction("android.intent.action.GET_CONTENT");
startActivityForResult(Intent.createChooser(intent, "Choose An Image"), 1);
}
我还在学习意图等相关知识,但据我所知,我需要使用意图来使用Android的图库,并且因为我设置了获取内容的setAction,我也使用意图将信息传递给它。 有了这个前提,我试图将意图中的信息传递到一个URI中。 接下来是我的操作。
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if(requestCode == 1 && resultCode == RESULT_OK)
{
Uri uri = intent.getData();
try {
InputStream is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
ImageView image = (ImageView)findViewById(R.id.img_view);
image.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
}
}
对我来说,这里有些令人困惑的地方。我猜InputStream包含了图片信息?我尝试在同一try-catch中应用面部检测代码。我想在image.setImageBitmap(bitmap)完成后应用面部检测。以下是面部检测代码。
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if(requestCode == 1 && resultCode == RESULT_OK)
{
Uri uri = intent.getData();
try {
InputStream is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
ImageView image = (ImageView)findViewById(R.id.image_view);
image.setImageBitmap(bitmap);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig=Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeResource(getResources(), R.id.img_view, options);
imageWidth = bitmap.getWidth();
imageHeight = bitmap.getHeight();
detectedFaces = new FaceDetector.Face[NUM_FACES];
faceDetector= new FaceDetector(imageWidth, imageHeight, NUM_FACES);
NUM_FACE_DETECTED = faceDetector.findFaces(bitmap, detectedFaces);
mIL.invalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我不知道如何更改“mFaceBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.smilingfaces,options);”,它用于本地图片,以适应我认为存储在InputStream中的图像(还是吗?所选图像在哪里?)我想到的办法是调整imageView布局,因为图像在布局中。我不明白所有这些如何传输和协同工作。无论如何,这个代码片段应该检测人脸。然后onDraw()绘制出检测到的面部周围的正方形。我不确定放在哪里,但我将其放在了onActivityResult()之外。
protected void onDraw(Canvas canvas) {
Paint myPaint = new Paint();
myPaint.setColor(Color.RED);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeWidth(3);
myPaint.setDither(true);
for (int count = 0; count < NUM_FACE_DETECTED; count++) {
Face face = detectedFaces[count];
PointF midPoint = new PointF();
face.getMidPoint(midPoint);
eyeDistance = face.eyesDistance();
canvas.drawRect(midPoint.x-eyeDistance, midPoint.y-eyeDistance, midPoint.x+eyeDistance, midPoint.y+eyeDistance, myPaint);
}
}
任何建议?我离让它工作非常接近!