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