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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Ubuntu >内容正文

Ubuntu

ubuntu10.10+android 搭建Opencv

發(fā)布時(shí)間:2025/4/5 Ubuntu 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ubuntu10.10+android 搭建Opencv 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
編譯環(huán)境:ubuntu 10.10
opencv版本:2.2

1.首先需要下載以下文件:



  • OpenCV-2.2.0.tar.bz2
  • android-ndk-r4-linux-x86-crystax-4.tar.bz2
2.ubuntu需要以下包

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后,在其目錄進(jìn)行以下操作
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON
-D BUILD_EXAMPLES=ON ..
make

編譯完成后安裝進(jìn)系統(tǒng)庫中
sudo make install
sudo ldconfig

如果想測試效果可以進(jìn)入samples/c目錄中執(zhí)行
. build_all.sh
來編譯示例程序,然后運(yùn)行find_obj來看看opencv中surf的效果

4.接下來是編譯android的版本
在編譯之前需要解壓縮 android-ndk-r4-linux-x86-crystax-4.tar.bz2到用戶目錄下,因?yàn)閛pencv默認(rèn)在用戶目錄下尋找,當(dāng)然大家也可以更改配置文件

進(jìn)入android目錄中,執(zhí)行以下操作:
mkdir build
cd build
cmake ..
make

這就編譯好android的庫文件了,下面來新建一個(gè)android程序來測試一下

5.創(chuàng)建一個(gè)android工程,工程名為opencvtest,包名為com.opencvtest
在工程的根目錄下創(chuàng)建一個(gè)jni文件夾,然后分別創(chuàng)建Android.mk和hello-jni.cpp兩個(gè)文件
Android.mk的內(nèi)容如下:
  • 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)
  • 復(fù)制代碼
    其中需要注意的是要更改include /home/ms/opencv/OpenCV-2.2.0到自己的opencv目錄下
    hello-jni.cpp的內(nèi)容如下:

  • #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;
  • }
  • 復(fù)制代碼
    需要注意的是,如果創(chuàng)建的工程名和我不一樣的話,需要更改JNI函數(shù)的函數(shù)名

    更改好之后在工程的根目錄下運(yùn)行
    ~/android-ndk-r4-crystax/ndk-build
    即可進(jìn)行編譯,~/android-ndk-r4-crystax指向了我自己的目錄,大家可以根據(jù)自己的情況修改

    編譯完成后會創(chuàng)建libs和obj兩個(gè)目錄出來,同時(shí)需要注意的是要刷新android的工程來同步這兩個(gè)目錄下的內(nèi)容

    最后更改opencvtest.java文件來調(diào)用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");
  • }
  • }
  • 復(fù)制代碼
    6.這時(shí)候編譯出來的程序還不能在虛擬機(jī)中運(yùn)行,一運(yùn)行就會閃一下跳出來,這是因?yàn)閛pencv的android庫中有V5和V7兩種ARM架構(gòu)的庫,我發(fā)現(xiàn)一般都會優(yōu)先運(yùn)行V7架構(gòu)的ARM庫,但是虛擬機(jī)應(yīng)該是個(gè)V5架構(gòu)的,所以會馬上退出,我的G2手機(jī)也一樣,所以這時(shí)候還要對OpenCV-2.2.0/android/build/android-opencv.mk文件進(jìn)行修改來讓程序在V5架構(gòu)的ARM上運(yùn)行,修改內(nèi)容如下:

  • --- 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
  • 復(fù)制代碼 主要就是去掉V7部分的內(nèi)容
    然后現(xiàn)在試用adb從電腦上push一張名字為src.jpg的文件到虛擬機(jī)的/sdcard/中,再運(yùn)行程序即可看到效果,運(yùn)行完畢后會生成SURF特征點(diǎn)檢索后的圖片

    總結(jié)

    以上是生活随笔為你收集整理的ubuntu10.10+android 搭建Opencv的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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