- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想实时处理在我的应用程序中生成的 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;
}
结果如下:
我知道 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/
我做照片的时候需要保存叠加图片,叠加是其他类的View,在相机预览中添加,这是我的代码 主要 Activity public class MainActivity extends Activity i
简介 我有一个自定义相机应用程序,我在自定义 surfaceView 上显示相机预览。我需要实现的是,从图像资源创建一个叠加图像,它将显示在 cameraPreview 上,例如滤镜。 我一直在不同的
How to set Flutter CameraPreview Size "Fullscreen" 问题与此链接相同,但该解决方案不适用于我的手机 (LG G5)。在后置摄像头的摄像头预览周围留一个
我的 Activity 有一个 YouTubePlayerView,它必须显示在 SurfaceView(相机预览)上。 但是,由于 YouTubePlayerView 的视频 View 也使用了 S
我一直在尝试创建一个 Camera Preview,它在预览上显示一个带有多个透明图像的 View Pager。但是,我收到此错误: 05-10 03:31:23.614: E/AndroidRunt
我正在开发适用于 Android 的人脸检测应用程序(我的设备是装有 Android 4.1.2 的 Nexus S)。我的 SurfaceView 大小自动设置为 800x480,但我的最大相机分辨
我有一个 Google Pixel 3 并且正在使用 Flutter 的 camera插件版本 0.8.1 .CameraPreview模糊、嘈杂、放大,并且通常看起来比 Android 的相机应用差
我正在尝试像 instagram 一样制作 Image Capture 屏幕。 这是我的SurfaceView代码 SquareFrameLayout with measure overridden
当我尝试启动 ionic 相机预览时,我总是遇到以下错误: ERROR 错误:未捕获( promise ):无预览 我更新了所有依赖项,添加了提供程序等。但我没有让它运行,希望任何人都可以帮助我 =)
我尝试编写一些 AR 应用程序。现在我写了一些代码来显示相机预览并从设备上的传感器(acceleromentr、compas、gps 接收器)获取数据。 当我在单独的应用程序中运行代码时(例如作为一个
我想实时处理在我的应用程序中生成的 CameraPreview,因此我按照教程使用了 JNI。说到 C/C++,我完全是个新手,我找不到足够的解释。我的实际代码在 camerapreview 上方生成
我正在尝试制作一个 Android 应用程序,让用户可以使用 lomo 效果拍照。问题是,我想让相机自动预览带有效果的图像,而不是拍照然后应用效果。 我学会了如何在此 link 上使用 CameraP
我正在使用 CameraPreview 测量物体的高度,但问题是我无法设置 cameraPreview 高度全屏.. 我试过Positioned widget,它填满了屏幕但图像被拉伸(stretch
我需要快速访问我的新 Flutter 应用的 CameraPreview 数据。如果我使用 controller.takePicture(filePath) 拍照,文件需要几秒钟的时间才能保存到磁盘,
我在 FragmentDialog 中显示 CameraPreview。问题是,由于对话框对其背后的内容有着色背景 (backgroundDimAmount),CameraPreview 有什么办法可
我正在尝试合并 ApiDemos 中的两个示例,以便一个覆盖另一个。 1. 相机预览.java 2.半透明GLSurfaceViewActivity.java 我想 GLSurfaceView 并不是
我正在使用 camera在 flutter 上打包,我注意到从 takePicture() 函数获得的图像比在预览模式下显示的要宽。此外,垂直拍摄的照片看起来是方形的。我应该自己进行后处理吗?在原生a
我正在尝试将相机预览发送到表面纹理对象并将其渲染在正方形上。我已经运行了 GLES20 的代码,但没有找到 1.x 的任何内容。基本上它应该像这样工作,对吧? // setup texture gl.
我尝试调用 fragment 类中的构造函数。但是它显示错误。 这是构造函数代码: public CameraPreview(Context fragment, Camera camera,
我的应用程序有一组托管 FragmentActivity 的选项卡。其中一些选项卡包含 GoogleMaps Api v2 Support MapFragment 和/或 MapView,另一个是 Q
我是一名优秀的程序员,十分优秀!