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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

發(fā)布時(shí)間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://blog.csdn.net/candycat1992/article/details/21617741

實(shí)現(xiàn)

以O(shè)penCV的JavaCameraView為例,首先需要定制自己的Camera,主要代碼如下: [java]?view plaincopy print?
  1. import?java.util.ArrayList;??
  2. import?java.util.List;??
  3. ??
  4. import?org.opencv.android.JavaCameraView;??
  5. ??
  6. import?android.R.integer;??
  7. import?android.content.Context;??
  8. import?android.graphics.Rect;??
  9. import?android.graphics.RectF;??
  10. import?android.hardware.Camera;??
  11. import?android.hardware.Camera.AutoFocusCallback;??
  12. import?android.util.AttributeSet;??
  13. import?android.view.MotionEvent;??
  14. import?android.widget.Toast;??
  15. ??
  16. public?class?MTCameraView?extends?JavaCameraView?implements?AutoFocusCallback?{??
  17. ??
  18. ????public?MTCameraView(Context?context,?int?attrs)?{??
  19. ????????super(context,?attrs);??
  20. ????????//?TODO?Auto-generated?constructor?stub??
  21. ????}??
  22. ??
  23. ????public?List<Camera.Size>?getResolutionList()?{????????
  24. ????????return??mCamera.getParameters().getSupportedPreviewSizes();????????
  25. ????}??
  26. ??????
  27. ????public?Camera.Size?getResolution()?{??
  28. ????????Camera.Parameters?params?=?mCamera.getParameters();???
  29. ????????Camera.Size?s?=?params.getPreviewSize();??
  30. ????????return?s;??
  31. ????}??
  32. ??????
  33. ????public?void?setResolution(Camera.Size?resolution)?{??
  34. ????????disconnectCamera();??
  35. ????????connectCamera((int)resolution.width,?(int)resolution.height);?????????
  36. ????}??
  37. ??????
  38. ????public?void?focusOnTouch(MotionEvent?event)?{??
  39. ????????Rect?focusRect?=?calculateTapArea(event.getRawX(),?event.getRawY(),?1f);??
  40. ????????Rect?meteringRect?=?calculateTapArea(event.getRawX(),?event.getRawY(),?1.5f);??
  41. ??
  42. ????????Camera.Parameters?parameters?=?mCamera.getParameters();??
  43. ????????parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);??
  44. ??????????
  45. ????????if?(parameters.getMaxNumFocusAreas()?>?0)?{??
  46. ????????????List<Camera.Area>?focusAreas?=?new?ArrayList<Camera.Area>();??
  47. ????????????focusAreas.add(new?Camera.Area(focusRect,?1000));??
  48. ??????????
  49. ????????????parameters.setFocusAreas(focusAreas);??
  50. ????????}??
  51. ??
  52. ????????if?(parameters.getMaxNumMeteringAreas()?>?0)?{??
  53. ????????????List<Camera.Area>?meteringAreas?=?new?ArrayList<Camera.Area>();??
  54. ????????????meteringAreas.add(new?Camera.Area(meteringRect,?1000));??
  55. ??????????????
  56. ????????????parameters.setMeteringAreas(meteringAreas);??
  57. ????????}??
  58. ??
  59. ????????mCamera.setParameters(parameters);??
  60. ????????mCamera.autoFocus(this);??
  61. ????}??
  62. ??????
  63. ????/**?
  64. ?????*?Convert?touch?position?x:y?to?{@link?Camera.Area}?position?-1000:-1000?to?1000:1000.?
  65. ?????*/??
  66. ????private?Rect?calculateTapArea(float?x,?float?y,?float?coefficient)?{??
  67. ????????float?focusAreaSize?=?300;??
  68. ????????int?areaSize?=?Float.valueOf(focusAreaSize?*?coefficient).intValue();??
  69. ??
  70. ????????int?centerX?=?(int)?(x?/?getResolution().width?*?2000?-?1000);??
  71. ????????int?centerY?=?(int)?(y?/?getResolution().height?*?2000?-?1000);??
  72. ??
  73. ????????int?left?=?clamp(centerX?-?areaSize?/?2,?-1000,?1000);??
  74. ????????int?right?=?clamp(left?+?areaSize,?-1000,?1000);??
  75. ????????int?top?=?clamp(centerY?-?areaSize?/?2,?-1000,?1000);??
  76. ????????int?bottom?=?clamp(top?+?areaSize,?-1000,?1000);??
  77. ??
  78. ????????return?new?Rect(left,?top,?right,?bottom);??
  79. ????????}??
  80. ??
  81. ????private?int?clamp(int?x,?int?min,?int?max)?{??
  82. ????????if?(x?>?max)?{??
  83. ????????????return?max;??
  84. ????????}??
  85. ????????if?(x?<?min)?{??
  86. ????????????return?min;??
  87. ????????}??
  88. ????????return?x;??
  89. ????}??
  90. ??????
  91. ????public?void?setFocusMode?(Context?item,?int?type){??
  92. ????????Camera.Parameters?params?=?mCamera.getParameters();???
  93. ????????List<String>?FocusModes?=?params.getSupportedFocusModes();??
  94. ??
  95. ????????switch?(type){??
  96. ????????case?0:??
  97. ????????????if?(FocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))??
  98. ????????????????params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);??
  99. ????????????else???
  100. ????????????????Toast.makeText(item,?"Auto?Mode?not?supported",?Toast.LENGTH_SHORT).show();??
  101. ????????????break;??
  102. ????????case?1:???????????
  103. ????????????if?(FocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO))??
  104. ????????????????params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);??
  105. ????????????else??
  106. ????????????????Toast.makeText(item,?"Continuous?Mode?not?supported",?Toast.LENGTH_SHORT).show();??
  107. ????????????break;??
  108. ????????case?2:???????????
  109. ????????????if?(FocusModes.contains(Camera.Parameters.FOCUS_MODE_EDOF))??
  110. ????????????????params.setFocusMode(Camera.Parameters.FOCUS_MODE_EDOF);??
  111. ????????????else??
  112. ????????????????Toast.makeText(item,?"EDOF?Mode?not?supported",?Toast.LENGTH_SHORT).show();??
  113. ????????????break;??
  114. ????????case?3:??
  115. ????????????if?(FocusModes.contains(Camera.Parameters.FOCUS_MODE_FIXED))??
  116. ????????????????params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED);??
  117. ????????????else??
  118. ????????????????Toast.makeText(item,?"Fixed?Mode?not?supported",?Toast.LENGTH_SHORT).show();??
  119. ????????????break;??
  120. ????????case?4:??
  121. ????????????if?(FocusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY))??
  122. ????????????????params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);??
  123. ????????????else??
  124. ????????????????Toast.makeText(item,?"Infinity?Mode?not?supported",?Toast.LENGTH_SHORT).show();??
  125. ????????????break;??
  126. ????????case?5:??
  127. ????????????if?(FocusModes.contains(Camera.Parameters.FOCUS_MODE_MACRO))??
  128. ????????????????params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);??
  129. ????????????else??
  130. ????????????????Toast.makeText(item,?"Macro?Mode?not?supported",?Toast.LENGTH_SHORT).show();??
  131. ????????????break;????????
  132. ????????}??
  133. ??
  134. ????????mCamera.setParameters(params);??
  135. ????}??
  136. ??????
  137. ????public?void?setFlashMode?(Context?item,?int?type){??
  138. ????????Camera.Parameters?params?=?mCamera.getParameters();??
  139. ????????List<String>?FlashModes?=?params.getSupportedFlashModes();??
  140. ??
  141. ????????switch?(type){??
  142. ????????case?0:??
  143. ????????????if?(FlashModes.contains(Camera.Parameters.FLASH_MODE_AUTO))??
  144. ????????????????params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);??
  145. ????????????else??
  146. ????????????????Toast.makeText(item,?"Auto?Mode?not?supported",?Toast.LENGTH_SHORT).show();??
  147. ????????????break;??
  148. ????????case?1:??
  149. ????????????if?(FlashModes.contains(Camera.Parameters.FLASH_MODE_OFF))??
  150. ????????????????params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);??
  151. ????????????else??
  152. ????????????????Toast.makeText(item,?"Off?Mode?not?supported",?Toast.LENGTH_SHORT).show();????????????
  153. ????????????break;??
  154. ????????case?2:??
  155. ????????????if?(FlashModes.contains(Camera.Parameters.FLASH_MODE_ON))??
  156. ????????????????params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);??
  157. ????????????else??
  158. ????????????????Toast.makeText(item,?"On?Mode?not?supported",?Toast.LENGTH_SHORT).show();?????????
  159. ????????????break;??
  160. ????????case?3:??
  161. ????????????if?(FlashModes.contains(Camera.Parameters.FLASH_MODE_RED_EYE))??
  162. ????????????????params.setFlashMode(Camera.Parameters.FLASH_MODE_RED_EYE);??
  163. ????????????else??
  164. ????????????????Toast.makeText(item,?"Red?Eye?Mode?not?supported",?Toast.LENGTH_SHORT).show();????????????
  165. ????????????break;??
  166. ????????case?4:??
  167. ????????????if?(FlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH))??
  168. ????????????????params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);??
  169. ????????????else??
  170. ????????????????Toast.makeText(item,?"Torch?Mode?not?supported",?Toast.LENGTH_SHORT).show();??????????
  171. ????????????break;??
  172. ????????}??
  173. ??
  174. ????????mCamera.setParameters(params);??
  175. ????}??
  176. ??
  177. ????@Override??
  178. ????public?void?onAutoFocus(boolean?arg0,?Camera?arg1)?{??
  179. ???????????
  180. ????}??
  181. }??

在MainActivity中需要初始化MTCamera,并且實(shí)現(xiàn)OnTouchListener接口,以便在觸摸屏幕時(shí)可以調(diào)用onTouch函數(shù)。其中主要代碼如下: [java]?view plaincopy print?
  1. private?MTCameraView?mOpenCvCameraView;??
  2. ??
  3. public?void?init()?{??
  4. ????mOpenCvCameraView?=?new?MTCameraView(this,?-1);??
  5. ????mOpenCvCameraView.setCvCameraViewListener(this);??
  6. ????mOpenCvCameraView.setFocusable(true);??
  7. ????mOpenCvCameraView.setOnTouchListener(MainActivity.this);??
  8. ????mOpenCvCameraView.enableView();??
  9. ??????
  10. ????FrameLayout?frame?=?new?FrameLayout(this);??
  11. ????frame.addView(mOpenCvCameraView);??
  12. ??????
  13. ????setContentView(frame);??
  14. ?????}??
  15. ??
  16. @Override??
  17. public?boolean?onTouch(View?arg0,?MotionEvent?arg1)?{??
  18. ????//?TODO?Auto-generated?method?stub??
  19. ????mOpenCvCameraView.focusOnTouch(arg1);??
  20. ????return?true;??
  21. }??

init()函數(shù)是自定義的初始化函數(shù),可以在onCreate時(shí)使用。由于這里需要使用OpenCV庫(kù),所以本項(xiàng)目是在加載完OpenCV庫(kù)并判斷成功后才調(diào)用init()函數(shù)的。

解釋

在發(fā)生觸摸事件時(shí),MainActivity由于實(shí)現(xiàn)了OnTouchListener接口,因此會(huì)調(diào)用重寫的onTouch函數(shù),并把它的第二個(gè)參數(shù)MotionEvent傳遞給MTCamera,以便定位觸摸位置。 MTCamera的focusOnTouch函數(shù)繼續(xù)工作。它首先根據(jù)觸摸位置計(jì)算對(duì)焦和測(cè)光(metering)區(qū)域的大小(通過calculateTapArea函數(shù)),然后創(chuàng)建新的Camera.Parameters,并設(shè)置攝像機(jī)的對(duì)焦模式為Auto。 然后,它分別判斷該設(shè)備的相機(jī)是否支持設(shè)置對(duì)焦區(qū)域和測(cè)光區(qū)域,如果支持就分別為parameters設(shè)置之前計(jì)算好的聚焦和測(cè)光區(qū)域。 最后,讓Camera自動(dòng)對(duì)焦。
  • calculateTapArea函數(shù)

    這個(gè)函數(shù)主要實(shí)現(xiàn)從屏幕坐標(biāo)系到對(duì)焦坐標(biāo)系的轉(zhuǎn)換。由MotionEvent.getRowX()得到的是以屏幕坐標(biāo)系(即屏幕左上角為原點(diǎn),右下角為你的當(dāng)前屏幕分辨率,單位是一個(gè)像素)為準(zhǔn)的坐標(biāo),而setFocusAreas接受的List<Area>中的每一個(gè)Area的范圍是(-1000,-1000)到(1000, 1000),也就是說屏幕中心為原點(diǎn),左上角為(-1000,-1000),右下角為(1000,1000)。注意,如果超出這個(gè)范圍的話,會(huì)報(bào)setParemeters failed的錯(cuò)誤哦!除此之外,我們還提前定義了一個(gè)對(duì)焦框(測(cè)光框)的大小,并且接受一個(gè)參數(shù)(第三個(gè)參數(shù)coefficient)作為百分比進(jìn)行調(diào)節(jié)。


至此完成了觸摸對(duì)焦的功能。 但是,可以發(fā)現(xiàn)MTCamera里還有很大部分代碼,主要是兩個(gè)函數(shù)setFocusMode和setFlashMode。這兩個(gè)函數(shù),主要是因?yàn)樵陧?xiàng)目中我的圖像經(jīng)常是模糊的,但不知道系統(tǒng)支持那么對(duì)焦模式。這時(shí),就可以使用這兩個(gè)函數(shù)進(jìn)行測(cè)試。這還需要在MainActivity中添加菜單欄的代碼,以便進(jìn)行選擇。代碼如下: [java]?view plaincopy print?
  1. private?List<Camera.Size>?mResolutionList;??
  2. ??
  3. private?MenuItem[]?mResolutionMenuItems;??
  4. private?MenuItem[]?mFocusListItems;??
  5. private?MenuItem[]?mFlashListItems;??
  6. ??
  7. private?SubMenu?mResolutionMenu;??
  8. private?SubMenu?mFocusMenu;??
  9. private?SubMenu?mFlashMenu;??
  10. ??
  11. @Override??
  12. public?boolean?onCreateOptionsMenu(Menu?menu)?{??
  13. ????Log.i(TAG,?"called?onCreateOptionsMenu");??
  14. ??????
  15. ????List<String>?mFocusList?=?new?LinkedList<String>();??
  16. ?int?idx?=0;??
  17. ??
  18. ?mFocusMenu?=?menu.addSubMenu("Focus");??
  19. ??
  20. ?mFocusList.add("Auto");??
  21. ?mFocusList.add("Continuous?Video");??
  22. ?mFocusList.add("EDOF");??
  23. ?mFocusList.add("Fixed");??
  24. ?mFocusList.add("Infinity");??
  25. ?mFocusList.add("Makro");??
  26. ?mFocusList.add("Continuous?Picture");??
  27. ??
  28. ?mFocusListItems?=?new?MenuItem[mFocusList.size()];??
  29. ??
  30. ?ListIterator<String>?FocusItr?=?mFocusList.listIterator();??
  31. ?while(FocusItr.hasNext()){??
  32. ?????//?add?the?element?to?the?mDetectorMenu?submenu??
  33. ?????String?element?=?FocusItr.next();??
  34. ?????mFocusListItems[idx]?=?mFocusMenu.add(2,idx,Menu.NONE,element);??
  35. ?????idx++;??
  36. ?}??
  37. ??
  38. ?List<String>?mFlashList?=?new?LinkedList<String>();??
  39. ?idx?=?0;??
  40. ??
  41. ?mFlashMenu?=?menu.addSubMenu("Flash");??
  42. ??
  43. ?mFlashList.add("Auto");??
  44. ?mFlashList.add("Off");??
  45. ?mFlashList.add("On");??
  46. ?mFlashList.add("Red-Eye");??
  47. ?mFlashList.add("Torch");??
  48. ??
  49. ?mFlashListItems?=?new?MenuItem[mFlashList.size()];??
  50. ??
  51. ?ListIterator<String>?FlashItr?=?mFlashList.listIterator();??
  52. ?while(FlashItr.hasNext()){??
  53. ?????//?add?the?element?to?the?mDetectorMenu?submenu??
  54. ?????String?element?=?FlashItr.next();??
  55. ?????mFlashListItems[idx]?=?mFlashMenu.add(3,idx,Menu.NONE,element);??
  56. ?????idx++;??
  57. ?}??
  58. ??
  59. ?mResolutionMenu?=?menu.addSubMenu("Resolution");??
  60. ?mResolutionList?=?mOpenCvCameraView.getResolutionList();??
  61. ?mResolutionMenuItems?=?new?MenuItem[mResolutionList.size()];??
  62. ??
  63. ?ListIterator<Camera.Size>?resolutionItr?=?mResolutionList.listIterator();??
  64. ?idx?=?0;??
  65. ?while(resolutionItr.hasNext())?{??
  66. ?????Camera.Size?element?=?resolutionItr.next();??
  67. ?????mResolutionMenuItems[idx]?=?mResolutionMenu.add(1,?idx,?Menu.NONE,??
  68. ?????????????Integer.valueOf((int)?element.width).toString()?+?"x"?+?Integer.valueOf((int)?element.height).toString());??
  69. ?????idx++;??
  70. ??}??
  71. ??
  72. ?return?true;??
  73. }??
  74. ??
  75. public?boolean?onOptionsItemSelected(MenuItem?item)?{??
  76. ????Log.i(TAG,?"called?onOptionsItemSelected;?selected?item:?"?+?item);??
  77. ??
  78. ????if?(item.getGroupId()?==?1)??
  79. ?{??
  80. ?????int?id?=?item.getItemId();??
  81. ?????Camera.Size?resolution?=?mResolutionList.get(id);??
  82. ?????mOpenCvCameraView.setResolution(resolution);??
  83. ?????resolution?=?mOpenCvCameraView.getResolution();??
  84. ?????String?caption?=?Integer.valueOf((int)?resolution.width).toString()?+?"x"?+?Integer.valueOf((int)?resolution.height).toString();??
  85. ?????Toast.makeText(this,?caption,?Toast.LENGTH_SHORT).show();??
  86. ?}???
  87. ?else?if?(item.getGroupId()==2){??
  88. ??
  89. ????int?focusType?=?item.getItemId();??
  90. ??
  91. ????mOpenCvCameraView.setFocusMode(this,?focusType);??
  92. ?}??
  93. ?else?if?(item.getGroupId()==3){??
  94. ??
  95. ????int?flashType?=?item.getItemId();??
  96. ??
  97. ????mOpenCvCameraView.setFlashMode(this,?flashType);??
  98. ?}??
  99. ??
  100. ????return?true;??
  101. }??

這樣運(yùn)行后,點(diǎn)擊菜單就可以看見有三個(gè)菜籃列表:Focus(對(duì)焦模式),Flash(視頻模式),Resolution(支持的分辨率)。對(duì)焦模式和視頻模式中提供了幾種常見的模式供選擇,代碼會(huì)判斷當(dāng)前設(shè)備是否支持該模式。而分辨率菜單欄會(huì)顯示出當(dāng)前設(shè)備支持的所有分辨率種類。

參考

  • StackOverFlow上關(guān)于觸摸對(duì)焦的討論
  • Android多媒體和相機(jī)講解十
  • 解讀Android 4.0 Camera原生應(yīng)用程序的設(shè)計(jì)思路
  • OpenCV上的提問:ANDROID: Use autofocus with CameraBridgeViewBase?

轉(zhuǎn)載于:https://www.cnblogs.com/jukan/p/6857881.html

總結(jié)

以上是生活随笔為你收集整理的[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。