第一个android-opencv程序

    我的第一个android-opencv程序登场。实现图片灰度化

刚刚会在android上写opencv程序,把一个小例子拿出来和大家分享,主要是android-opencv开发的过程。

1 安装android sdk、ndk、android-opencv、eclipse和ADT插件。这一部分就不介绍了,网上很多。android-opencv下载后编译也可以按照一位牛人的博客里讲的一步一步来弄。有问题的也可以加我好友。

2 新建一个android工程,加入ImageView和Button控件,修改主文件代码如下:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnChange=(Button)findViewById(R.id.btnChange);
        imgView=(ImageView)findViewById(R.id.imgChange);
        path="/sdcard/sample.bmp";
        imgSample=BitmapFactory.decodeFile(path);
        imgView.setImageBitmap(imgSample);
        btnChange.setOnClickListener(new OnClickListener(){
         public void onClick(View v){
          imgSample=BitmapFactory.decodeFile(cvRgb2Gray(path));
          imgView.setImageBitmap(imgSample);
         }
        });     
    }

3 在此工程下新建一个jni目录,Application.mk文件。在jni目录下新建一个Android.mk文件。相应代码如下:

Application.mk

APP_BUILD_SCRIPT := $(call my-dir)/jni/Android.mk
APP_PROJECT_PATH := $(call my-dir)
APP_PLATFORM := 5
APP_MODULES      :=  rgb2gray
Android.mk

# date: Summer, 2010
# author: Ethan Rublee
# contact: ethan.rublee@gmail.com
#Android.mk for the hello-jni opencv sample
#please define OPENCV_ROOT when calling ndk-build
#ndk-build OPENCV_ROOT=../../opencv
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#OPENCV_ROOT must be defined.
ifndef OPENCV_ROOT
$(warning Please define OPENCV_ROOT to point to the root folder of opencv, try ndk-build OPENCV_ROOT=../../opencv)
OPENCV_ROOT=/cygdrive/C/android-opencv/opencv
$(warning Defaulting to OPENCV_ROOT=$(OPENCV_ROOT))
endif


#define OPENCV_INCLUDES
include $(OPENCV_ROOT)/includes.mk
#define OPENCV_LIBS
include $(OPENCV_ROOT)/libs.mk

 

LOCAL_LDLIBS += $(OPENCV_LIBS) -llog
   
LOCAL_C_INCLUDES +=  $(OPENCV_INCLUDES) 

LOCAL_CPP_EXTENSION := cc
LOCAL_MODULE    := rgb2gray
LOCAL_SRC_FILES := rgb2gray.cc

include $(BUILD_SHARED_LIBRARY)
新建自己的opencv程序,实现图片的灰度化功能,代码如下:

#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>  
 

 
extern "C" 
jstring Java_com_jerry_ImgColorToGray_cvRgb2Gray(JNIEnv* env,jobject thiz,jstring path)  

  const char* file=env->GetStringUTFChars(path,0);
    IplImage* object = cvLoadImage(file,CV_LOAD_IMAGE_GRAYSCALE);  
    std::string filePath="/sdcard/result.bmp";
    jstring filePath1=env->NewStringUTF(filePath.c_str());
    const char * resultpath=env->GetStringUTFChars(filePath1, 0);
    cvSaveImage(resultpath,object);
    env->ReleaseStringUTFChars(path, file);
    env->ReleaseStringUTFChars(filePath1, resultpath);
    return filePath1;  
}

这里边要注意数据转化问题,具体转化规则请看jni相关资料。

4 利用cygwin编译自己写好的opencv程序。成功后会生成.so文件。在eclipse下运行android程序生成.apk文件,把此程序安装到手机上就可以运行。注意在模拟器上可能运行不起来,一闪就会退出,一定要在手机上运行,具体为什么,我还没有解决,反正做实验最好用真机。

5 到此程序就完成了。还有不完整的地方欢迎大家讨论。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值