人脸及脸部关键点检测控件
本文的合集已經(jīng)編著成書(shū),高級(jí)Android開(kāi)發(fā)強(qiáng)化實(shí)戰(zhàn),歡迎各位讀友的建議和指導(dǎo)。在京東即可購(gòu)買(mǎi):https://item.jd.com/12385680.html
檢測(cè)人臉, 在應(yīng)用中有很多用處, 可以提供更好的交互, 和一些有針對(duì)性的意見(jiàn). 檢測(cè)臉部關(guān)鍵信息, 也可以更加方便的處理一些微表情的內(nèi)容.
Google推出了官方的人臉檢測(cè)功能, 很不幸依賴(lài)Google Service, 需要版本8.1以上. 國(guó)內(nèi)手機(jī)基本不會(huì)默認(rèn)配置. 下載地址, 此版本適配手機(jī)系統(tǒng)4.4+.
官方API
我講解一下用法, 寫(xiě)了一個(gè)簡(jiǎn)單的顯示控件, 注釋詳細(xì).
關(guān)注:
(1) 如何提取人臉(Face)位置.
(2) 如何提取臉部關(guān)鍵點(diǎn)(Landmark)位置.
(3) 如何在畫(huà)布(Canvas)居中繪制圖片.
1. 配置項(xiàng)目
新建HelloWorld項(xiàng)目, 配置build.gradle.
compile 'com.google.android.gms:play-services-vision:8.1.0' // 包含人臉識(shí)別類(lèi)compile 'com.jakewharton:butterknife:7.0.1'一般都會(huì)從最基礎(chǔ)的HelloWorld開(kāi)始, 方便學(xué)習(xí)和理解. ButterKnife必用.
2. 檢測(cè)人臉控件
控件居中顯示一張圖片, 在圖片上, 繪制人臉位置和關(guān)鍵點(diǎn)(Landmarks).
關(guān)鍵點(diǎn)包括: 眼睛, 鼻子, 嘴等屬性. 存在遮擋, 根據(jù)不同人臉提取量不同.
通過(guò)FaceDetector檢測(cè)Bitmap, 獲取圖片的所有臉部(face)信息.
根據(jù)位置(Position)畫(huà)出臉的形狀, 根據(jù)關(guān)鍵點(diǎn)(Landmarks)畫(huà)出臉部特征.
同時(shí)可以獲取各種特征的概率(Probability), 和臉部偏移.
圖像和特征是顯示在畫(huà)布上, 根據(jù)畫(huà)布大小, 等比例縮放, 并居中顯示.
3. 主頁(yè)面
主界面通過(guò)一個(gè)簡(jiǎn)單的ViewPager連續(xù)顯示圖片.
@Bind(R.id.main_vp_container) ViewPager mVpContainer; // 連續(xù)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);mVpContainer.setAdapter(new FacesViewPagerAdapter(getSupportFragmentManager()));}適配傳遞參數(shù), 根據(jù)參數(shù), 返回不同的圖片頁(yè)面.
/*** 臉部適配器* <p/>* Created by wangchenlong on 15/12/15.*/ public class FacesViewPagerAdapter extends FragmentPagerAdapter {private static final int NUM = 9;public FacesViewPagerAdapter(FragmentManager fm) {super(fm);}@Override public Fragment getItem(int position) {return ShowFaceFragment.newInstance(position);}@Override public int getCount() {return NUM;} }每頁(yè)是個(gè)Fragment, 根據(jù)參數(shù), 使用不同資源.
/*** 顯示人臉的界面* <p/>* Created by wangchenlong on 15/12/15.*/ public class ShowFaceFragment extends Fragment {private static final String ARG_SELECTION_NUM = "arg_selection_num";@Bind(R.id.main_fdv_face_detector) FacesDisplayView mFdvFaceDetector;@RawRes ArrayList<Integer> mPhotos; // 圖片集合public ShowFaceFragment() {mPhotos = new ArrayList<>();mPhotos.add(R.raw.total_large_poster);mPhotos.add(R.raw.jessicajung_large_poster);mPhotos.add(R.raw.seohyun_large_poster);mPhotos.add(R.raw.sooyoung_large_poster);mPhotos.add(R.raw.sunny_large_poster);mPhotos.add(R.raw.taeyeon_large_poster);mPhotos.add(R.raw.tiffany_large_poster);mPhotos.add(R.raw.yoona_large_poster);mPhotos.add(R.raw.yuri_large_poster);}public static ShowFaceFragment newInstance(int selectionNum) {ShowFaceFragment simpleFragment = new ShowFaceFragment();Bundle args = new Bundle();args.putInt(ARG_SELECTION_NUM, selectionNum);simpleFragment.setArguments(args);return simpleFragment;}@Nullable @Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_show_face, container, false);ButterKnife.bind(this, view);return view;}@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);@RawRes int image = mPhotos.get(getArguments().getInt(ARG_SELECTION_NUM));InputStream stream = getResources().openRawResource(image);Bitmap bitmap = BitmapFactory.decodeStream(stream);mFdvFaceDetector.setBitmap(bitmap);}@Override public void onDestroyView() {super.onDestroyView();ButterKnife.unbind(this);} }注意使用注釋(Annotation), 判斷資源類(lèi)型, 如@RawRes.
Github下載地址
有時(shí)間再完善一下這個(gè)小控件吧.
OK, Enjoy It.
總結(jié)
以上是生活随笔為你收集整理的人脸及脸部关键点检测控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Cloudera Manager内部结构
- 下一篇: python语言format用法_详解P