?本文來自[http://blog.csdn.net/hellogv/](http://blog.csdn.net/hellogv/) ,引用必須注明出處!
今晚是平安夜,跟眾多四眼技術宅一樣,這個時候還是跟電腦過節
......
上次講解了在[Android上通過NDK把彩圖轉換為灰度圖](http://blog.csdn.net/hellogv/archive/2010/12/23/6094127.aspx),現在可以把[WindowsMobile版的ASIFT 例子](http://blog.csdn.net/hellogv/archive/2010/12/20/6087937.aspx)移植到Android上了.......在這里還是要再次感謝Jean-Michel Morel和Guoshen Yu兩位大牛的無私奉獻,尊重知識尊重開源精神。
先來看看本文程序運行截圖:

?
左圖是設定識別率為最低的結果,右圖是設定識別率為較低的結果。
本文的代碼可以到這里下載:[http://www.pudn.com/downloads314/sourcecode/comm/android/detail1391871.html](http://www.pudn.com/downloads314/sourcecode/comm/android/detail1391871.html)
這里ASIFT的NDK代碼(C++)跟WM篇的DLL代碼大體一樣,不過也存在一些不同:
1、JNI不支持引用傳遞,所以有些值必須通過函數返回,例如:
~~~
/** * 取得放大/縮小之后的圖像大小 */JNIEXPORT jintArray JNICALL Java_com_testASIFT_LibASIFT_GetZoomSize( JNIEnv* env, jobject obj) { jint arrint[2]; arrint[0] = IM_X; arrint[1] = IM_Y; jintArray result = env->NewIntArray(2); env->SetIntArrayRegion(result, 0, 2, arrint); return result;}/** * 返回匹配后圖像的大小 jintArray[0]為width, jintArray[1]為height */JNIEXPORT jintArray JNICALL Java_com_testASIFT_LibASIFT_GetMatchedImageSize( JNIEnv* env, jobject obj) { jint arrint[2]; arrint[0] = wo; arrint[1] = ho; jintArray result = env->NewIntArray(2); env->SetIntArrayRegion(result, 0, 2, arrint); return result;}
~~~
2、ASIFT接受的是8bit的灰度圖,使用前要轉換為8bit的灰度圖:
~~~
void PixelToVector(jint *cbuf, int w, int h, std::vector<float> *ipixels) { for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { // 獲得像素的顏色 int color = cbuf[w * i + j]; int red = ((color & 0x00FF0000) >> 16); int green = ((color & 0x0000FF00) >> 8); int blue = color & 0x000000FF; color = (red + green + blue) / 3; ipixels->push_back(color);//保存灰度值 } }}
~~~
使用后要把8bit灰度圖轉為RGB565:
~~~
jintArray result = env->NewIntArray(wo * ho); jint *cResult; cResult = env->GetIntArrayElements(result, false); int alpha = 0xFF << 24; for (int i = 0; i < ho; i++) { for (int j = 0; j < wo; j++) { // 獲得像素的顏色 int color = (int) opixelsASIFT[wo * i + j]; color = alpha | (color << 16) | (color << 8) | color; cResult[wo * i + j] = color; } } env->ReleaseIntArrayElements(result, cResult, 0);
~~~
主類testASIFT.java的邏輯代碼如下:
~~~
public class testASIFT extends Activity { /** Called when the activity is first created. */ ImageView imgView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.setTitle("Android上使用ASIFT---hellogv"); imgView=(ImageView)this.findViewById(R.id.ImageView01); LibASIFT.initZoomSize(320, 480);//縮放目標的大小 int []size=LibASIFT.GetZoomSize();//判斷是否設置成功 Log.e(String.valueOf(size[0]),String.valueOf(size[1])); Bitmap img1=((BitmapDrawable) getResources().getDrawable(R.drawable.adam1)).getBitmap(); int w1=img1.getWidth(),h1=img1.getHeight(); int[] pix1 = new int[w1 * h1]; img1.getPixels(pix1, 0, w1, 0, 0, w1, h1); //提取第一張圖片的特征點 LibASIFT.initImage1(pix1, w1, h1, 2); Bitmap img2=((BitmapDrawable) getResources().getDrawable(R.drawable.adam2)).getBitmap(); int w2=img2.getWidth(),h2=img2.getHeight(); int[] pix2 = new int[w2 * h2]; img2.getPixels(pix2, 0, w2, 0, 0, w2, h2); int[] imgPixels=LibASIFT.Match2ImageForImg(pix2, w2, h2, 2);//兩圖匹配 int[] imgSize=LibASIFT.GetMatchedImageSize();//匹配結果圖的大小 Bitmap imgResult=Bitmap.createBitmap(imgSize[0], imgSize[1], Config.RGB_565); imgResult.setPixels(imgPixels, 0, imgResult.getWidth(), 0, 0, imgResult.getWidth(), imgResult.getHeight()); imgView.setImageBitmap(imgResult);//顯示結果 }}
~~~
- 前言
- Android提高第一篇之MediaPlayer
- Android提高第二篇之SurfaceView的基本使用
- Android提高第三篇之SurfaceView與多線程的混搭
- Android提高第四篇之Activity+Intent
- Android提高第五篇之Service
- Android提高第六篇之BroadcastReceiver
- Android提高第七篇之XML解析與生成
- Android提高第八篇之SQLite分頁讀取
- Android提高第九篇之SQLite分頁表格
- Android提高第十篇之AudioRecord實現&quot;助聽器&quot;
- Android提高第十一篇之模擬信號示波器
- Android提高第十二篇之藍牙傳感應用
- Android提高第十三篇之探秘藍牙隱藏API
- Android提高第十四篇之探秘TelephonyManager
- Android提高第十五篇之ListView自適應實現表格
- Android提高十六篇之使用NDK把彩圖轉換灰度圖
- Android上使用ASIFT實現對視角變化更魯棒的特征匹配
- 在Android上使用ZXing識別條形碼/二維碼
- Android提高十七篇之多級樹形菜單的實現
- Android-opencv之CVCamera
- Android提高十八篇之自定義Menu(TabMenu)
- Android提高第十九篇之&quot;多方向&quot;抽屜
- Android提高第二十篇之MediaPlayer播放網絡音頻
- Android提高第二十一篇之MediaPlayer播放網絡視頻
- android平板上的GridView視圖緩存優化
- 精確監聽AbsListView滾動至底部
- 可動態布局的Android抽屜之基礎
- 可動態布局的Android抽屜之完整篇
- Android MediaPlayer與Http Proxy結合之基礎篇