概要:
本文主要讲解在Flutter通过Dart、JAVA和C三种方式,将相机获取的实时流数据转换为RGB格式。
目录:
1. 前言 2. Dart原生解析YUV 3. JAVA解析YUV 4. C解析YUV 5. 总结
前言
使用camera插件的图像流功能, 以及 如何安装camera插件这里不做过多解释。 我们主要调用camera controller 的 startImageStream 方法获取图像流。 这个方法在每次有新的帧数据时会被触发。
_controller.startImageStream((CameraImage imageStream) {
//_controller.stopImageStream();
// planes include Y,U,V plane on Android
// planes include RGBA on IOS
var framesY = imageStream.planes[0].bytes;
var framesU = imageStream.planes[1].bytes;
var framesV = imageStream.planes[2].bytes;
var lenU = framesU.length;
var lenV = framesV.length;
var lenY = framesY.length;
print('$lenU'+' '+'$lenV'+' '+'$lenY');
});
输出的imageStream中包含图像的四个属性,分别是:
格式、宽度、高度和planes
,其中planes中包含了图像的具体信息,下图是CameraImage的源码,请自行对照
由于FLutter是跨平台技术,所以在不同平台上获取的数据流格式也并不相同,这里只讲在Android和IOS中的格式: Android:android.graphics.ImageFormat.YUV_420_888(简称:YUV) IOS:kCVPixelFormatType_32BGRA(简称:BGRA) 由于图像格式不同,所以包含的信息也不同: Android:planes 含有三个字节数组,分别是 Y、U 和 V plane IOS:planes 只包含一个字节数组,即图像的 RGBA 字节 所以,获取到图像的planes数据只是第一步,下面的才是硬货。 解析planes数据 这里提供三种方式解析数据流,分别是Dart原生、JAVA和C,只讲Android平台的具体实例。
Dart解析YUV420到RGB
由于Flutter中image插件在Android和IOS上解析速度很慢,所以这种方式不建议采用,具体代码如下:
import 'package:image/image.dart' as imglib;
import 'package:camera/camera.dart';
/// Flutter Camera YUV_420_888 on Android, 32RGBA on IOS
/// YUV420 to RGB converter function but is slow
Future> convertImageToPng(CameraImage image) async {
try {
imglib.Image img;
if (image.format.group == ImageFormatGroup.yuv420) {
img = _convertYUV420(image);
} else if (image.format.group == ImageFormatGroup.bgra8888) {
img = _convertBGRA8888(image);
}
imglib.PngEncoder pngEncoder = new imglib.PngEncoder();
// Convert to png
List png = pngEncoder.encodeImage(img);
return png;
} catch (e) {
print(">>>>>>>>>>>> ERROR:" + e.toString());
}
return null;
}
// CameraImage BGRA8888 -> PNG
// Color
imglib.Image _convertBGRA8888(CameraImage image) {
return imglib.Image.fromBytes(
image.width,
image.height,
image.planes[0].bytes,
format: imglib.Format.bgra,
);
}
// CameraImage YUV420_888 -> PNG -> Image (compresion:0, filter: none)
// Black
imglib.Image _conve
概要:本文主要讲解在Flutter通过Dart、JAVA和C三种方式,将相机获取的实时流数据转换为RGB格式。目录:1. 前言2. Dart原生解析YUV3. JAVA解析YUV4. C解析YUV5. 总结1前言使用camera插件的图像流功能,以及如何安装camera插件这里不做过多解释。我们主要调用camera controller 的 startImageStream 方法获取图像...
适用于
Android
和iOS的
Flutter
插件支持裁剪
图像
。 该插件基于两个不同的本机库,因此这些平台之间具有不同的UI。
Image
Cropper不会直接在Dart代码
中
处理
图像
,而是使用公开Dart API,
Flutter
应用程序可使用该API与两个功能非常强大的本机库( 和 )进行通信以裁剪和
旋转
图像
。 因此,所有积分都属于这些库。
uCrop-亚兰提斯
该项目旨在提供最终且灵活的
图像
裁剪体验。 制造
TOCropViewController-TimOliver
TOCropViewController是一个开放源代码的UIViewController子类,用于裁剪出UI
Image
对象的各个部分,并执行基本的
旋转
操作。 它非常适合编辑个人资料
图片
或在线共享照片的一部分。 它在设计时就考虑了iOS Photos应用程序编辑器,因此,其行为应为iOS用户所熟悉。
将UCropActivity添加到您的
Android
Manifest.xml
中
< activity
android
: name = " com.yalantis.ucr
在本指南
中
,我们将使用tflite软件包和预先训练的SSD-MobileNet模型在
Flutter
中
开发应用程序,该模型能够检测
图像
和
实时
相机
流
中
的对象。 该应用程序能够离线检测对象。 我们还将能够从应用程序内拍照,并将其输入模型进行检测。
如果尚未安装,请在计算机上设置
Flutter
。
Flutter
网站上的本指南是一个很好的起点。设置
Flutter
之后,通过在终端
中
键入以下内容来创建一个新项目。
现在,您可以在自己喜欢的编辑器
中
打开项目。
我们使用
image
_picker从图库
中
选择
图像
,
Flutter
中
提供了Widget 组件供开发者解决日常
中
关于
图片
相关的需求,其
中
包含
Image
.file() 读取用户内存
中
图片
,
Image
.asset() 加载程序包含的
图片
资源,
Image
.network() 用于网络
图片
的加载,我们主要通过
Image
对于网络
图片
加载的实现来初步了解
Image
组件的原理。
首先从构造函数开始:
Image
.network(
String src, {
Key? key,
double scale = 1.0,
由于
JS
不能直接读取
图像
像素,故借助HTML5的canvas标签读取
图像
文件,通过get
Image
Data() 方法可以实现读取
图像
的像素(8位无符号整型数组)。
获取
图像
像素的数据(包含
RGB
A)后,只需遍历数组即可统计其
中
的
RGB
三通道的每一位(0 - 255)的个数。
最后利用统计的
RGB
数据,根据区间段渲染直方图。
bmp文件需要添加两个头,
一个是BITMAPFILEHEADER和BITMAPINFOHEADER。::::
BITMAPFILEHEADER bmpFileHeader = {0};
bmpFileHeader.bfReserved1 = 0;
bmpFileHeader.bfReserved2 = 0;
HTML 标签
<img class="weui-uploader__file" style="background-
image
: url('+ window.location.protocol + "//" + window.location.host +"/utils/file
Stream
?imgUrl=" + encodeURIComponent(imgList[j]) +')" ></img>
JAVA Controller
* 根据
图片
地址
获取
图片
后端接口要求携带参数,post请求
获取
图片
,并且请求错误时返回统一
js
on。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<meta cha
rs
et="utf-8" />
<title>New Document</title>
<meta name="generator" content="EverEdit" />
4 inherited;
5 bmp := TMemory
Stream
.Create ;
6
Image
2.Picture.Graphic.SaveTo
Stream
(bmp);
7 bmp.Position := 0;
8
Image
1.Picture.Graphic := TJPEGIma...