gpt4 book ai didi

java - JNI CameraPreview 使用 opencv 绘制矩形

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:03 26 4
gpt4 key购买 nike

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

#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();

最佳答案

看看here ,在方法 onYuvDataReceived 中,我认为它执行您正在寻找的转换。

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

关于java - JNI CameraPreview 使用 opencv 绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49950732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com