我正在为Android开发一种研究应用程序。我正在处理的子任务是从摄像头的实时视频流中获取帧。我试着从SurfaceView源码(解码YUV -> RGB -> HSV)得到它,但FPS太低(约5-7 FPS)。
所以,请告诉我,如何直接从摄像头视频流中获取视频帧(一些低级的东西,比如onFrameChanged())
我是如何做到的:
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
yuvs.add(data);
rgbText.setText("FRAMES: " + count);
count++;
}yuvs在哪里?
private ArrayList<byte[]> yuvs;感谢您的任何建议或代码片段
发布于 2018-12-29 20:19:04
实际上,FPS对光线条件非常敏感,它可以在很大的范围内变化(在我的测试中为8-30)。我不知道任何可靠的方法来提高预览的FPS,但只有建议,如降低分辨率,使用本地API等。我可以建议使用这个lib它提供了与原生https://github.com/natario1/CameraView相同的FPS,但大大减少了代码量。
下面是一个获取RGB位图的示例(Kotlin):
cameraView.addFrameProcessor { frame ->
if(frame!=null) {
val data = frame.data
val size = frame.size
// Process...
// cameraView.previewSize
val yuvImage = YuvImage(data, ImageFormat.NV21, size.width, size.height, null)
val os = ByteArrayOutputStream()
yuvImage.compressToJpeg(Rect(0, 0, size.width, size.height), 100, os)
val jpegByteArray = os.toByteArray()
var bitmap = BitmapFactory.decodeByteArray(jpegByteArray, 0, jpegByteArray.size)
}
}使用openCV,你可以非常快速地将其转换为单纯疱疹病毒:
val bmp = convert(bitmap, Bitmap.Config.ARGB_8888)
var mat = Mat(bmp.width, bmp.height, CvType.CV_8UC4)
Utils.bitmapToMat(bmp, mat)
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2HSV)
fun convert(bitmap: Bitmap, config: Bitmap.Config): Bitmap {
val convertedBitmap = Bitmap.createBitmap(bitmap.width, bitmap.height, config)
val canvas = Canvas(convertedBitmap)
val paint = Paint()
paint.color = Color.BLACK
canvas.drawBitmap(bitmap, 0F, 0F, paint)
return convertedBitmap
}发布于 2014-04-18 18:24:29
在你的相机对象上进行设置
setPreviewCallback(Camera.PreviewCallback cb)等等
Camera.PreviewCallback覆盖
onPreviewFrame(byte[] data, Camera camera)发布于 2016-05-03 15:50:26
ArrayList是在游戏、帧渲染等中使用的最差的类。可以试试这个
public void onPreviewFrame(byte[] data, Camera camera) { yuvs[count] = data; rgbText.setText("FRAMES: " + count); count++; }
并用byte[][]替换ArrayList<byte[]>。
https://stackoverflow.com/questions/23152020
复制相似问题