JNI CameraPreview使用opencv

时间:2018-04-20 23:02:09

标签: java android c++ opencv java-native-interface

我想实时处理在我的应用程序中生成的CameraPreview,因此我按照教程使用JNI。 在C / C ++方面,我是一个完全新手,我无法找到足够的解释。 我的实际代码在camerapreview上面生成一个imageView,后者的处理帧的结果用方法setPixels放在前者中。位图变为灰色,当我尝试在其上绘制一个矩形时,我们可以看到camerapreview而不是笔画的颜色。

#include <jni.h>

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include "opencv2/highgui/highgui.hpp"


using namespace std;
using namespace cv;

extern "C"
jboolean
Java_com_test_camera_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);

    Mat mGray(height, width, CV_8UC1, (unsigned char *)pNV21FrameData);
    Mat mResult(height, width, CV_8UC4, (unsigned char *)poutPixels);

    IplImage srcImg = mGray;
    IplImage ResultImg = mResult;

    cvCvtColor(&srcImg, &ResultImg, CV_GRAY2BGRA);

    cvRectangle(&ResultImg, cvPoint(100,10), cvPoint(200, 50), CV_RGB(0,0,0), 3, 8, 0);

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

以下结果:

左上角的矩形 Rectangle in the top left corner

我知道camerapreview提供了YUV格式的帧,但在我接下来的教程中,并不需要将YUV图像转换为RGB图像。我尝试通过搜索OpenCv文档来更改CV_GRAY2BGRA参数,但我只是在没有显示imageview的情况下结束。 有没有办法在图像上绘制一个矩形并直接在JNI中返回彩色图像?

编辑---------------------------------------------- ----------------

我找到了一种方法,可以根据你的建议做我想做的事。如果可以帮助别人的话我把它放在这里!

我把这段代码放在我的CameraPreview.java的方法OnPreviewFrame中:

 int width  = PreviewSizeWidth;
 int height = PreviewSizeHeight;

 if( mYuv != null ) mYuv.release();
 mYuv = new Mat( height + height/2, width, CvType.CV_8UC1 );
 mYuv.put( 0, 0, data );
 Mat mRgba = new Mat();

 Imgproc.cvtColor( mYuv, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4 );

 Bitmap map = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 );

 Imgproc.rectangle(mRgba, new Point(100, 50), new Point(200, 100), new Scalar(0, 255, 0, 255), 5);

 Utils.matToBitmap( mRgba, map );

 MyCameraPreview.setImageBitmap(map);
 mRgba.release();

1 个答案:

答案 0 :(得分:0)

按方法onYuvDataReceived查看here,我认为它会执行您正在寻求的转化。

首先你必须操纵你的YUV字节数组,然后使用然后使用cvCvtColor(&srcImg, &ResultImg, CV_YUV2BGRA_NV21)