我想实时处理在我的应用程序中生成的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;
}
以下结果:
我知道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();
答案 0 :(得分:0)
按方法onYuvDataReceived
查看here,我认为它会执行您正在寻求的转化。
首先你必须操纵你的YUV字节数组,然后使用然后使用cvCvtColor(&srcImg, &ResultImg, CV_YUV2BGRA_NV21)