编译环境: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后,在其目录进行以下操作
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的内容如下:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. include /home/ms/opencv/OpenCV-2.2.0/android/build/android-opencv.mk
  4. LOCAL_LDLIBS += $(OPENCV_LIBS)
  5. LOCAL_C_INCLUDES += $(OPENCV_INCLUDES)
  6. LOCAL_MODULE := hello-jni
  7. LOCAL_SRC_FILES := hello-jni.cpp
  8. include $(BUILD_SHARED_LIBRARY)

复制代码

其中需要注意的是要更改include /home/ms/opencv/OpenCV-2.2.0到自己的opencv目录下
hello-jni.cpp的内容如下:

  1. #include <jni.h>
  2. #include <cstdlib>
  3. #include <stdexcept>
  4. #include <string>
  5. #include <opencv2/core/core.hpp>
  6. #include <opencv2/features2d/features2d.hpp>
  7. #include <opencv2/highgui/highgui.hpp>
  8. #include <opencv2/imgproc/imgproc.hpp>
  9. #include <opencv2/calib3d/calib3d.hpp>
  10. #include <opencv2/imgproc/imgproc_c.h>
  11. static CvScalar colors[] =
  12. {
  13. {{0,0,255}},
  14. {{0,128,255}},
  15. {{0,255,255}},
  16. {{0,255,0}},
  17. {{255,128,0}},
  18. {{255,255,0}},
  19. {{255,0,0}},
  20. {{255,0,255}},
  21. {{255,255,255}}
  22. };
  23. extern "C"
  24. jint Java_com_opencvtest_opencvtest_getKeypointNum(JNIEnv* env,jobject thiz)
  25. {
  26. IplImage* object = cvLoadImage( "/sdcard/src.jpg", CV_LOAD_IMAGE_GRAYSCALE );
  27. if(object != NULL){
  28. CvSURFParams params = cvSURFParams(500, 1);
  29. CvMemStorage* storage = cvCreateMemStorage(0);
  30. IplImage* object_color = cvCreateImage(cvGetSize(object), 8, 3);
  31. CvSeq *objectKeypoints = 0;
  32. CvSeq *objectDescriptors = 0;
  33. cvCvtColor( object, object_color, CV_GRAY2BGR );
  34. cvExtractSURF( object, 0, &objectKeypoints, &objectDescriptors, storage, params);
  35. for( int i = 0; i < objectKeypoints->total; i++ )
  36. {
  37. CvSURFPoint* r = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, i );
  38. CvPoint center;
  39. int radius;
  40. center.x = cvRound(r->pt.x);
  41. center.y = cvRound(r->pt.y);
  42. radius = cvRound(r->size*1.2/9.*2);
  43. cvCircle( object_color, center, radius, colors[0], 1, 8, 0 );
  44. }
  45. cvSaveImage( "/sdcard/src_surf.jpg" , object_color);
  46. return objectKeypoints->total;
  47. }
  48. return 0;
  49. }

复制代码

需要注意的是,如果创建的工程名和我不一样的话,需要更改JNI函数的函数名

更改好之后在工程的根目录下运行
~/android-ndk-r4-crystax/ndk-build
即可进行编译,~/android-ndk-r4-crystax指向了我自己的目录,大家可以根据自己的情况修改

编译完成后会创建libs和obj两个目录出来,同时需要注意的是要刷新android的工程来同步这两个目录下的内容

最后更改opencvtest.java文件来调用JNI,我的代码如下:

  1. package com.opencvtest;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.TextView;
  5. public class opencvtest extends Activity {
  6. private TextView mTextView;
  7. /** Called when the activity is first created. */
  8. @Override
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. mTextView = (TextView) this.findViewById(R.id.textview);
  13. mTextView.setText(Integer.toString(getKeypointNum()));
  14. }
  15. public native int getKeypointNum();
  16. static {
  17. System.loadLibrary("hello-jni");
  18. }
  19. }

复制代码

6.这时候编译出来的程序还不能在虚拟机中运行,一运行就会闪一下跳出来,这是因为opencv的android库中有V5和V7两种ARM架构的库,我发现一般都会优先运行V7架构的ARM库,但是虚拟机应该是个V5架构的,所以会马上退出,我的G2手机也一样,所以这时候还要对OpenCV-2.2.0/android/build/android-opencv.mk文件进行修改来让程序在V5架构的ARM上运行,修改内容如下:

  1. --- android-opencv.mk_backup 2011-02-27 05:31:41.813090978 -0800
  2. +++ android-opencv.mk 2011-02-27 06:30:09.605091003 -0800
  3. @@ -19,14 +19,10 @@
  4. ANDROID_OPENCV_INCLUDES := $(OPENCV_ROOT)/android/android-jni/jni
  5. ARMOBJS := local/armeabi
  6. -ARMOBJS_V7A := local/armeabi-v7a
  7. -OPENCV_LIB_DIRS := -L$(OPENCV_BUILD_ROOT)/obj/$(ARMOBJS_V7A) \
  8. - -L$(OPENCV_BUILD_ROOT)/obj/$(ARMOBJS) -L$(OPENCV_BUILD_ROOT)/bin/ndk/$(ARMOBJS) \
  9. - -L$(OPENCV_BUILD_ROOT)/bin/ndk/$(ARMOBJS_V7A)
  10. +OPENCV_LIB_DIRS := -L$(OPENCV_BUILD_ROOT)/obj/$(ARMOBJS) -L$(OPENCV_BUILD_ROOT)/bin/ndk/$(ARMOBJS)
  11. -ANDROID_OPENCV_LIB_DIRS := -L$(OPENCV_ROOT)/android/android-jni/libs/armeabi-v7a \
  12. - -L$(OPENCV_ROOT)/android/android-jni/libs/armeabi
  13. +ANDROID_OPENCV_LIB_DIRS := -L$(OPENCV_ROOT)/android/android-jni/libs/armeabi

复制代码

主要就是去掉V7部分的内容
然后现在试用adb从电脑上push一张名字为src.jpg的文件到虚拟机的/sdcard/中,再运行程序即可看到效果,运行完毕后会生成SURF特征点检索后的图片

ubuntu10.10+android 搭建Opencv相关推荐

  1. android搭建opencv开发环境,Android Studio搭建opencv开发环境

    文章不配图片,阅读需要有Android开发基础并熟悉Android Studio. 一.搭建基于Java开发环境 以下内容介绍如何搭建基于Java jni的opencv开发环境. 1.准备工作 从op ...

  2. linux ipp qt,win10+QT5.10.1搭建OpenCV开发环境

    一.   搭建前的准备工作 1.下载QT 2.下载OpenCV 3.下载Cmake工具 二.安装软件 1.QT傻瓜式安装,记得安装路径即可 2.Cmake安装,注意在安装过程中勾选"为所有用 ...

  3. ubuntu 10.10下搭建android开发环境 安装必要工作用软件

    进了新公司之后,工作环境有了很大的变化,以前都是在windows环境下进行程序开发,没怎么接触linux系统,新项目组中有6个同事,一水的ubuntu,木有办法,我也换成ubuntu吧. 曾经在学li ...

  4. 搭建Android+QT+OpenCV环境,实现“单色图片着色”效果

    OpenCV是我们大家非常熟悉的图像处理开源类库:在其新版本将原本在Contrib分库中的DNN模块融合到了主库中,并且更新了相应文档.这样我们就能够非常方便地利用OpenCV实现一些属于DeepLe ...

  5. ubuntu10.10各种服务器搭建

    sudo apt-get install openssh-server openssh-client 启动SSH-Server sudo /etc/init.d/ssh start 然后点击位置-&g ...

  6. Python:搭建OpenCV环境

    Python:搭建OpenCV环境 OpenCV介绍 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS ...

  7. Ubuntu10下MySQL搭建Amoeba_读写分离

    一.背景知识 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明.具有负载均衡.高可用性.sql过滤.读写分离.可路由相关 ...

  8. 音视频开发(23)---音视频直播技术--10分钟搭建好直播平台

    音视频直播技术--10分钟搭建好直播平台 前言 今天给大家讲一下如何搭建最简单的音视频直播平台.在之前的文章中我已经给大家介绍过音视频直播技术架构,没看过的同学可以看一下.了解了直播的技术架构,我们就 ...

  9. Android搭建WebSocket服务端

    WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端.全双工就是指客户端和服务端可 ...

最新文章

  1. java清空redis缓存数据库_java相关:Spring Cache手动清理Redis缓存
  2. SAP Backgroud job
  3. 一卡通大冒险(hdu2512)
  4. [深度学习] 自然语言处理 --- 1.Attention
  5. html5 支持php标签吗,HTML5新增标签使用方法
  6. 【数据库系统】SQL修改的注意事项
  7. MIX08,迎来Silverlight2的新时代
  8. 为什么说 Transformer 就是图神经网络?
  9. 我的开源项目:H.264码流分析器
  10. Python帮助文档的查看方式——Python初学者必看
  11. 海外云服务器备份和恢复的6种最佳做法
  12. 【Unity】脚本实现动态模型切割
  13. jmeter性能测试各个方法介绍
  14. Word 2003域应用完全手册
  15. VS2015 更换序列号
  16. MySQL索引 聚集索引
  17. 矮轴机械键盘用起来会更爽吗?Keychron K1告诉你答案
  18. 5分钟弄懂语音识别技术原理
  19. oracle ora 02437,给表追加主键-----报错ORA-02437: 无法验证 (DENGCHAO.TEST) - 违反主键
  20. 图像压缩编码基础——笔记整理

热门文章

  1. IT团队之非正式沟通
  2. Bash:如何查看某个文件是那个程序/进程创建的?
  3. 转: Ubuntu 安装字体方法
  4. 12 信息2班 《基于Android的软件开发》课程成绩
  5. [openmp]使用嵌套互斥锁锁定变量
  6. scrum 11.8
  7. 详解CAPM的数学推导
  8. UMDF驱动开发入门
  9. NHibernate重要概念的解释和说明
  10. SQL Server 入门复习(2008)图解