日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android App】人脸识别中借助摄像头和OpenCV实时检测人脸讲解及实战(附源码和演示 超详细)

發布時間:2023/12/20 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android App】人脸识别中借助摄像头和OpenCV实时检测人脸讲解及实战(附源码和演示 超详细) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需要全部代碼請點贊關注收藏后評論區留言私信~~~

一、借助攝像頭實時檢測人臉

與Android自帶的人臉檢測器相比,OpenCV具備更強勁的人臉識別功能,它可以通過攝像頭實時檢測人臉,實時檢測的預覽空間是JavaCameraView 常用方法說明如下

setCvCameraViewListener:設置OpenCV的相機視圖監聽器。監聽器需要寫下列三個狀態變更方法:

onCameraViewStarted:相機視圖開始預覽時回調。

onCameraViewStopped:相機視圖停止預覽時回調。

onCameraFrame:相機視圖預覽變更時回調。

enableView:啟用OpenCV的相機視圖。

?disableView:禁用OpenCV的相機視圖。

接下來把JavaCameraView加入App工程,走一遍它的詳細使用過程,首先修改AndroidManifest.xml補充一行相機權限配置

<uses-permission android:name="android.permission.CAMERA"/>

實時檢測人臉有如下四個步驟

(1)從布局文件中獲得相機視圖對象后,調用它的setCvCameraViewListener方法,設置OpenCV的相機視圖監聽器。

(2)OpenCV初始化與資源加載完成后,調用enableView方法開啟相機視圖。

(3)活動類由繼承AppCompatActivity改為繼承CameraActivity類,并重寫getCameraViewList方法,返回相機視圖的單例列表。

(4)第一步重寫監聽器接口的onCameraFrame方法時,補充人臉識別等處理邏輯,也就是先檢測人臉,再給人臉標上相框。

二、效果展示

運行測試App 會自動打開手機攝像機 然后檢測攝像機內的人臉

由頂部狀態欄可以看到打開了相機功能 此處用了博主小時候的照片~~~

三、代碼?

部分代碼如下 需要全部源碼請點贊關注收藏后評論區留言~~~

package com.example.face;import android.content.Context; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.widget.TextView;import com.example.face.util.DateUtil;import org.opencv.android.CameraActivity;import org.opencv.android.BaseLoaderCallback; import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.OpenCVLoader; import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfRect; import org.opencv.core.Rect; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.objdetect.CascadeClassifier;import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Collections; import java.util.List;//OpenCV的實時掃描頁面必須繼承CameraActivity public class DetectRealtimeActivity extends CameraActivity implements CameraBridgeViewBase.CvCameraViewListener2 {private static final String TAG = "DetectRealtimeActivity";private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255);private Mat mRgba, mGray; // 全彩矩陣,灰度矩陣private CascadeClassifier mJavaDetector; // OpenCV的人臉檢測器private int mAbsoluteFaceSize = 0; // 絕對人臉大小// OpenCV默認橫屏掃描,需要旋轉90度改成豎屏預覽,詳細改動見CameraBridgeViewBase.java的deliverAndDrawFrame方法private CameraBridgeViewBase jcv_detect; // 聲明一個OpenCV的相機視圖對象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_detect_realtime);findViewById(R.id.iv_back).setOnClickListener(v -> finish());TextView tv_title = findViewById(R.id.tv_title);tv_title.setText("實時檢測人臉");jcv_detect = findViewById(R.id.jcv_detect);jcv_detect.setVisibility(CameraBridgeViewBase.VISIBLE);jcv_detect.setCvCameraViewListener(this); // 設置OpenCV的相機視圖監聽器}@Overridepublic void onPause() {super.onPause();if (jcv_detect != null) {jcv_detect.disableView(); // 禁用OpenCV的相機視圖}}@Overridepublic void onResume() {super.onResume();if (!OpenCVLoader.initDebug()) {Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);} else {Log.d(TAG, "OpenCV library found inside package. Using it!");mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);}}@Overrideprotected List<? extends CameraBridgeViewBase> getCameraViewList() {return Collections.singletonList(jcv_detect);}@Overridepublic void onDestroy() {super.onDestroy();jcv_detect.disableView(); // 禁用OpenCV的相機視圖}@Overridepublic void onCameraViewStarted(int width, int height) {mGray = new Mat();mRgba = new Mat();}@Overridepublic void onCameraViewStopped() {mGray.release();mRgba.release();}// 相機預覽回調@Overridepublic Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {mRgba = inputFrame.rgba();mGray = inputFrame.gray();Core.rotate(mRgba, mRgba, Core.ROTATE_90_CLOCKWISE); // 適配豎屏,順時針旋轉90度Core.rotate(mGray, mGray, Core.ROTATE_90_CLOCKWISE); // 適配豎屏,順時針旋轉90度if (mAbsoluteFaceSize == 0) {Log.d(TAG, "width="+mGray.width()+", height="+mGray.height()+", cols="+mGray.cols()+", rows="+mGray.rows());int height = mGray.rows();if (Math.round(height * 0.2f) > 0) {mAbsoluteFaceSize = Math.round(height * 0.2f);} // String filePath = String.format("%s/%s.jpg", // getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString(), // DateUtil.getNowDateTime()); // Imgcodecs.imwrite(filePath, mRgba); // Log.d(TAG, "filePath="+filePath);}MatOfRect faces = new MatOfRect();if (mJavaDetector != null) { // 檢測器開始識別人臉mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2,new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());}Rect[] faceArray = faces.toArray();for (Rect rect : faceArray) { // 給找到的人臉標上相框Imgproc.rectangle(mRgba, rect.tl(), rect.br(), FACE_RECT_COLOR, 3);Log.d(TAG, rect.toString());}Core.rotate(mRgba, mRgba, Core.ROTATE_90_COUNTERCLOCKWISE); // 恢復原狀,逆時針旋轉90度return mRgba;}private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {if (status == LoaderCallbackInterface.SUCCESS) {Log.d(TAG, "OpenCV loaded successfully");// 在OpenCV初始化完成后加載so庫System.loadLibrary("detection_based_tracker");File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);File cascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");// 從應用程序資源加載級聯文件try (InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);FileOutputStream os = new FileOutputStream(cascadeFile)) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);}} catch (Exception e) {e.printStackTrace();}// 根據級聯文件創建OpenCV的人臉檢測器mJavaDetector = new CascadeClassifier(cascadeFile.getAbsolutePath());if (mJavaDetector.empty()) {Log.d(TAG, "Failed to load cascade classifier");mJavaDetector = null;} else {Log.d(TAG, "Loaded cascade classifier from " + cascadeFile.getAbsolutePath());}cascadeDir.delete();jcv_detect.enableView(); // 啟用OpenCV的相機視圖} else {super.onManagerConnected(status);}}};}

創作不易? 覺得有幫助請點贊關注收藏~~~

總結

以上是生活随笔為你收集整理的【Android App】人脸识别中借助摄像头和OpenCV实时检测人脸讲解及实战(附源码和演示 超详细)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品一级二级 | 国产吞精囗交久久久 | 欧美黄色三级视频 | 亚欧在线视频 | 久久久999精品视频 国产在线xx | 欧美色图激情小说 | 亚洲精品字幕在线观看 | 91成人一区二区三区 | 天堂网成人 | 蜜臀av无码精品人妻色欲 | 性xxxxxxxxx| 在线观看麻豆 | 欧美激情 国产精品 | 91爱视频| 国产精品一区三区 | 欧美一区二区三 | 伊人精品一区二区三区 | 婷婷色综合 | 伊人院 | 人人天天夜夜 | 嫩草视频在线观看免费 | 在线成人观看 | 毛片网站在线 | 日韩精品乱码久久久久久 | 日韩色黄大片 | 男女扒开双腿猛进入爽爽免费 | 影音先锋激情在线 | 欧洲国产精品 | 久久午夜鲁丝 | 五月花成人网 | 国精产品一区一区三区mba下载 | 先锋影音一区二区 | 日韩激情图片 | 国产福利免费观看 | 日日狠狠久久偷偷四色综合免费 | 免费99精品国产自在在线 | 波多在线观看 | aaa午夜 | 少妇日韩 | 国产精成人| 日韩一级色 | 中文字幕无码日韩专区免费 | 人人澡人人干 | 免费看国产精品 | 大奶av | 亚洲高清在线视频 | 天天激情站 | 国产999在线| 欧美色老头old∨ideo | 日韩欧美视频一区二区三区 | 91丨porny丨对白 | 亚洲成人a∨ | 日韩91av| 久久夜靖品2区 | 日韩 欧美 | 88国产精品视频一区二区三区 | 碰碰久久 | 一级毛片黄色 | 中文字幕乱码无码人妻系列蜜桃 | 精品久久国产字幕高潮 | 欧美毛片网站 | 日本欧美韩国国产精品 | 日韩av一卡 | 天天干天天爱天天射 | 五月天狠狠操 | 久色免费视频 | 精品人妻少妇一区二区 | 国产片网站 | 干骚视频 | 激情av一区 | 手机天堂网 | 91精品播放 | 成人在线观看网址 | 真实的国产乱xxxx在线91 | 黄色大片久久 | 久久福利免费视频 | 自拍偷拍激情 | 亚洲欧美日韩一区二区三区在线观看 | 视频毛片 | 色啦啦视频 | 这里只有精品视频在线 | 色涩久久| 穿扒开跪着折磨屁股视频 | 欧美精品动漫 | 在线观看日韩精品 | 亚洲A∨无码国产精品 | 涩天堂 | 成人综合婷婷国产精品久久 | 亚洲 欧美 综合 | 天天色综合影视 | 特级西西人体 | 国产精品外围 | 按摩毛片 | 国产精品老女人 | 一级片免费看视频 | 国产 日韩 欧美 精品 | 狠狠干综合网 | 精品一区李梓熙捆绑 | 欧美资源网 |