版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、OpenCV2.4簡(jiǎn)介OpenCV近年來(lái)發(fā)展迅猛,隨著Android智能終端的發(fā)展,越來(lái)越多的傳統(tǒng)科研平臺(tái)都轉(zhuǎn)向Android移動(dòng)終端。記得2010年人們還不大知道Android,當(dāng)時(shí)第一次用OpenCV還是用的1.0.2版本在VC6.0上。早期的OpenCV只提供C語(yǔ)言接口,你要申請(qǐng)個(gè)矩陣還得CvMat *mat = cvCreateMat(.)寫(xiě)一大串,這樣做是為了保證程序的運(yùn)行效率,帶來(lái)的不便是要開(kāi)發(fā)者手動(dòng)管理內(nèi)存分配,稍有不慎內(nèi)存泄漏那是常有的事。在OpenCV的發(fā)展歷程上,第一次飛躍是2009年10月1日發(fā)布的2.0版本,該版本支持C+接口 了,是直接從1.2版本跳到
2、2.0。不久又推出了2.1,自此后想要移植OpenCV至嵌入式系統(tǒng),在編譯時(shí)必須借助CMake工具,而以往的不用。第二次飛躍是在2010年6月發(fā)布的2.3、2.3.1版本,除提供C+接口向下兼容C接口外,新增了Java接口,且是對(duì)準(zhǔn)Android平臺(tái)。更重要的是以前官方不支持ndk-build,這次終于一統(tǒng)JNI接口調(diào)用方式,方便在Android上開(kāi)發(fā)使用。2012年4月2日發(fā)布了2.4版本,支持windows/Linux、Mac/Android/IOS四大系統(tǒng)。最新的版本是2013年11月11日發(fā)布的2.7版本。我電腦上配置的是2.4.4版本。從2.4之后,為了和Android的系統(tǒng)架構(gòu)保持
3、同步,準(zhǔn)確說(shuō)是吸收Android框架層的優(yōu)點(diǎn),引入了OpenCV Manager的概念,其本質(zhì)就是一個(gè)Service,用來(lái)管理OpenCV動(dòng)態(tài)鏈接庫(kù)。它工作在APP和OpenCV的動(dòng)態(tài)鏈接庫(kù)之間。OpenCV Manager的結(jié)構(gòu)就是模仿Android的Binder機(jī)制。其架構(gòu)圖如下:APP在運(yùn)行時(shí)會(huì)首先檢查OpenCV Manager存在不,如果不存在則會(huì)提示安裝。如果存在,就會(huì)連接這個(gè)服務(wù),進(jìn)一步初始化加載OpenCV庫(kù)。流程如下:對(duì)于開(kāi)發(fā)者而言,了解即可。從應(yīng)用層面講,將OpenCV-2.4.4-android-sdk解壓后,會(huì)看到如下文件夾:其中sdk就是開(kāi)包時(shí)要用到的包,sample
4、s是自帶的示例,doc是說(shuō)明文檔,apk則就是OpenCV Manager。手機(jī)想要運(yùn)行基于OpenCV的Java接口的程序,就必須先安OpenCV Manager。不同的手機(jī)選擇不同的版本,如果是英特爾平臺(tái)就選那個(gè)帶x86的。比較老的手機(jī)不支持ARMv7的選第三個(gè)。根據(jù)android的版本選擇前兩個(gè)。我手機(jī)支持的是第一種。安裝后即可。二、Android APP通過(guò)Java接口調(diào)OpenCV1、配置配置其實(shí)比較簡(jiǎn)單,比之前的用JNI接口調(diào)OpenCV要簡(jiǎn)單很多,不過(guò)為了保持同步,也即以后的開(kāi)發(fā)中可以隨意混用Java接口和JNI接口,我們?nèi)詫嚎s包解壓到跟工作空間平級(jí)的目錄。然后將解壓后的sdk
5、文件夾命名為OpenCV4Android-sdk,拷貝到新建的工作空間中。假設(shè)新建的工作空間名為OpenCV4Android?!緜渥ⅲ哼@里讓它兩平級(jí)是為了以后JNI調(diào)用時(shí)無(wú)需修改mk文件。注意解壓后會(huì)嵌套一個(gè)目錄,把它拷到最外層。sdk文件夾命名和拷貝到新的工作空間都不是必須的?!看蜷_(kāi)Eclipse切換到這個(gè)新的工作空間,右鍵import-General-Existing Projects into workspaces,選擇OpenCV解壓后的那個(gè)sdk包。導(dǎo)入后看是否有錯(cuò)誤,我的是提示找不到j(luò)ava.util.List這個(gè)包,原來(lái)是沒(méi)有加載進(jìn)來(lái)Android的SDK。選中項(xiàng)目,按快捷鍵Al
6、ter + Enter,點(diǎn)Android,選中一個(gè)SDK,要求3.0以上。然后clean一下,看bin文件夾下的opencv library - 2.4.4.jar是否生成,如果它生成了就表示已經(jīng)導(dǎo)入成功。2、新建項(xiàng)目并引入上面的jar包任意新建一個(gè)Android Application Project,然后選中該項(xiàng)目快捷鍵Alter + Enter,在下面的加庫(kù)區(qū)域點(diǎn)Add,將導(dǎo)入工作空間的opencv sdk選中:可以看到在Android Dependencies中將剛到導(dǎo)包bin目錄下生成的jar文件導(dǎo)進(jìn)去了。之后就可以使用opencv的API了?!緜渥ⅲ赫f(shuō)白了就是為了把這個(gè)jar包導(dǎo)進(jìn)
7、來(lái)。在生成這個(gè)jar包后可以把它拷出來(lái),新建一個(gè)user library參見(jiàn)導(dǎo)原生camera到eclipse這篇, 之后將包加進(jìn)來(lái)是一樣的。這個(gè)包只有200多kb,也可以將其直接拷貝到工程目錄下的libs文件夾,也是ok的。但是這樣做后,就看不到j(luò)ar包里具體的子包了,如org.opencv.ml這些?!?、一個(gè)完成的demo:將一個(gè)圖片灰度化項(xiàng)目名字為GrayProcess,下面貼源碼:布局文件:html view plaincopyprint?1. <RelativeLayout xmlns:android="2.
8、 xmlns:tools="3. android:layout_width="match_parent" 4. android:layout_height="match_parent" 5. android:paddingBottom="dimen/activity_vertical_margin" 6. &
9、#160; android:paddingLeft="dimen/activity_horizontal_margin" 7. android:paddingRight="dimen/activity_horizontal_margin" 8. android:paddingTop="dimen/activity_vertical_margin"
10、60;9. tools:context=".MainActivity" > 10. 11. <TextView 12. android:layout_width="wrap_content" 13.
11、0; android:layout_height="wrap_content" 14. android:layout_alignParentTop="true" 15. android:text="string/wellcome_words" />
12、60; 16. <ImageView 17. android:id="+id/img_huaishi" 18. android:layout_width="wrap_content" 19.
13、; android:layout_height="wrap_content" 20. android:background="drawable/nanhuaijin" 21. android:layout_centerInParent="true"
14、;/> 22. <Button 23. android:id="+id/btn_gray_process" 24. android:layout_width="wrap_content" 25.
15、 android:layout_height="wrap_content" 26. android:layout_below="id/img_huaishi" 27. android:layout_centerHorizontal="true&
16、quot; 28. android:text="灰度化"/>" 29. 30. </RelativeLayout> java文件:java view plaincopyprint?1. package com.example.grayprocess; 2. 3. import org.op
17、encv.android.BaseLoaderCallback; 4. import org.opencv.android.OpenCVLoader; 5. import org.opencv.android.Utils; 6. import org.opencv.core.Mat; 7. import org.opencv.imgproc.Imgproc; 8. 9. import android.app.Ac
18、tivity; 10. import android.graphics.Bitmap; 11. import android.graphics.Bitmap.Config; 12. import android.graphics.BitmapFactory; 13. import android.os.Bundle; 14. import android.os.Handler; 15. import an
19、droid.util.Log; 16. import android.view.Menu; 17. import android.view.View; 18. import android.view.View.OnClickListener; 19. import android.widget.Button; 20. import android.widget.ImageView; 21.
20、22. public class MainActivity extends Activity 23. 24. Button btnProcess; 25. Bitmap srcBitmap; 26. Bitmap grayBitmap; 27.
21、160; ImageView imgHuaishi; 28. private static boolean flag = true; 29. private static boolean isFirst = true; 30. pri
22、vate static final String TAG = "MainActivity" 31. 32. /OpenCV庫(kù)加載并初始化成功后的回調(diào)函數(shù) 33. private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this
23、) 34. 35. Override 36. public void onManagerConnected(int status) 37.
24、160; / TODO Auto-generated method stub 38. switch (status) 39. case BaseLoaderCallback.SUCCESS:
25、0; 40. Log.i(TAG, "成功加載"); 41. break; 42.
26、 default: 43. super.onManagerConnected(status); 44.
27、; Log.i(TAG, "加載失敗"); 45. break; 46. 47. &
28、#160; 48. 49. 50. Override 51. protected void onCreate(Bundle savedInstanceState)
29、160; 52. super.onCreate(savedInstanceState); 53. setContentView(R.layout.activity_main); 54. initUI(); 55.
30、; 56. btnProcess.setOnClickListener(new ProcessClickListener(); 57. 58. 59. 60. Override 61. &
31、#160;public boolean onCreateOptionsMenu(Menu menu) 62. / Inflate the menu; this adds items to the action bar if it is present. 63.
32、160; getMenuInflater().inflate(R.menu.main, menu); 64. return true; 65. 66. 67. public void initUI()
33、60; 68. btnProcess = (Button)findViewById(R.id.btn_gray_process); 69. imgHuaishi = (ImageView)findViewById(R.id.img_huaishi); 70.
34、60; Log.i(TAG, "initUI sucess."); 71. 72. 73. 74. public void procSrc2Gray() 75. Mat rgbMat
35、60;= new Mat(); 76. Mat grayMat = new Mat(); 77. srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.nanhuaijin);
36、160;78. grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Config.RGB_565); 79. Utils.bitmapToMat(srcBitmap, rgbMat);/convert original
37、160;bitmap to Mat, R G B. 80. Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);/rgbMat to gray grayMat 81. Utils.matToBitma
38、p(grayMat, grayBitmap); /convert mat to bitmap 82. Log.i(TAG, "procSrc2Gray sucess."); 83. 84. 85. private c
39、lass ProcessClickListener implements OnClickListener 86. 87. Override 88. public void onClick(Vie
40、w v) 89. / TODO Auto-generated method stub 90. if(isFirst) 91.
41、; 92. procSrc2Gray(); 93. isFirst =
42、0;false; 94. 95. if(flag) 96.
43、160;imgHuaishi.setImageBitmap(grayBitmap); 97. btnProcess.setText("查看原圖"); 98.
44、60;flag = false; 99. 100. else 101.
45、0; imgHuaishi.setImageBitmap(srcBitmap); 102. btnProcess.setText("灰度化"); 103.
46、; flag = true; 104. 105. 106. 107. 108. 109. &
47、#160; Override 110. protected void onResume() 111. / TODO Auto-generated method stub 112. super.onResume()
48、; 113. /load OpenCV engine and init OpenCV library 114. OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_4, getApplicationContext(), mLo
49、aderCallback); 115. Log.i(TAG, "onResume sucess load OpenCV."); 116. / new Handler().postDelayed(new Runnable() 117. / 118. /
50、160; Override 119. / public void run() 120. / / TODO Auto-gener
51、ated method stub 121. / procSrc2Gray(); 122. / 123. / 124. / , 1000); 125.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)項(xiàng)目設(shè)計(jì)合同模板
- 2024藥品采購(gòu)合同
- 工業(yè)用油購(gòu)銷(xiāo)合同
- 2024年度高鐵站場(chǎng)CFG樁基礎(chǔ)施工合同
- 2024年圖書(shū)館公共衛(wèi)生間改造升級(jí)合同
- 商鋪定金租賃合同樣本
- 擔(dān)保合同書(shū)寫(xiě)格式
- 2024總價(jià)合同和可調(diào)價(jià)合同簡(jiǎn)介
- 2024股權(quán)融資協(xié)議書(shū)樣本
- 2024簽購(gòu)房合同需要什么
- 幼兒園班級(jí)區(qū)域環(huán)境創(chuàng)設(shè)課件
- HFMEA實(shí)戰(zhàn)案例概述課件
- Q∕GDW 12151-2021 采用對(duì)接裝置的輸電線路流動(dòng)式起重機(jī)組塔施工工藝導(dǎo)則
- 《敘事式心理治療》精品PPT
- 2022中國(guó)聽(tīng)障用戶(hù)數(shù)字產(chǎn)品體驗(yàn)調(diào)研報(bào)告
- ADAScog(老年癡呆量表—認(rèn)知)
- 熱污染評(píng)價(jià)及標(biāo)準(zhǔn)
- 脫硫檢修方案
- 樂(lè)理試題(音程-三和弦)
- 三資系統(tǒng)操作手冊(cè)
- 綿陽(yáng)市物業(yè)服務(wù)收費(fèi)管理實(shí)施細(xì)則
評(píng)論
0/150
提交評(píng)論