如何从Android中Java代码的OpenCV和显示返回一个形象?

我试着在本机代码中使用OpenCV的lib中绘制形状(即在Android应用JNI文件夹),调用本地方法返回图像java代码并显示它。

如何可以做到? 我无法找到针对Android使用OpenCV的一个简单的应用程序。 我设置的环境也和Android的使用OpenCV的像cvcamera给出的样品,校正运行的罚款。 他们用痛饮的JNI接口。 痛饮是强制性? 我没有使用痛饮。 我想了很多,仍然在努力。

在Java中,代码是这样的,

public class HelloJni extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new ShapeView(this)); } static { System.loadLibrary("hello-jni"); } } class ShapeView extends View { private Bitmap mBitmap; private static native Object drawingShape(); public ShapeView(Context context) { super(context); } protected void onDraw(Canvas canvas) { mBitmap = (Bitmap) drawingShape(); canvas.drawBitmap(mBitmap, 0, 0, null); } }

与在天然JNI类,

#include "ShapeView.h" #include <string.h> #include <jni.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> JNIEXPORT jobject JNICALL Java_ShapeView_drawingShape (JNIEnv *env, jclass obj) { IplImage* img=cvCreateImage(cvSize(300,300),IPL_DEPTH_8U,3); cvRectangle(img, cvPoint(100,100), cvPoint(200,200), cvScalar(255,0,0), 1); cvCircle(img, cvPoint(100,100), 20, cvScalar(0,255,0), 1); return (jobject)img; }

我编译使用NDK的构建本地代码。 该.so文件还创建和安装没有任何错误。 在Java代码中也没有错误。

当我运行的AVD的应用程序,我只能查看一个黑色的屏幕,并在几秒钟内得到消失。

什么错误代码? 请大家帮我改正。

如果痛饮强制性能怎么做? 我没有对OpenCV的和痛饮多少知识。 请帮帮我。

谢谢,斯里尼瓦桑

--------------解决方案-------------

你可以使用JavaCV来代替。 它提供了在Java中完全访问OpenCV的。 无需JNI,痛饮,或NDK的...

http://code.google.com/p/javacv/

您可以通过bytearrayintarray到JNI和使用GetByteArrayElements()来访问数组指针。 直接修改阵列数据并在结束释放它。 在Java代码文件数组数据应该改变。

extern "C"
jboolean
Java_my_project_MyRealTimeImageProcessing_CameraPreview_ImageProcessing(
JNIEnv* env, jobject thiz,
jint width, jint height,
jbyteArray NV21FrameData, jintArray outPixels)
{
jbyte * pNV21FrameData = env->GetByteArrayElements(NV21FrameData, 0);
jint * poutPixels = env->GetIntArrayElements(outPixels, 0);

if ( mCanny == NULL )
{
mCanny = new Mat(height, width, CV_8UC1);
}

Mat mGray(height, width, CV_8UC1, (unsigned char *)pNV21FrameData);
Mat mResult(height, width, CV_8UC4, (unsigned char *)poutPixels);
IplImage srcImg = mGray;
IplImage CannyImg = *mCanny;
IplImage ResultImg = mResult;

cvCanny(&srcImg, &CannyImg, 80, 100, 3);
cvCvtColor(&CannyImg, &ResultImg, CV_GRAY2BGRA);

env->ReleaseByteArrayElements(NV21FrameData, pNV21FrameData, 0);
env->ReleaseIntArrayElements(outPixels, poutPixels, 0);
return true;

}

示例代码可以发现这篇文章如何使用OpenCV的做实时图像处理中的Andr​​oid?

分类:机器人 时间:2015-03-16 人气:104
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.487 (s). 9 q(s)