java - JNI CameraPreview 使用 opencv 绘制矩形

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

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

相关文章:

java - 是否存在可以加入 ","和 "and"上的字符串列表的现有 Java 实用程序方法?

Android Recyclerview 预加载 View

java - 设置 Activity 对话框不可取消

java - UrlRewrite 和子域(foo.domain1.com 到 foo.domain2.com

java - 我可以覆盖在 Java 中返回 Unit 类型的 kotlin 方法吗

c++ - Vector2i 不想合作 :D

c++ - 最有效的 C++ 数据结构,用于在顺序无关紧要时进行迭代?

c++ - Gram-Schmidt 可能导致精度损失

java - 如何在运行后保持应用程序窗口处于 Activity 状态?

java - Android Market 错误 -17 和缺少但可用的相机 : Has anyone else encountered this and what can be done?