在Android设备上使用CCV

时间:2015-08-06 19:16:02

标签: android computer-vision

有没有人尝试在Android上使用libccv?我无法在线找到任何示例代码,并且想知道如何使用CCV在Android应用中实现跟踪器。

这包括:   - 从Android设备相机处理图像   - 在设备屏幕上显示由CCV处理的图像

1 个答案:

答案 0 :(得分:1)

我最近实施了类似的东西。为实现这一目标,我使用OpenCV设置了一个Android JNI项目,并使用OpenCV摄像头读取功能来存储帧。然后,可以将指向帧数据的指针传递给CCV图像包装器,以便与CCV库函数一起使用。 CCV具有最小的依赖性,最简单的启动和运行方式是在项目的JNI目录中包含所需模块的源代码。

要使用OpenCV设置项目,您可以关注this tutorial. OpenCV SDK有一个简单的相机阅读器示例项目。 Android GitHub页面包含一个示例HelloJNI项目here,该项目展示了如何使用JNI使用Java和C / C ++设置Android项目。然后可以将CCV源添加到C / C ++源目录中,以便您的C / C ++函数可以访问库。

使用OpenCV库和JNI功能设置项目后,需要使用OpenCV保存帧数据并将其指针传递给C代码。将每个帧存储为Mat对象,然后可以将Mat对象传递给您的C / C ++代码:(请注意,这只是显示所需关键代码段的摘录)

package your.namespace.here;

import org.opencv.core.Core;
import org.opencv.core.Mat;

public class MainActivity{

    // Store frames in this object for later processing
    Mat frame;

    static {
        // Load the c file name with JNI bindings, e.g. here we load test.c
        System.loadLibrary("test");
    }

    // Declare the JNI function wrapper
    public native int ccvTest( long input, long output);

    // OpenCV methods here to store the frame, see 
    // OpenCV4Android - tutorial-1-camerapreview for full 
    // code description.
    //...

    // This function to be called after each frame is stored.
    // output can then be converted to Bitmap and displayed in ImageView
    // or used for further processing with OpenCV.
    public Mat processFrame(){
        Mat output = new Mat();
        ccvTest(frame.getNativeObjAddr(), output.getNativeObjAddr());
        return output;
    }
}

使用HelloJNI模板,调用一个CCV库函数的示例C文件(对于此示例,我们称之为test.c)将如下所示:

#include <string.h>
#include <jni.h>

#ifdef __cplusplus
extern "C" {
#endif
// ccv files to include should be compiled using c compiler
#include "ccv/lib/ccv.h"
#ifdef __cplusplus
}
#endif

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL
Java_your_namespace_here_MainActivity_ccvTest( JNIEnv* env,
                                              jobject thiz,
                                              jlong input, jlong output)
{

    Mat* in_p  = (Mat*)input;
    Mat* out_p  = (Mat*)output;
    Mat &rgb = *in_p;
    ccv_dense_matrix_t* image = 0;

    // Pass the Mat data to the CCV Image wrapper
    ccv_read(rgb.data, &image, CCV_IO_BGR_RAW | CCV_IO_ANY_RAW |     CCV_IO_GRAY, rgb.rows, rgb.cols, rgb.step[0]);

    // Now the Mat is in ccv image format, you can pass
    // the image pointer to any ccv function you like.

    //
    // Put your calls to CCV library here..
    //

}
#ifdef __cplusplus
}
#endif

项目的树结构可能看起来与此类似,所有ccv源都在jni / ccv文件夹中:

enter image description here

此设置非常有用,因为它允许您连接OpenCV和CCV的功能。希望这会有所帮助。