Android OpenCV 人脸识别 Opencv3.1
2016-12-08 11:31
393 查看
只是一个简单的demo。只能检测人脸,识别率很低,以后还要实现人脸的识别,认出你是谁。以后补充。。。
1.配置环境
参考之前的文章
http://blog.csdn.net/aaron121314/article/details/53465547
2.布局
3.权限
4.初始化
到这里就可以显示Camera的画面了。
lbpcascade_frontalface.xml 这个人脸训练数据。用来检测人脸的。
5.检测人脸
实现这个listener
然后去检测人脸。
注意:我在测试的时候,preview画面的被旋转了90度,所以这样要把图像弄正。2个参数都要旋转,mGray也要选择,要不画面是正的,但是检测不到人脸。
1.配置环境
参考之前的文章
http://blog.csdn.net/aaron121314/article/details/53465547
2.布局
<org.opencv.android.JavaCameraView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/HelloOpenCvView" />
3.权限
<uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/> <uses-feature android:name="android.hardware.camera.front" android:required="false"/> <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>
4.初始化
private CameraBridgeViewBase mOpenCvCameraView;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.HelloOpenCvView); mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); mOpenCvCameraView.setCvCameraViewListener(this); }
@Override protected void onResume() { super.onResume(); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback); }
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { try { // load cascade file from application resources InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface); File cascadeDir = getDir("cascade", C 4000 ontext.MODE_PRIVATE); mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml"); FileOutputStream os = new FileOutputStream(mCascadeFile); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } is.close(); os.close(); mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath()); if (mJavaDetector.empty()) { mJavaDetector = null; } cascadeDir.delete(); } catch (IOException e) { e.printStackTrace(); } mOpenCvCameraView.enableView(); } break; default: { super.onManagerConnected(status); } break; } } };
到这里就可以显示Camera的画面了。
lbpcascade_frontalface.xml 这个人脸训练数据。用来检测人脸的。
5.检测人脸
实现这个listener
public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2
@Override public void onCameraViewStarted(int width, int height) { mGray = new Mat(); mRgba = new Mat();
mRgbaT=new Mat();}@Overridepublic void onCameraViewStopped() { mGray.release(); mRgba.release();
mRgbaT.release();}
@Override public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); mGray = inputFrame.gray(); Core.transpose(mRgba,mRgbaT); //转置函数,可以水平的图像变为垂直 Imgproc.resize(mRgbaT,mRgba, mRgba.size(), 0.0D, 0.0D, 0); //将转置后的图像缩放为mRgbaF的大小 Core.flip(mRgba, mRgba,0); //根据x,y轴翻转,0-x 1-y Core.transpose(mGray,mRgbaT); //转置函数,可以水平的图像变为垂直 Imgproc.resize(mRgbaT,mGray, mGray.size(), 0.0D, 0.0D, 0); //将转置后的图像缩放为mRgbaF的大小 Core.flip(mGray, mGray,0); //根据x,y轴翻转,0-x 1-y if (mAbsoluteFaceSize == 0) { int height = mGray.rows(); if (Math.round(height * mRelativeFaceSize) > 0) { mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize); } } MatOfRect faces = new MatOfRect(); if (mJavaDetector != null) mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size()); Rect[] facesArray = faces.toArray(); for (int i = 0; i < facesArray.length; i++) { Log.i("a","face "+facesArray[i]); Imgproc.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3); } return mRgba; } }
然后去检测人脸。
注意:我在测试的时候,preview画面的被旋转了90度,所以这样要把图像弄正。2个参数都要旋转,mGray也要选择,要不画面是正的,但是检测不到人脸。
Core.transpose(mRgba,mRgbaT); //转置函数,可以水平的图像变为垂直 Imgproc.resize(mRgbaT,mRgba, mRgba.size(), 0.0D, 0.0D, 0); //将转置后的图像缩放为mRgbaF的大小 Core.flip(mRgba, mRgba,0); //根据x,y轴翻转,0-x 1-y Core.transpose(mGray,mRgbaT); //转置函数,可以水平的图像变为垂直 Imgproc.resize(mRgbaT,mGray, mGray.size(), 0.0D, 0.0D, 0); //将转置后的图像缩放为mRgbaF的大小 Core.flip(mGray, mGray,0); //根据x,y轴翻转,0-x 1-y
相关文章推荐
- OpenCV-2.4.6-android-sdk 人脸识别demo搭建
- android 结合 opencv项目(NDK、OpenCV、android,官方Demo人脸识别)
- OpenCV4Android调试人脸识别sample时遇到的问题和解决办法
- android opencv 简单的人脸识别
- python2.7+opencv3.1人脸识别
- 【Android】Android使用OpenCV实现人脸识别(OpenCV+JavaCV)
- Android 人脸识别+人脸匹配(OpenCV+JavaCV)
- OpenCV-2.4.6-android-sdk 人脸识别demo搭建
- OpenCV-2.4.6-android-sdk 人脸识别demo搭建
- android OpenCV研究之动态人脸识别
- Android使用OpenCV实现「人脸检测」和「人脸识别」
- (人脸识别1-2)——ubuntu16.04 安装 opencv 3.1
- android jni中将大数据回调到java层的时候用法,比如视频流,音频流等,图片流等 比如我用ffmpeg解码好视频流,想送到java层使用opengGL进行显示,opencv进行人脸识别等等
- Opencv4Android人脸识别之opencv_contrib编译
- 人脸识别opencv3.1 for python(基于LBH)
- Android使用OpenCV实现「人脸检测」和「人脸识别」
- (opencv)Android人脸识别
- Opencv3.3 人脸识别 图片拼接 Android
- Android 人脸识别+人脸匹配(OpenCV+JavaCV)
- 基于opencv2.0的haar算法以人脸识别为例的训练分类器xml的方法