我的第一个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 到此程序就完成了。还有不完整的地方欢迎大家讨论。