我想实时处理在应用程序中生成的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;
}

并得到以下结果:

左上角的矩形
java - JNI CameraPreview用opencv绘制矩形-LMLPHP

我知道camerapreview提供了YUV格式的帧,但是在我遵循的教程中,并不需要将YUV图像转换为RGB图像。我试图通过在OpenCv doc上进行搜索来更改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();

最佳答案

看一下onYuvDataReceived方法的here,我认为它执行您要寻找的转换。

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

10-07 13:43