ubuntu10.10+android 搭建Opencv
生活随笔
收集整理的這篇文章主要介紹了
ubuntu10.10+android 搭建Opencv
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
編譯環境:ubuntu 10.10
opencv版本:2.2
1.首先需要下載以下文件:
sudo apt-get install build-essential
sudo apt-get install cmake
sudo apt-get install libgtk2.0-dev
sudo apt-get install swig
sudo apt-get install libpython2.6 python-dev python2.6-dev
3.解壓縮opencv后,在其目錄進行以下操作
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON
-D BUILD_EXAMPLES=ON ..
make
編譯完成后安裝進系統庫中
sudo make install
sudo ldconfig
如果想測試效果可以進入samples/c目錄中執行
. build_all.sh
來編譯示例程序,然后運行find_obj來看看opencv中surf的效果
4.接下來是編譯android的版本
在編譯之前需要解壓縮 android-ndk-r4-linux-x86-crystax-4.tar.bz2到用戶目錄下,因為opencv默認在用戶目錄下尋找,當然大家也可以更改配置文件
進入android目錄中,執行以下操作:
mkdir build
cd build
cmake ..
make
這就編譯好android的庫文件了,下面來新建一個android程序來測試一下
5.創建一個android工程,工程名為opencvtest,包名為com.opencvtest
在工程的根目錄下創建一個jni文件夾,然后分別創建Android.mk和hello-jni.cpp兩個文件
Android.mk的內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include /home/ms/opencv/OpenCV-2.2.0/android/build/android-opencv.mk
LOCAL_LDLIBS += $(OPENCV_LIBS)
LOCAL_C_INCLUDES += $(OPENCV_INCLUDES)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.cpp
include $(BUILD_SHARED_LIBRARY) 復制代碼
其中需要注意的是要更改include /home/ms/opencv/OpenCV-2.2.0到自己的opencv目錄下
hello-jni.cpp的內容如下:
#include <jni.h>
#include <cstdlib>
#include <stdexcept>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/imgproc/imgproc_c.h>
static CvScalar colors[] =
{
{{0,0,255}},
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}},
{{255,255,255}}
};
extern "C"
jint Java_com_opencvtest_opencvtest_getKeypointNum(JNIEnv* env,jobject thiz)
{
IplImage* object = cvLoadImage( "/sdcard/src.jpg", CV_LOAD_IMAGE_GRAYSCALE );
if(object != NULL){
CvSURFParams params = cvSURFParams(500, 1);
CvMemStorage* storage = cvCreateMemStorage(0);
IplImage* object_color = cvCreateImage(cvGetSize(object), 8, 3);
CvSeq *objectKeypoints = 0;
CvSeq *objectDescriptors = 0;
cvCvtColor( object, object_color, CV_GRAY2BGR );
cvExtractSURF( object, 0, &objectKeypoints, &objectDescriptors, storage, params);
for( int i = 0; i < objectKeypoints->total; i++ )
{
CvSURFPoint* r = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, i );
CvPoint center;
int radius;
center.x = cvRound(r->pt.x);
center.y = cvRound(r->pt.y);
radius = cvRound(r->size*1.2/9.*2);
cvCircle( object_color, center, radius, colors[0], 1, 8, 0 );
}
cvSaveImage( "/sdcard/src_surf.jpg" , object_color);
return objectKeypoints->total;
}
return 0;
} 復制代碼
需要注意的是,如果創建的工程名和我不一樣的話,需要更改JNI函數的函數名
更改好之后在工程的根目錄下運行
~/android-ndk-r4-crystax/ndk-build
即可進行編譯,~/android-ndk-r4-crystax指向了我自己的目錄,大家可以根據自己的情況修改
編譯完成后會創建libs和obj兩個目錄出來,同時需要注意的是要刷新android的工程來同步這兩個目錄下的內容
最后更改opencvtest.java文件來調用JNI,我的代碼如下:
package com.opencvtest;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class opencvtest extends Activity {
private TextView mTextView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView = (TextView) this.findViewById(R.id.textview);
mTextView.setText(Integer.toString(getKeypointNum()));
}
public native int getKeypointNum();
static {
System.loadLibrary("hello-jni");
}
} 復制代碼
6.這時候編譯出來的程序還不能在虛擬機中運行,一運行就會閃一下跳出來,這是因為opencv的android庫中有V5和V7兩種ARM架構的庫,我發現一般都會優先運行V7架構的ARM庫,但是虛擬機應該是個V5架構的,所以會馬上退出,我的G2手機也一樣,所以這時候還要對OpenCV-2.2.0/android/build/android-opencv.mk文件進行修改來讓程序在V5架構的ARM上運行,修改內容如下:
--- android-opencv.mk_backup 2011-02-27 05:31:41.813090978 -0800
+++ android-opencv.mk 2011-02-27 06:30:09.605091003 -0800
@@ -19,14 +19,10 @@
ANDROID_OPENCV_INCLUDES := $(OPENCV_ROOT)/android/android-jni/jni
ARMOBJS := local/armeabi
-ARMOBJS_V7A := local/armeabi-v7a
-OPENCV_LIB_DIRS := -L$(OPENCV_BUILD_ROOT)/obj/$(ARMOBJS_V7A) \
- -L$(OPENCV_BUILD_ROOT)/obj/$(ARMOBJS) -L$(OPENCV_BUILD_ROOT)/bin/ndk/$(ARMOBJS) \
- -L$(OPENCV_BUILD_ROOT)/bin/ndk/$(ARMOBJS_V7A)
+OPENCV_LIB_DIRS := -L$(OPENCV_BUILD_ROOT)/obj/$(ARMOBJS) -L$(OPENCV_BUILD_ROOT)/bin/ndk/$(ARMOBJS)
-ANDROID_OPENCV_LIB_DIRS := -L$(OPENCV_ROOT)/android/android-jni/libs/armeabi-v7a \
- -L$(OPENCV_ROOT)/android/android-jni/libs/armeabi
+ANDROID_OPENCV_LIB_DIRS := -L$(OPENCV_ROOT)/android/android-jni/libs/armeabi 復制代碼
主要就是去掉V7部分的內容
然后現在試用adb從電腦上push一張名字為src.jpg的文件到虛擬機的/sdcard/中,再運行程序即可看到效果,運行完畢后會生成SURF特征點檢索后的圖片
opencv版本:2.2
1.首先需要下載以下文件:
- OpenCV-2.2.0.tar.bz2
- android-ndk-r4-linux-x86-crystax-4.tar.bz2
sudo apt-get install build-essential
sudo apt-get install cmake
sudo apt-get install libgtk2.0-dev
sudo apt-get install swig
sudo apt-get install libpython2.6 python-dev python2.6-dev
3.解壓縮opencv后,在其目錄進行以下操作
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON
-D BUILD_EXAMPLES=ON ..
make
編譯完成后安裝進系統庫中
sudo make install
sudo ldconfig
如果想測試效果可以進入samples/c目錄中執行
. build_all.sh
來編譯示例程序,然后運行find_obj來看看opencv中surf的效果
4.接下來是編譯android的版本
在編譯之前需要解壓縮 android-ndk-r4-linux-x86-crystax-4.tar.bz2到用戶目錄下,因為opencv默認在用戶目錄下尋找,當然大家也可以更改配置文件
進入android目錄中,執行以下操作:
mkdir build
cd build
cmake ..
make
這就編譯好android的庫文件了,下面來新建一個android程序來測試一下
5.創建一個android工程,工程名為opencvtest,包名為com.opencvtest
在工程的根目錄下創建一個jni文件夾,然后分別創建Android.mk和hello-jni.cpp兩個文件
Android.mk的內容如下:
其中需要注意的是要更改include /home/ms/opencv/OpenCV-2.2.0到自己的opencv目錄下
hello-jni.cpp的內容如下:
需要注意的是,如果創建的工程名和我不一樣的話,需要更改JNI函數的函數名
更改好之后在工程的根目錄下運行
~/android-ndk-r4-crystax/ndk-build
即可進行編譯,~/android-ndk-r4-crystax指向了我自己的目錄,大家可以根據自己的情況修改
編譯完成后會創建libs和obj兩個目錄出來,同時需要注意的是要刷新android的工程來同步這兩個目錄下的內容
最后更改opencvtest.java文件來調用JNI,我的代碼如下:
6.這時候編譯出來的程序還不能在虛擬機中運行,一運行就會閃一下跳出來,這是因為opencv的android庫中有V5和V7兩種ARM架構的庫,我發現一般都會優先運行V7架構的ARM庫,但是虛擬機應該是個V5架構的,所以會馬上退出,我的G2手機也一樣,所以這時候還要對OpenCV-2.2.0/android/build/android-opencv.mk文件進行修改來讓程序在V5架構的ARM上運行,修改內容如下:
然后現在試用adb從電腦上push一張名字為src.jpg的文件到虛擬機的/sdcard/中,再運行程序即可看到效果,運行完畢后會生成SURF特征點檢索后的圖片
總結
以上是生活随笔為你收集整理的ubuntu10.10+android 搭建Opencv的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 输入设备配置文件(.idc文件)
- 下一篇: Android 4.0 Notifica