Android靜態圖片人臉識別的完整demo(附完整源碼)

?

Demo功能:利用android自帶的人臉識別進行識別,標記出眼睛和人臉位置。點擊按鍵后進行人臉識別,完畢后顯示到imageview上。

第一部分:布局文件activity_main.xml

?

[html] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. <RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  2. ????xmlns:tools="http://schemas.android.com/tools"??
  3. ????android:id="@+id/layout_main"??
  4. ????android:layout_width="match_parent"??
  5. ????android:layout_height="match_parent"??
  6. ????android:paddingBottom="@dimen/activity_vertical_margin"??
  7. ????android:paddingLeft="@dimen/activity_horizontal_margin"??
  8. ????android:paddingRight="@dimen/activity_horizontal_margin"??
  9. ????android:paddingTop="@dimen/activity_vertical_margin"??
  10. ????tools:context=".MainActivity"?>??
  11. ??
  12. ????<TextView??
  13. ????????android:id="@+id/textview_hello"??
  14. ????????android:layout_width="wrap_content"??
  15. ????????android:layout_height="wrap_content"??
  16. ????????android:text="@string/hello_world"?/>??
  17. ??
  18. ????<ImageView??
  19. ????????android:id="@+id/imgview"??
  20. ????????android:layout_width="wrap_content"??
  21. ????????android:layout_height="wrap_content"??
  22. ????????android:layout_below="@id/textview_hello"?/>??
  23. ??
  24. ????<Button??
  25. ????????android:id="@+id/btn_detect_face"??
  26. ????????android:layout_width="wrap_content"??
  27. ????????android:layout_height="wrap_content"??
  28. ????????android:layout_below="@id/imgview"??
  29. ????????android:layout_centerHorizontal="true"??
  30. ????????android:text="檢測人臉"?/>??
  31. ??
  32. </RelativeLayout>??


注意:ImageView四周的padding由布局文件里的這四句話決定:

?

[html] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. android:paddingBottom="@dimen/activity_vertical_margin"??
  2. android:paddingLeft="@dimen/activity_horizontal_margin"??
  3. android:paddingRight="@dimen/activity_horizontal_margin"??
  4. android:paddingTop="@dimen/activity_vertical_margin"??


而上面的兩個margin定義在dimens.xml文件里:

?

[html] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. <resources>??
  2. ??
  3. ????<!--?Default?screen?margins,?per?the?Android?Design?guidelines.?-->??
  4. ????<dimen?name="activity_horizontal_margin">16dp</dimen>??
  5. ????<dimen?name="activity_vertical_margin">16dp</dimen>??
  6. ??
  7. </resources>??


這里采用的都是默認的,可以忽略!

第二部分:MainActivity.java

?

[java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. package?org.yanzi.testfacedetect;??
  2. ??
  3. import?org.yanzi.util.ImageUtil;??
  4. import?org.yanzi.util.MyToast;??
  5. ??
  6. import?android.app.Activity;??
  7. import?android.graphics.Bitmap;??
  8. import?android.graphics.Bitmap.Config;??
  9. import?android.graphics.BitmapFactory;??
  10. import?android.graphics.Canvas;??
  11. import?android.graphics.Color;??
  12. import?android.graphics.Paint;??
  13. import?android.graphics.Point;??
  14. import?android.graphics.PointF;??
  15. import?android.graphics.Rect;??
  16. import?android.media.FaceDetector;??
  17. import?android.media.FaceDetector.Face;??
  18. import?android.os.Bundle;??
  19. import?android.os.Handler;??
  20. import?android.os.Message;??
  21. import?android.util.DisplayMetrics;??
  22. import?android.util.Log;??
  23. import?android.view.Menu;??
  24. import?android.view.View;??
  25. import?android.view.View.OnClickListener;??
  26. import?android.view.ViewGroup;??
  27. import?android.view.ViewGroup.LayoutParams;??
  28. import?android.widget.Button;??
  29. import?android.widget.ImageView;??
  30. import?android.widget.ProgressBar;??
  31. import?android.widget.RelativeLayout;??
  32. ??
  33. public?class?MainActivity?extends?Activity?{??
  34. ????static?final?String?tag?=?"yan";??
  35. ????ImageView?imgView?=?null;??
  36. ????FaceDetector?faceDetector?=?null;??
  37. ????FaceDetector.Face[]?face;??
  38. ????Button?detectFaceBtn?=?null;??
  39. ????final?int?N_MAX?=?2;??
  40. ????ProgressBar?progressBar?=?null;??
  41. ??
  42. ????Bitmap?srcImg?=?null;??
  43. ????Bitmap?srcFace?=?null;??
  44. ????Thread?checkFaceThread?=?new?Thread(){??
  45. ??
  46. ????????@Override??
  47. ????????public?void?run()?{??
  48. ????????????//?TODO?Auto-generated?method?stub??
  49. ????????????Bitmap?faceBitmap?=?detectFace();??
  50. ????????????mainHandler.sendEmptyMessage(2);??
  51. ????????????Message?m?=?new?Message();??
  52. ????????????m.what?=?0;??
  53. ????????????m.obj?=?faceBitmap;??
  54. ????????????mainHandler.sendMessage(m);??
  55. ??????????????
  56. ????????}??
  57. ??
  58. ????};??
  59. ?????Handler?mainHandler?=?new?Handler(){??
  60. ??
  61. ????????@Override??
  62. ????????public?void?handleMessage(Message?msg)?{??
  63. ????????????//?TODO?Auto-generated?method?stub??
  64. ????????????//super.handleMessage(msg);??
  65. ????????????switch?(msg.what){??
  66. ????????????case?0:??
  67. ????????????????Bitmap?b?=?(Bitmap)?msg.obj;??
  68. ????????????????imgView.setImageBitmap(b);??
  69. ????????????????MyToast.showToast(getApplicationContext(),?"檢測完畢");??
  70. ????????????????break;??
  71. ????????????case?1:??
  72. ????????????????showProcessBar();??
  73. ????????????????break;??
  74. ????????????case?2:??
  75. ????????????????progressBar.setVisibility(View.GONE);??
  76. ????????????????detectFaceBtn.setClickable(false);??
  77. ????????????????break;??
  78. ????????????default:??
  79. ????????????????break;??
  80. ????????????}??
  81. ????????}??
  82. ??
  83. ????};??
  84. ????@Override??
  85. ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  86. ????????super.onCreate(savedInstanceState);??
  87. ????????setContentView(R.layout.activity_main);??
  88. ????????initUI();???
  89. ????????initFaceDetect();??
  90. ????????detectFaceBtn.setOnClickListener(new?OnClickListener()?{??
  91. ??
  92. ????????????@Override??
  93. ????????????public?void?onClick(View?v)?{??
  94. ????????????????//?TODO?Auto-generated?method?stub??
  95. ????????????????mainHandler.sendEmptyMessage(1);??
  96. ????????????????checkFaceThread.start();??
  97. ??????????????????
  98. ????????????}??
  99. ????????});??
  100. ??
  101. ??
  102. ??
  103. ????}??
  104. ??
  105. ????@Override??
  106. ????public?boolean?onCreateOptionsMenu(Menu?menu)?{??
  107. ????????//?Inflate?the?menu;?this?adds?items?to?the?action?bar?if?it?is?present.??
  108. ????????getMenuInflater().inflate(R.menu.main,?menu);??
  109. ????????return?true;??
  110. ????}??
  111. ????public?void?initUI(){??
  112. ??
  113. ????????detectFaceBtn?=?(Button)findViewById(R.id.btn_detect_face);??
  114. ????????imgView?=?(ImageView)findViewById(R.id.imgview);??
  115. ????????LayoutParams?params?=?imgView.getLayoutParams();??
  116. ????????DisplayMetrics?dm?=?getResources().getDisplayMetrics();??
  117. ????????int?w_screen?=?dm.widthPixels;??
  118. ????????//??????int?h?=?dm.heightPixels;??
  119. ??
  120. ????????srcImg?=?BitmapFactory.decodeResource(getResources(),?R.drawable.kunlong);??
  121. ????????int?h?=?srcImg.getHeight();??
  122. ????????int?w?=?srcImg.getWidth();??
  123. ????????float?r?=?(float)h/(float)w;??
  124. ????????params.width?=?w_screen;??
  125. ????????params.height?=?(int)(params.width?*?r);??
  126. ????????imgView.setLayoutParams(params);??
  127. ????????imgView.setImageBitmap(srcImg);??
  128. ????}??
  129. ??
  130. ????public?void?initFaceDetect(){??
  131. ????????this.srcFace?=?srcImg.copy(Config.RGB_565,?true);??
  132. ????????int?w?=?srcFace.getWidth();??
  133. ????????int?h?=?srcFace.getHeight();??
  134. ????????Log.i(tag,?"待檢測圖像:?w?=?"?+?w?+?"h?=?"?+?h);??
  135. ????????faceDetector?=?new?FaceDetector(w,?h,?N_MAX);??
  136. ????????face?=?new?FaceDetector.Face[N_MAX];??
  137. ????}??
  138. ????public?boolean?checkFace(Rect?rect){??
  139. ????????int?w?=?rect.width();??
  140. ????????int?h?=?rect.height();??
  141. ????????int?s?=?w*h;??
  142. ????????Log.i(tag,?"人臉?寬w?=?"?+?w?+?"高h?=?"?+?h?+?"人臉面積?s?=?"?+?s);??
  143. ????????if(s?<?10000){??
  144. ????????????Log.i(tag,?"無效人臉,舍棄.");??
  145. ????????????return?false;??
  146. ????????}??
  147. ????????else{??
  148. ????????????Log.i(tag,?"有效人臉,保存.");??
  149. ????????????return?true;??????
  150. ????????}??
  151. ????}??
  152. ????public?Bitmap?detectFace(){??
  153. ????????//??????Drawable?d?=?getResources().getDrawable(R.drawable.face_2);??
  154. ????????//??????Log.i(tag,?"Drawable尺寸?w?=?"?+?d.getIntrinsicWidth()?+?"h?=?"?+?d.getIntrinsicHeight());??
  155. ????????//??????BitmapDrawable?bd?=?(BitmapDrawable)d;??
  156. ????????//??????Bitmap?srcFace?=?bd.getBitmap();??
  157. ??
  158. ????????int?nFace?=?faceDetector.findFaces(srcFace,?face);??
  159. ????????Log.i(tag,?"檢測到人臉:n?=?"?+?nFace);??
  160. ????????for(int?i=0;?i<nFace;?i++){??
  161. ????????????Face?f??=?face[i];??
  162. ????????????PointF?midPoint?=?new?PointF();??
  163. ????????????float?dis?=?f.eyesDistance();??
  164. ????????????f.getMidPoint(midPoint);??
  165. ????????????int?dd?=?(int)(dis);??
  166. ????????????Point?eyeLeft?=?new?Point((int)(midPoint.x?-?dis/2),?(int)midPoint.y);??
  167. ????????????Point?eyeRight?=?new?Point((int)(midPoint.x?+?dis/2),?(int)midPoint.y);??
  168. ????????????Rect?faceRect?=?new?Rect((int)(midPoint.x?-?dd),?(int)(midPoint.y?-?dd),?(int)(midPoint.x?+?dd),?(int)(midPoint.y?+?dd));??
  169. ????????????Log.i(tag,?"左眼坐標?x?=?"?+?eyeLeft.x?+?"y?=?"?+?eyeLeft.y);??
  170. ????????????if(checkFace(faceRect)){??
  171. ????????????????Canvas?canvas?=?new?Canvas(srcFace);??
  172. ????????????????Paint?p?=?new?Paint();??
  173. ????????????????p.setAntiAlias(true);??
  174. ????????????????p.setStrokeWidth(8);??
  175. ????????????????p.setStyle(Paint.Style.STROKE);??
  176. ????????????????p.setColor(Color.GREEN);??
  177. ????????????????canvas.drawCircle(eyeLeft.x,?eyeLeft.y,?20,?p);??
  178. ????????????????canvas.drawCircle(eyeRight.x,?eyeRight.y,?20,?p);??
  179. ????????????????canvas.drawRect(faceRect,?p);??
  180. ????????????}??
  181. ??
  182. ????????}??
  183. ????????ImageUtil.saveJpeg(srcFace);??
  184. ????????Log.i(tag,?"保存完畢");??
  185. ??????????
  186. ????????//將繪制完成后的faceBitmap返回??
  187. ????????return?srcFace;??
  188. ??
  189. ????}??
  190. ????public?void?showProcessBar(){??
  191. ????????RelativeLayout?mainLayout?=?(RelativeLayout)findViewById(R.id.layout_main);??
  192. ????????progressBar?=?new?ProgressBar(MainActivity.this,?null,?android.R.attr.progressBarStyleLargeInverse);?//ViewGroup.LayoutParams.WRAP_CONTENT??
  193. ????????RelativeLayout.LayoutParams?params?=?new?RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,?ViewGroup.LayoutParams.WRAP_CONTENT);??
  194. ????????params.addRule(RelativeLayout.ALIGN_PARENT_TOP,?RelativeLayout.TRUE);??
  195. ????????params.addRule(RelativeLayout.CENTER_HORIZONTAL,?RelativeLayout.TRUE);??
  196. ????????progressBar.setVisibility(View.VISIBLE);??
  197. ????????//progressBar.setLayoutParams(params);??
  198. ????????mainLayout.addView(progressBar,?params);??
  199. ??????????
  200. ????}??
  201. ??
  202. ??
  203. }??


關于上述代碼,注意以下幾點:

1、 在initUI()函數里初始化UI布局,主要是將ImageView的長寬比設置。根據srcImg的長寬比及屏幕的寬度,設置ImageView的寬 度為屏幕寬度,然后根據比率得到ImageView的高。然后將Bitmap設置到ImageView里。一旦設置了ImageView的長和 寬,Bitmap會自動縮放填充進去,所以對Bitmap就無需再縮放了。

2、 initFaceDetect()函數里初始化人臉識別所需要的變量。首先將Bitmap的ARGB格式轉換為RGB_565格式,這是android自 帶人臉識別要求的圖片格式,必須進行此轉化:this.srcFace = srcImg.copy(Config.RGB_565, true);

然后實例化這兩個變量:

FaceDetector faceDetector = null;
FaceDetector.Face[] face;

faceDetector = new FaceDetector(w, h, N_MAX);
face = new FaceDetector.Face[N_MAX];

FaceDetector就是用來進行人臉識別的類,face是用來存放識別得到的人臉信息。N_MAX是允許的人臉個數最大值。

3、真正的人臉識別在自定義的方法detectFace()里,核心代碼:faceDetector.findFaces(srcFace, face)。在識別后,通過Face f ?= face[i];得到每個人臉f,通過 float dis = f.eyesDistance();得到兩個人眼之間的距離,f.getMidPoint(midPoint);得到人臉中心的坐標。下面這兩句話得到左右人眼的坐標:

?

[java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. Point?eyeLeft?=?new?Point((int)(midPoint.x?-?dis/2),?(int)midPoint.y);??
  2. Point?eyeRight?=?new?Point((int)(midPoint.x?+?dis/2),?(int)midPoint.y);??


下面是得到人臉的矩形:

?

[java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. Rect?faceRect?=?new?Rect((int)(midPoint.x?-?dd),?(int)(midPoint.y?-?dd),?(int)(midPoint.x?+?dd),?(int)(midPoint.y?+?dd));??


注意這里Rect的四個參數其實就是矩形框左上頂點的x 、y坐標和右下頂點的x、y坐標。

4、實際應用中發現,人臉識別會發生誤判。所以增加函數checkFace(Rect rect)來判斷,當人臉Rect的面積像素點太小時則視為無效人臉。這里閾值設為10000,實際上這個值可以通過整個圖片的大小進行粗略估計到。

5、為了讓用戶看到正在識別的提醒,這里動態添加一個ProgressBar。代碼如下:

?

[java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. public?void?showProcessBar(){??
  2. ????RelativeLayout?mainLayout?=?(RelativeLayout)findViewById(R.id.layout_main);??
  3. ????progressBar?=?new?ProgressBar(MainActivity.this,?null,?android.R.attr.progressBarStyleLargeInverse);?//ViewGroup.LayoutParams.WRAP_CONTENT??
  4. ????RelativeLayout.LayoutParams?params?=?new?RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,?ViewGroup.LayoutParams.WRAP_CONTENT);??
  5. ????params.addRule(RelativeLayout.ALIGN_PARENT_TOP,?RelativeLayout.TRUE);??
  6. ????params.addRule(RelativeLayout.CENTER_HORIZONTAL,?RelativeLayout.TRUE);??
  7. ????progressBar.setVisibility(View.VISIBLE);??
  8. ????//progressBar.setLayoutParams(params);??
  9. ????mainLayout.addView(progressBar,?params);??
  10. ??
  11. }??


事實上這個ProgressBar視覺效果不是太好,用ProgressDialog會更好。這里只不過是提供動態添加ProgressBar的方法。

6、 程序中設置了checkFaceThread線程用來檢測人臉,mainHandler用來控制UI的更新。這里重點說下Thread的構造方法,這里是 模仿源碼中打開Camera的方法。如果一個線程只需執行一次,則通過這種方法是最好的,比較簡潔。反之,如果這個Thread在執行后需要再次執行或重 新構造,不建議用這種方法,建議使用自定義Thread,程序邏輯會更容易 控制。在線程執行完畢后,設置button無法再點擊,否則線程再次start便會掛掉。

?

[java] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片
  1. Thread?checkFaceThread?=?new?Thread(){??
  2. ??
  3. ????@Override??
  4. ????public?void?run()?{??
  5. ????????//?TODO?Auto-generated?method?stub??
  6. ????????Bitmap?faceBitmap?=?detectFace();??
  7. ????????mainHandler.sendEmptyMessage(2);??
  8. ????????Message?m?=?new?Message();??
  9. ????????m.what?=?0;??
  10. ????????m.obj?=?faceBitmap;??
  11. ????????mainHandler.sendMessage(m);??
  12. ??
  13. ????}??
  14. ??
  15. };??

7、看下識別效果:

原圖:


識別后:

最后特別交代下,當人眼距離少于100個像素時會識別不出來。如果靜態圖片尺寸較少,而手機的densityDpi又比較高的話,當圖片放在drawable-hdpi文件夾下時會發生檢測不到人臉的情況,同樣的測試圖片放在drawable-mdpi就可以正常檢測。原因是不同的文件夾下,Bitmap加載進來后的尺寸大小不一樣。

后續會推出Camera里實時檢測并繪制人臉框,進一步研究眨眼檢測,眨眼控制拍照的demo,敬請期待。如果您覺得筆者在認真的寫博客,請為我投上一票。

CSDN2013博客之星評選:

http://vote.blog.csdn.net/blogstaritem/blogstar2013/yanzi1225627

本文demo下載鏈接:

http://download.csdn.net/detail/yanzi1225627/6783575

?

參考文獻:

鏈接1:

鏈接2:

轉載于:https://www.cnblogs.com/xgjblog/p/3853647.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376823.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376823.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖論:最短路徑搜索--Dijkstra算法(c代碼實現)

最近因為辭職&#xff0c;有不少閑功夫&#xff0c;重溫下數據結構&#xff0c;順便練練手。今天說說最短路徑搜索算法中的Dijkstra原理和實現。 一&#xff1a;簡介 這個算法用于解決圖中單源最短路徑問題。所謂單源節點是指給定源節點&#xff0c;求圖中其它節點到此源節點的…

C++多線程快速入門(五)簡單線程池設計

目錄設計思路主線程運行邏輯task以及taskpool設計詳細流程講解完整代碼打印結果往期回顧設計思路 線程池實際上就是一組線程&#xff0c;當我們需要異步執行一些任務時&#xff0c;經常要通過OS頻繁創建和銷毀線程&#xff0c;不如直接創建一組在程序生命周期內不會退出的線程…

C--函數

函數:具有特定功能的代碼段,分為庫函數,自定義函數. 函數定義: 函數返回值類型 函數名(形式參數列表) { 代碼段; return 返回值; } 注意:每個函數返回值最多只有一個.return是一個函數結束的標志. 形式參數(形參):函數定義時使用的虛擬參數名,用以接收函數調用是傳遞過來的實際…

公式系統 - TradeBlazer公式基礎 - Bar數據

Bar數據 在介紹Bar數據之前&#xff0c;首先&#xff0c;我們需要討論一下TradeBlazer公式的計算方法&#xff0c;針對上面介紹的各種公式類型&#xff0c;包含公式應用&#xff0c;在公式進行計算時&#xff0c;都是建立在基本數據源(Bar數據)之上&#xff0c;我們這里所謂的B…

C++網絡編程快速入門(一):TCP網絡通信基本流程以及基礎函數使用

目錄流程概述服務器端代碼實現客戶端代碼實現函數和結構講解sockaddr_in和sockaddrsocket &#xff1a; 創建一個socket連接bind &#xff1a;綁定地址以及端口號問題流程概述 客戶端與服務器之間的網絡通信基本原理如下所示&#xff0c;復雜一點的架構可能會添加消息中間件。…

php 字符串處理

addcslashes — 為字符串里面的部分字符添加反斜線轉義字符addslashes — 用指定的方式對字符串里面的字符進行轉義bin2hex — 將二進制數據轉換成十六進制表示chop — rtrim() 的別名函數chr — 返回一個字符的ASCII碼chunk_split — 按一定的字符長度將字符串分割成小塊conve…

使用前端框架Foundation 4來幫助簡化響應式設計開發

日期&#xff1a;2013-3-12 來源&#xff1a;GBin1.com Foundation是一套使用廣泛的前端開發套件&#xff0c;可以幫助你快速的網站。最近ZURB發布了一個新版本的Foundation 4前端框架&#xff0c;能夠有效的幫助你快速的開發響應式的網站。 和另外一個套知名的前端框架BootSt…

C++網絡編程快速入門(二):Linux下使用select演示簡單服務端程序

目錄select參數解釋select使用規范select使用缺點基本流程實例代碼通信效果演示往期文章select參數解釋 extern int select (int __nfds, fd_set *__restrict __readfds,fd_set *__restrict __writefds,fd_set *__restrict __exceptfds,struct timeval *__restrict __timeout)…

Android轉載一:Android文件命名規范

REF&#xff1a;http://blog.csdn.net/gulianchao/article/details/23391651 (一) Layout命名 1&#xff0e;contentview命名&#xff1a;activity_功能模塊.xml 例如&#xff1a;activity_main.xml、activity_more.xml 2&#xff0e;Dialog命名&#xff1a;dialog_描述.xml …

[轉]XBRL應用軟件分類

1) 分類標準編輯軟件(Taxonomy editor)&#xff1a; 分類標準是XBRL技術的應用基礎&#xff0c;每一個采用XBRL技術的國家都必須先按各國的GAAP制訂XBRL分類標準&#xff0c;上市公司才能據以編制實例文件。由于一套XBRL 2.0或2.1版分類標準必須包含至少一份XML Schema文…

C++網絡編程快速入門(三):阻塞與非阻塞式調用網絡通信函數

目錄阻塞與非阻塞定義send與recvconnect一些問題為什么要將監聽socket設置為非阻塞阻塞與非阻塞定義 阻塞模式指的是當前某個函數執行效果未達預期&#xff0c;該函數會阻塞當前的執行線程&#xff0c;程序執行流在超時時間到達或者執行成功后恢復原有流程。非阻塞模式相反&am…

css3實現頭像旋轉360度

css樣式: .div a img{ width: 88px; height: 88px; border-radius: 88px; transition: all 1.2s ease-out 0s;}.div a img:hover{ -webkit-transform:rotate(360deg); -moz-transform:rotate(360deg); -o-transform:rotate(360deg); -ms-transform:rotate(360deg); transform:r…

POJ 2488 深搜

POJ 2488 深搜 要求字典序的順序。 1 #include <iostream>2 #include <stdio.h>3 #include <string.h>4 using namespace std;5 int n,m,cnt;6 bool success;7 bool sign[30][30];8 int step[30][2];9 int dir[8][2]{ 10 -2,-1,-2,1, 11 …

socket 端口和地址復用

https://blog.csdn.net/weibo1230123/article/details/79978745 https://blog.csdn.net/weixin_42157432/article/details/115560824 在linux socket網絡編程中&#xff0c;大規模并發TCP或UDP連接時&#xff0c;經常會用到端口復用&#xff1a; int opt 1; if (setsockopt…

MyEclipse老是彈出problem occurred窗口

有的時候是因為jsp頁面中的java腳本有誤&#xff0c;比如說<% String name"";>就會出現錯誤&#xff0c;因為結束標簽少了一個百分號&#xff05;。轉載于:https://www.cnblogs.com/passer1991/archive/2013/03/15/2961624.html

C++網絡編程快速入門(四):EPOLL模型使用

目錄基本使用方法step1:創建epollfdstep2:將fd綁定到epollfdstep3:調用epoll_wait檢測事件epoll_wait與poll、select區別所在水平觸發與邊緣觸發基本使用方法 step1:創建epollfd 創建一個epollfd&#xff0c;若epoll_create調用成功&#xff0c;則返回一個非負值的epollfd&am…

Mysql中代替like模糊查詢的一種方法

使用Mysql的函數instr,可代替傳統的like方式查詢,并且速度更快。 instr函數&#xff0c;第一個參數是字段&#xff0c;第二個參數是要查詢的串&#xff0c;返回串的位置&#xff0c;第一個是1&#xff0c;如果沒找到就是0. 例如&#xff1a; select username from prefix_user …

兩種大小端判斷的方式

網絡通信是按照字節流進行數據交換的&#xff0c;主機根據不同的CPU型號可能是大段存儲&#xff0c;也可能是小端存儲。而網絡字節序在TCP/IP協議中已經規定好了&#xff0c;采用大端的排序方式。 所以網絡通信中一般將需要傳輸的整數型值轉換成網絡字節序。 從本機字節序轉換成…

把數據庫復制成腳本(包含遠程以及數據庫數據)

1.啟動VS 2.服務器資源管理器 3.連接需要的數據庫 4.右鍵數據庫 選擇publist to provider.... 5.剩下的 選擇數據庫 選擇存放地址 下一步 這方法應該是用在把08的數據還原到05上面 明天用這個方法去盜取哈公司的數據庫 看行不行轉載于:https://www.cnblogs.com/Rock-Lee/a…

代理模式用來初始化的延遲下載

package 設計模式; //代理模式實現延遲加載來減小啟動時間 //數據庫查詢接口 interface IDBQery{ public String request(); }class DBQuery implements IDBQery {//創建一個DBQery非常耗時的&#xff0c;這里面我可以在需要DBQuery的時候在創建public DBQuery(){try {Thread.s…