• Opencv的使用,NDK的简单使用


    第一部分:安装运行:

    1、下载opencv,并解压,将其目录下的sdk复制到eclipse的工作区间目录下,重命名为OpenCV-SDK(随意命名);

    2、从eclipse中导入:file->import->general->exiting project into project->next->browse(选择路径)->select all->finish,此时project explorer中会出现opencv library-2.4.10,导入成功;

    3、新建一个工程(要使用opencv)并选中,菜单栏project->properties->android->libraryadd->选中opencv library-2.4.10->OK;此时工程中会出现Android dependencies->opencv library-2.4.10.jar导入成功。接下来就可以调用相应的opencv中相应的功能进行java编程了。

    4、接下来是使用ndk调用opencv(在123)的基础上;

    5、头文件的生成(自动),使用命令行:

    先进入到工程的src目录下:javah -classpath 加载类的路径 -d 输出路径 -jni 引导类的路径 Enter!成功生成.h文件:

    注意两点:(1-classpath 就是你生成.class文件的祖先目录,究竟是哪里呢?就是那个刚好要出现包文件的地方,比如我的ImageProcclass文件路径是F:AndroidOpenCVGreyProcessinclassescomexamplegreyprocessImageProc.class包名是com.example,然后我classpath后面是F:AndroidOpenCVGreyProcessinclasses,(2)然后是-jni后面的,由于是在src目录下执行的javah命令这里直接写com.example.ImageProc就好了。我们使用javah不是为了单纯的生成.h头文件,不然就太大材小用了,我们是为了吧java文件中的函数声明转化成cc++中可调用的函数形式,准确的说是可以通过ndk调用的形式,所以这里的文件名我们是可以随便改的,但是里面的函数不能动;

    6、include头文件,编写c或者c++代码;

    7、你会发现编写的东西总是报错,因为还要导入ndk中和opencv中的东西,还要配置android.mkapplation.mk,配置android.mk是有个横重要的地方,记得include一下opencv。这里主要说一下加入ndkc库和opencv的库:

    (1)先确定正确导入了ndkwindow->preference->android->NDK->NDK location->browse:选择正确位置(如我的上面是D:Java_NDKSoftwareandroid-ndk-r10b)->apply->OK;

    (2)设置构建环境变量:选中工程 project->properties->C/C++ Build->Enviroment->add:我的nameNDKROOT,然后value是你ndk所在的路径(我的是D:Java_NDKSoftwareandroid-ndk-r10b->ok->apply

    (3)导入需要的库:project->properties->C/C++ General->path and symbols->includes->add:重复选择,知道加入你所有要用的库->apply->ok;(这是我导入的几个:D:Java_NDKSoftwareandroid-ndk-r10bplatformsandroid-4arch-armusrincludeD:Java_NDKSoftwareandroid-ndk-r10bplatformsandroid-8arch-armusrincludeD:Java_NDKSoftwareandroid-ndk-r10bsourcescxx-stlgnu-libstdc++4.6includeF:AndroidOpenCVOpenCV-SDK ativejniinclude这些因人而异)。

    (4)设置完成,这时你会发现原来cc++文件中的红叉叉没有了。

    8、然后构建生成库,右击工程->build project;

    9、运行工程run as android application

    第二部分:opencv的一些简单操作:

    1、图片读取:

     

    IplImage* src = NULL;
    src = cvLoadImage(imagePath, CV_LOAD_IMAGE_GRAYSCALE);第一个参数是文件路径,第二个是图像的读取格式;

    2、根据已有图片创建一个新的图片:

    IplImage* des= NULL;
    des= cvCreateImage(cvGetSize(src), src->depth,src->nChannels);三个参数:size,色深,通道数;

    3、图片保存及释放:

    cvSaveImage(outPath, des);
    cvReleaseImage(&src);

    4、图片显示:cvShowImage("图片:",des);

    5、图片二值化:cvThreshold(src,des,a,255,CV_THRESH_BINARY);四个参数:原图像,生成后的图像存储,阈值,最大值;

    6.、图片裁剪:设置裁剪区域,然后复制:

    IplImage *src = cvLoadImage(imagePath,CV_LOAD_IMAGE_COLOR);
    cvSetImageROI(src,cvRect(area.left.x, area.left.y, abs(area.right.x - area.left.x),abs(area.right.y - area.left.y)));
    IplImage *des = cvCreateImage(cvGetSize(src), src->depth,src->nChannels);
    cvCopyImage(src, des);
    cvSaveImage(imagePath,des);
    cvResetImageROI(src);
    cvReleaseImage(&des);
    cvReleaseImage(&src);

    第三部分:NDK的简单使用,完成于Java层的数据信息交换:

    1、jstring到char*的转化:

     1 JNIEXPORT void JNICALL Java_com_example_fun1
     2 (JNIEnv *env, jobject obj, jstring in) {
     3     const char* infile = env->GetStringUTFChars(in, 0); 5     int len_in = env->GetStringLength(in); 7     char in_file[len_in+1];
     8     strcpy(in_file, infile);
     9     env->ReleaseStringUTFChars(in,infile);12     djvuapi_decompose(in_file, dir_file);
    13
    14 }

    2、char*到jstring的转化,和objectarray(实际是使用字符串数组)的使用:

     1 JNIEXPORT jobjectArray JNICALL Java_com_example_fun2(
     2         JNIEnv *env, jobject obj, jstring in, jint sum) {
     3     const char* infile = env->GetStringUTFChars(in, 0);
     4     int len_in = env->GetStringLength(in);
     5     char in_file[len_in];
     6     strcpy(in_file, infile);
     7     env->ReleaseStringUTFChars(in,infile);
     8     char **strings = djvuapi_getpageinfo(in_file, &sum);
     9     jclass class_type = env->GetObjectClass(in);
    10     jobjectArray object_array = env->NewObjectArray(sum, class_type, 0);
    11     for (int i = 0; i < sum; i++) {
    12         const char* t=strings[i];
    13         jstring temp_string = env->NewStringUTF(t);
    14         env->SetObjectArrayElement(object_array, i, temp_string);
    15         env->DeleteLocalRef(temp_string);//考虑到内存,删除局部变量
    16     }
    17     return object_array;
    18 }

    3、一维数组的使用:

     1 JNIEXPORT void JNICALL Java_com_example_fun3
     2   (JNIEnv *env, jobject obj, jintArray area){
     3     int temp[4];
     4     env->GetIntArrayRegion(area,0,4,temp);//得到原数组的一份复制11     temp[0]=a.left.x;
    12     temp[1]=a.left.y;
    13     temp[2]=a.right.x;
    14     temp[3]=a.right.y;
    15     env->SetIntArrayRegion(area,0,4,temp);//提交修改(即复制回去);
    16 }

    4、二维数组的使用:

     1 JNIEXPORT jobjectArray JNICALL Java_com_example_fun4
     2   (JNIEnv *env, jobject obj){ 6     list<Area> areas; 9     jclass objClass=env->FindClass("[I");//根据签名获取class
    10     int len=areas.size();
    11     jobjectArray ans=env->NewObjectArray(len,objClass,NULL);
    12     int t[4],i=0;
    13     for(list<Area>::iterator ele=areas.begin();ele!=areas.end();ele++,i++)
    14     {
    15         t[0]=ele->left.x;
    16         t[1]=ele->left.y;
    17         t[2]=ele->right.x;
    18         t[3]=ele->right.y;
    19         jintArray a=env->NewIntArray(4);
    20         env->SetIntArrayRegion(a,0,4,t);
    21         env->SetObjectArrayElement(ans,i,a);
    22         env->DeleteLocalRef(a);
    23     }
    24     return ans;
    25 }

     5、从Java中的native函数使用javah生成对应的头文件:

    在命令行中进入到工程目录下,然后

    javah -classpath bin/classes [包名].[类名]

    然后就会在工程目录下生成.h文件,接下来只要把这个头文件复制到jni文件夹下相应的位置就好了。

    6、生成签名javap:

    很多时候我们需要根据函数或者属性的签名,为了可以在ndk层调用java层的函数和属性。这里就要用到javap这个东西:

    在命令行进入到工程目录下,然后输入;

    javah -classpath bin/classes [包名].[类名]

    然后屏幕上就会显示对应的属性和方法的签名。

     

  • 相关阅读:
    解决:信息中插入avi格式的视频时,提示“unsupported video format”
    java字节数组和16进制之间的转换
    16进制转换字节数组工具类
    如何在ubuntu 12.04 中安装经典的 GNOME桌面
    Ubuntu安装软件提示”需要安装不能信任的软件包”解决办法
    Ubuntu系统下运行Eclipse出现找不到jre的问题的解决方法
    ubuntu添加共享出错
    从scrapy使用经历说开来
    有趣的问题--12 coins problem
    一个奇怪的MySQL错误返回
  • 原文地址:https://www.cnblogs.com/guanking19/p/4246569.html
Copyright © 2020-2023  润新知