智能美化特效
个人信息采集字段 | 代码使用说明 |
个人信息采集字段 | 代码使用说明 |
传感器信息(游戏动作传感器、加速度、重力加速度、重力传感器、陀螺仪) | 【Android】该信息用于智能美化特效运行过程中判断手机旋转方向、移动角度、重力方向等信息。SDK 可通过内置传感器能力读取上述方向和运动变化信息;宿主应用也可按需通过 Android SensorManager 的 registerListener 开启采集,并通过 unregisterListener 关闭采集。 若不需要使用传感器信息,可在 EffectManager 初始化后调用 setUseBuiltinSensor(false) 关闭 SDK 内置传感器;若由宿主应用自行采集,则不调用 registerListener,或在页面暂停、销毁、场景结束时调用 unregisterListener,将不再采集相应传感器信息。 // 关闭 SDK 内置传感器 effectManager.init(); effectManager.setUseBuiltinSensor(false); // 宿主应用自行采集时的开启 / 关闭方式 android.hardware.SensorManager sensorManager = (android.hardware.SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); Sensor gyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); Sensor gravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); Sensor rotation = sensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR); if (rotation == null) { rotation = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); } sensorManager.registerListener(listener, accelerometer, android.hardware.SensorManager.SENSOR_DELAY_FASTEST); sensorManager.registerListener(listener, gyroscope, android.hardware.SensorManager.SENSOR_DELAY_FASTEST); sensorManager.registerListener(listener, gravity, android.hardware.SensorManager.SENSOR_DELAY_FASTEST); sensorManager.registerListener(listener, rotation, android.hardware.SensorManager.SENSOR_DELAY_FASTEST); sensorManager.unregisterListener(listener); |
分辨率、设备类型 | 【Android】该信息由宿主应用根据实际启用能力调用 Android 系统接口获取,用于相机预览、图片 / 视频输入和纹理处理等必要适配。屏幕分辨率可通过 DisplayMetrics 获取,设备类型可通过 Build.MODEL、Build.MANUFACTURER 获取。 若宿主应用不需要获取分辨率或设备类型信息,可不调用上述接口;未调用时将不再采集相应信息。 // 获取屏幕分辨率 DisplayMetrics metrics = getResources().getDisplayMetrics(); int screenWidth = metrics.widthPixels; int screenHeight = metrics.heightPixels; // 获取设备类型 String deviceModel = Build.MODEL; String manufacturer = Build.MANUFACTURER; |
图片、视频 | 【Android】该信息用于向智能美化特效 SDK 提供待处理的输入帧。图片、视频由宿主应用在获得用户授权同意后获取:相机预览可通过 Android Camera2 API(android.hardware.camera2)或 CameraX(androidx.camera)打开,本地图片、视频可通过系统照片选择器(Photo Picker)或 MediaStore 访问;SDK 处理宿主应用输入的图像或视频帧,不主动拉起相机或相册采集图片、视频。 若不声明或不申请 android.permission.CAMERA、READ_MEDIA_IMAGES、READ_MEDIA_VIDEO 或旧版本存储读取权限,或不调用相机 / 相册 / 视频输入能力,将不再采集对应图片、视频信息。页面暂停、销毁或场景结束后,应关闭对应输入源。 // 1. 宿主应用获取图片 / 视频帧并转换为纹理 int srcTexture = inputTextureId; int dstTexture = outputTextureId; // 2. 将输入帧送入 SDK 处理 effectManager.process(srcTexture, dstTexture, width, height, rotation, System.nanoTime()); // 3. 场景结束后关闭相机、图片或视频输入源 imageSourceProvider.close(); |
图片(AI 美颜 Live/Pro 云端处理,可选场景) | 【Android】该信息仅在启用 AI 美颜 Live / Pro 云端处理时使用。AI 美颜 Pro 在用户选择本地图片后发起处理,图片入口通过相册权限检查后打开相册选择器;AI 美颜 Live 在用户点击 AI 美颜后,从当前输入画面中取得满足条件的关键帧。宿主侧会将图片或关键帧转换为 JPEG Base64 字符串,再作为请求参数提交至云端。 图片会在宿主侧转换为 data:image/jpeg;base64,... 后写入请求体的 resource_list,并随 template_id、serverId 等字段提交云端任务;任务提交后通过查询接口轮询结果。 进入 AI 美颜 Live / Pro 页面时会展示隐私政策及服务条款弹窗,用户点击退出则关闭页面。宿主不启用 AI 美颜 Live / Pro 入口、不选择图片、不触发关键帧上传,或不调用上述提交任务接口,将不进入该图片云端处理链路。已发起的请求可通过关闭 AI 美颜流程取消当前请求和轮询。 // Pro:用户选择本地图片后提交 aiBeautyViewModel.uploadKeyFrameAndPollResult(imagePath, FEATURE_AI_BEAUTY_PRO) // Live:取得关键帧后提交 aiBeautyViewModel.uploadKeyFrameAndPollResult(buffer, width, height, FEATURE_AI_BEAUTY_LIVE) // 关闭 AI 美颜流程时,取消当前请求和轮询 aiBeautyViewModel.aiBeautyClose() 宿主接入时应在图片提交入口落实同意检查。停止后续采样或轮询,不代表已提交至服务端的图片被删除;服务端留存及删除规则需另行确认。该行用于补充 AI 美颜 Live / Pro 云端处理可选场景,不代表所有智能美化特效接入均会上传图片。 |
个人信息采集字段 | 代码使用说明 |
个人信息采集字段 | 代码使用说明 |
传感器信息(设备运动、重力及方向信息;SDK 内置传感器的具体字段待确认) | 该信息用于特效相关场景及输入画面方向校正。iOS 侧包含两条独立路径:SDK 内置传感器,以及宿主通过 Core Motion 获取的设备运动数据。当前工程在特效引擎的两条初始化路径中均调用 bef_effect_ai_use_builtin_sensor(handle, YES),开启 SDK 内置传感器;宿主方向检测通过 CMMotionManager 读取 CMDeviceMotion.gravity。 SDK 内置传感器可通过 bef_effect_ai_use_builtin_sensor(handle, false) 配置为不使用;宿主方向检测可通过 stopDeviceMotionUpdates 停止更新,不调用 startDeviceMotionUpdatesToQueue:withHandler: 则不启动该条宿主采集路径。两者需要分别控制。关闭后,依赖传感器的素材及方向校正可能受到影响。 // handle 已创建;参照当前工程,在 SDK 初始化前配置。 // 开启内置传感器(当前工程使用此配置) bef_effect_ai_use_builtin_sensor(handle, true); // 如需关闭,初始化前选择 false,替代上方的 true。 // 当前 initTask、initPostCheckLicense 两条路径均需同步配置。 bef_effect_ai_use_builtin_sensor(handle, false); #import <CoreMotion/CoreMotion.h> // motionManager 由宿主持有,并保持存活。 if (motionManager.isDeviceMotionAvailable) { motionManager.deviceMotionUpdateInterval = 1.0; [motionManager startDeviceMotionUpdatesToQueue:motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) { if (!motion) { return; } double gravityX = motion.gravity.x; double gravityY = motion.gravity.y; // 根据重力方向计算输入画面的旋转角度。 }]; } // 场景结束或不再需要方向检测时,停止宿主更新。 [motionManager stopDeviceMotionUpdates]; 当前工程的相机 stopRunning 仅停止相机会话,未同时停止方向检测;不能将停止相机或关闭画面美颜等同于停止全部传感器访问。具体内置传感器种类及运行时关闭行为需由 SDK 实现进一步确认,不直接套用 Android 的传感器名称。 |
分辨率、设备类型 | 由宿主根据实际场景读取,用于界面布局、输入画面适配和部分特效的设备支持判断。当前工程读取屏幕尺寸用于布局,通过 uname 获取设备型号用于 nativeGPUIsSupport 判断。特效初始化接口的 deviceName 参数实际传入空字符串;每帧处理时仍将输入纹理的 width、height 传入 SDK。 当前没有统一的设备信息采集开关。宿主可按业务需要控制屏幕尺寸和设备型号查询;输入图像的宽高属于正确处理图像所需参数,不应作为可随意省略的采集项。宿主不查询设备型号,不代表能够确认 SDK 二进制内部不读取设备信息。 #import <UIKit/UIKit.h> #import <sys/utsname.h> // 原生屏幕像素尺寸;用于确实需要屏幕分辨率的场景。 CGRect nativeBounds = UIScreen.mainScreen.nativeBounds; CGFloat screenWidthPixels = nativeBounds.size.width; CGFloat screenHeightPixels = nativeBounds.size.height; // 设备类别,如 iPhone、iPad。 NSString *deviceType = UIDevice.currentDevice.model; // 硬件型号,如 iPhone 的型号标识,用于设备适配。 struct utsname systemInfo; if (uname(&systemInfo) == 0) { NSString *deviceModel = [NSString stringWithUTF8String:systemInfo.machine]; // 根据实际需求使用 deviceModel。 } 示例中的 nativeBounds 用于展示屏幕像素尺寸的获取方式;当前工程的多数布局实际使用 UIScreen.bounds,其单位为点。屏幕尺寸与输入图像尺寸需要分别描述。 |
图片、视频 | 该信息用于提供输入图像数据。摄像头画面由宿主在获得相机授权后通过 AVFoundation 获取;本地图片、视频由宿主通过相册选择器获取,当前工程使用 TZImagePickerController。本地视频通过 AVAssetReader 解码,图片或视频帧转换为纹理后输入 SDK 处理。示例工程中的相机和相册访问入口位于宿主层。 相机用途在 Info.plist 中配置 NSCameraUsageDescription;相册读取用途配置 NSPhotoLibraryUsageDescription;保存处理结果至相册时配置 NSPhotoLibraryAddUsageDescription。用途声明不等同于授权,宿主需要按实际调用的系统 API 获取对应授权。相机授权被拒绝时,当前工程不会建立摄像头采集会话;不启动媒体获取入口、不向 SDK 提交图像数据,则不进入对应宿主输入链路。 #import <AVFoundation/AVFoundation.h> [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { if (granted) { // 由宿主创建并启动 AVCaptureSession,获取视频帧。 } else { // 不创建摄像头采集会话。 } }]; // 不再需要摄像头画面时,停止宿主相机会话。 [captureSession stopRunning]; // 以下变量由宿主的图像转换与渲染链路提供。 // width、height 是输入图像的尺寸,不是屏幕尺寸。 [effectManager processTexture:inputTexture outputTexture:outputTexture width:width height:height rotate:rotation timeStamp:timeStamp]; 本行描述图像获取与本地纹理处理入口。当前项目还包含 AI 美颜 Live/Pro 的云端图片处理,相关上传行为见下一行,不能对整个项目统一表述为“图片不上传”。 |
图片(AI 美颜 Live/Pro 云端处理,可选场景) | 当前工程的 AI 美颜 Live 在用户开启功能后,从输入画面中选择满足条件的关键帧;AI 美颜 Pro 在用户选择图片并通过人脸检测后发起请求。图片经过 JPEG 编码及 Base64 转换,作为 resource_list 中的内容提交至服务端进行分析或处理。 进入 AI 美颜 Live/Pro 页面时,当前工程显示隐私政策及服务条款弹窗;同意状态保存为 PrivacyPolicyAgreed,拒绝时退出页面。不启用 AI 云端美颜入口、不调用图片请求接口,可避免发起这条宿主图片上传链路。PrivacyPolicyAgreed 是页面同意状态,不能视为 SDK 的统一个人信息采集开关;当前请求方法本身未再次检查该状态。 // imageDataURI 由宿主将所选图片或关键帧编码为 JPEG Base64 后构造。 // 仅在业务需要且用户已同意对应处理时调用。 [aiBeautyHelper requestAiBeautyParamsByUri:imageDataURI isLive:YES completionHandler:^(NSString *taskId, NSError *error) { // isLive:YES 对应 Live,NO 对应 Pro。 }]; 宿主接入时应在图片提交入口落实同意检查。停止后续采样或轮询,不代表已提交至服务端的图片被删除;服务端留存及删除规则需另行确认。该行用于补充当前示例工程的云端功能,不代表所有智能美化特效接入均会上传图片。 |
个人信息采集字段 | 代码使用说明 |
个人信息采集字段 | 代码使用说明 |
传感器信息(加速度传感器、陀螺仪、重力传感器、旋转矢量传感器) | 【HarmonyOS】该信息用于智能美化特效运行过程中判断设备旋转方向、移动角度、重力方向、空间姿态等信息。当前 HarmonyOS 版本不通过 SDK 内置传感器能力自动订阅鸿蒙系统传感器;如素材或算法需要传感器信息,宿主应用可按需通过 HarmonyOS @kit.SensorServiceKit 的 sensor.on 开启采集,并通过 sensor.off 关闭采集,然后通过 SDK 暴露的 RenderManager 接口写入数据。 若不需要使用传感器信息,宿主应用不调用 sensor.on 即不会采集相应传感器数据;如果已经开启采集,应在页面暂停、页面销毁、场景结束或不再需要相关素材或算法时调用 sensor.off 取消订阅。 import { sensor } from '@kit.SensorServiceKit' // 初始化 Effect 句柄后,关闭 SDK 内置传感器模式。 renderManager.setUseBuiltinSensor(false) // 宿主应用根据 sensor.getSensorList() 的结果上报设备实际支持的传感器。 renderManager.setSensorAvailability( hasAccelerometer, hasGyroscope, hasGravity, hasRotationVector ) // 加速度传感器。 sensor.on(sensor.SensorId.ACCELEROMETER, data => { renderManager.setAccelerometerData(data.x, data.y, data.z, data.timestamp) }) // 陀螺仪传感器。 sensor.on(sensor.SensorId.GYROSCOPE, data => { renderManager.setGyroscopeData(data.x, data.y, data.z, data.timestamp) }) // 重力传感器。 sensor.on(sensor.SensorId.GRAVITY, data => { renderManager.setGravityData(data.x, data.y, data.z, data.timestamp) }) // 旋转矢量传感器。 // 宿主应用从 SensorId.ROTATION_VECTOR 获取姿态数据后,可转换为 3x3 旋转矩阵写入算法 IMU 通道。 // 以下转换函数仅表示数据流,具体转换逻辑由宿主应用按系统返回格式实现。 sensor.on(sensor.SensorId.ROTATION_VECTOR, data => { const matrix = convertRotationVectorToMatrix(data) renderManager.setRotationMatrix(matrix, data.timestamp) const quaternion = convertRotationVectorToQuaternion(data) renderManager.setDeviceRotation(quaternion) }) // 页面暂停、销毁、场景结束或不再需要时关闭采集。 sensor.off(sensor.SensorId.ACCELEROMETER) sensor.off(sensor.SensorId.GYROSCOPE) sensor.off(sensor.SensorId.GRAVITY) sensor.off(sensor.SensorId.ROTATION_VECTOR) |
分辨率、设备类型 | 【HarmonyOS】该信息由宿主应用根据实际启用能力调用 HarmonyOS 系统接口获取,用于渲染区域、触摸坐标归一化、手势坐标归一化,以及按设备形态进行页面、交互或能力适配。屏幕分辨率可通过 @kit.ArkUI 的 display.getDefaultDisplaySync() 获取,设备类型可通过 @kit.BasicServicesKit 的 deviceInfo.deviceType 获取。 若宿主应用不需要屏幕分辨率或设备类型信息,可不调用上述接口;未调用时将不再采集相应信息。 import { display } from '@kit.ArkUI' import { deviceInfo } from '@kit.BasicServicesKit' const displayInfo = display.getDefaultDisplaySync() const width = displayInfo.width const height = displayInfo.height const deviceType = deviceInfo.deviceType |
图片、视频 | 【HarmonyOS】该信息用于向智能美化特效 SDK 提供图片或视频输入。图片和视频均由宿主应用按业务场景主动选择或读取:图片可通过 @kit.ImageKit 的 image.createImageSource 解码为 PixelMap,再转换为 SDK 可处理的纹理或图像数据;视频可通过 @kit.MediaKit 的 media.createAVPlayer 解码到 SDK 提供或宿主创建的 Surface,并通过 media.createAVMetadataExtractor 读取视频宽高和方向。 若不需要处理图片或视频,宿主应用不读取对应文件,不创建 ImageSource、PixelMap、AVPlayer 或 AVMetadataExtractor 即可。SDK 不主动拉起相册或文件选择流程,也不主动访问宿主应用未传入的图片或视频资源。 import { fileIo as fs } from '@kit.CoreFileKit' import { image } from '@kit.ImageKit' const file = fs.openSync(imagePath) const size = fs.statSync(file.fd).size const buffer = new ArrayBuffer(size) fs.readSync(file.fd, buffer) fs.closeSync(file) const imageSource = image.createImageSource(buffer) const pixelMap = imageSource.createPixelMapSync({}) const imageInfo = pixelMap.getImageInfoSync() const width = imageInfo.size.width const height = imageInfo.size.height // 使用结束后释放图片资源。 pixelMap.release() import { media } from '@kit.MediaKit' import { fileIo as fs } from '@kit.CoreFileKit' const file = fs.openSync(videoPath) const extractor = await media.createAVMetadataExtractor() extractor.fdSrc = { fd: file.fd } const metadata = await extractor.fetchMetadata() const width = Number(metadata.videoWidth) const height = Number(metadata.videoHeight) const orientation = Number(metadata.videoOrientation) const avPlayer = await media.createAVPlayer() avPlayer.url = 'fd://' + file.fd avPlayer.surfaceId = surfaceId.toString() await avPlayer.prepare() await avPlayer.play() // 使用结束后关闭播放并释放资源。 await avPlayer.release() fs.closeSync(file) |
个人信息采集字段 | 代码使用说明 |
个人信息采集字段 | 代码使用说明 |
本地图片 | 该信息用于提供输入图像数据。图片由宿主应用读取并以图像帧形式输入 SDK 处理。Windows Demo 中,用户通过 Qt FileDialog 选择本地图片,Demo 将所选地址转换为本地文件路径,使用 QImage 读取图片并转换为 RGBA8888,以 QVideoFrame 形式进入处理流程,再将像素数据生成纹理并输入 SDK。该图片读取流程由 Demo 实现。 图片输入示例(Demo 图片读取及公共处理入口关键片段): // imageFile 为用户选择的本地图片地址。 QString filePath = imageFile.toLocalFile(); QImage img(filePath); if (img.isNull()) { return; } // 省略大图缩放分支,转换为 RGBA。 m_imgFrame = img.convertToFormat(QImage::Format_RGBA8888); // 图片定时回调提交图像帧。 QVideoFrame outFrame(m_imgFrame); emit imageFrame(outFrame, IMAGE_MODE_INDEX); // 公共处理入口将帧像素数据输入 SDK 接入层。 m_effectHandle->setInput(imgInput.width(), imgInput.height(), imgInput.bits(), BYTED_EFFECT::pixel_format_rgba); |
摄像头采集 | 该信息用于提供输入图像数据。摄像头由宿主应用开启,采集到的图像以帧数据形式输入 SDK 处理。Windows Demo 中,Demo 使用 QCameraInfo::availableCameras() 枚举设备,按设备索引创建并开启 QCamera,通过 BEVideoSurface 接收 QVideoFrame,转换为 RGBA8888 后生成纹理并输入 SDK。该摄像头选择、开启及采集流程由 Demo 实现。 摄像头输入示例(Demo 设备初始化、帧转换及公共处理入口关键片段): // 枚举设备,按 cameraIndex 创建摄像头及输出 surface。 m_cameraInfoList = QCameraInfo::availableCameras(); m_cameraSurfaces[cameraIndex] = new BEVideoSurface(cameraIndex); m_cameraList[cameraIndex] = new QCamera(m_cameraInfoList.at(cameraIndex), this); m_cameraList[cameraIndex]->setViewfinder(m_cameraSurfaces[cameraIndex]); m_cameraList[cameraIndex]->start(); // BEVideoSurface::present 中将采集图像转换为 RGBA 帧。 targetImg = targetImg.convertToFormat(QImage::Format_RGBA8888); QVideoFrame outFrame(targetImg.mirrored(true, true)); emit newFrameAvailable(outFrame, m_cameraIndex); // 公共处理入口将帧像素数据输入 SDK 接入层。 m_effectHandle->setInput(imgInput.width(), imgInput.height(), imgInput.bits(), BYTED_EFFECT::pixel_format_rgba); |
个人信息采集字段 | 代码使用说明 |
个人信息采集字段 | 代码使用说明 |
本地图片 | 该信息用于提供输入图像数据。图片由宿主应用读取并以图像帧形式输入 SDK 处理。Mac Demo 中,用户通过 NSOpenPanel 选择本地图片,Demo 使用 NSImage 读取文件,通过 Core Graphics 转换为像素数据,统一转换为 BGRA 后生成纹理并输入 SDK。该图片读取流程由 Demo 实现。 图片输入示例(Demo 关键片段,省略界面及初始化代码): // imageFile 为用户选择的本地图片路径。 NSImage *image = [[NSImage alloc] initWithContentsOfFile:imageFile]; if (image == nil) { return; } // 图片转换为 RGBA 像素缓冲区。 BEBuffer *inputBuffer = [self.imageUtils transforUIImageToBEBuffer:image]; // 公共帧处理路径将其转换为 BGRA,并输入 SDK 接入层。 [self onIncommingVideoFrame:inputBuffer timeStamp:[[NSDate date] timeIntervalSince1970] flip:NO]; |
摄像头采集 | 该信息用于提供输入图像数据。摄像头由宿主应用开启,采集到的图像以帧数据形式输入 SDK 处理。Mac Demo 中,Demo 使用 AVFoundation 获取默认摄像头或按设备索引切换摄像头,通过 AVCaptureSession 开启采集,从 CMSampleBufferRef 回调中取得 BGRA 图像帧及时间戳,生成纹理并输入 SDK。该摄像头选择、开启及采集流程由 Demo 实现。 摄像头输入示例(Demo 初始化及帧回调关键片段): // 创建并开启摄像头采集。 BELocalVideoCapture *capture = [[BELocalVideoCapture alloc] initWithPosition:AVCaptureDevicePositionUnspecified cameraSessionPreset:AVCaptureSessionPreset1280x720 pixelFormatType:kCVPixelFormatType_32BGRA]; [capture setCameraOutput:self]; [capture startCameraCapture]; // cameraFrame: 回调中取得图像帧与时间戳。 CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CMTime sampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); double timeStamp = (double)sampleTime.value / sampleTime.timescale; CVPixelBufferLockBaseAddress(pixelBuffer, 0); unsigned char *baseAddress = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer); // Demo 继续读取尺寸、行步长并构造 BGRA inputBuffer。 [self onIncommingVideoFrame:inputBuffer timeStamp:timeStamp flip:NO]; CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); |
个人信息采集字段 | 代码使用说明 |
个人信息采集字段 | 代码使用说明 |
本地图片/视频 | 该信息用于提供输入图像数据。图片、视频信息由宿主应用主动传入视频图片路径,交由opencv或者其他sdk代码进行视频转换,图像采集,,并将获取的图像 / 视频以帧数据形式输入 SDK 处理,SDK 不主动采集图片、视频信息。 图片输入: cv::Mat bgr = cv::imread("input.jpg", cv::IMREAD_COLOR); if (bgr.empty()) { std::fprintf(stderr, "OpenCV 读图失败: %s\n", options.input_image_path.c_str()); return 5; } //bgr转rgba cv::Mat rgba; cv::cvtColor(bgr, rgba, cv::COLOR_BGR2RGBA); //buffer转texture unsigned int inputTexture = createTexture(); updateBufferToTexture(m_width, m_height, rgba.data, inputTexture); 视频输入: cv::VideoCapture m_capture; m_capture.open("input.mp4", cv::CAP_FFMPEG); if (!m_capture.isOpened()) { std::fprintf(stderr, "OpenCV 打开视频失败: input.mp4\n"); return 5; } cv::Mat &bgr m_capture.read(bgr);//读一帧 //bgr转rgba cv::Mat rgba; cv::cvtColor(bgr, rgba, cv::COLOR_BGR2RGBA); //buffer转texture unsigned int inputTexture = createTexture(); updateBufferToTexture(m_width, m_height, rgba.data, inputTexture); |
摄像头采集 | 该信息用于提供输入图像数据。摄像头图像信息由宿主应用主动传入摄像头id,交由opencv或者其他sdk代码进行视频采集,格式转换等,并将获取的图像 / 视频以帧数据形式输入 SDK 处理,SDK 不主动采集图片、视频信息。 摄像头输入: cv::VideoCapture m_capture; m_capture.open(0); //打开camere 0 if (!m_capture.isOpened()) { std::cout << "OpenCV 打开camera 0失败\n" << std::endl; return 5; } cv::Mat &bgr m_capture.read(bgr);//读一帧 //bgr转rgba cv::Mat rgba; cv::cvtColor(bgr, rgba, cv::COLOR_BGR2RGBA); //buffer转texture unsigned int inputTexture = createTexture(); updateBufferToTexture(m_width, m_height, rgba.data, inputTexture); |