我正在尝试使用带有自定义相机实例的Google移动视觉API制作一个可以检测面部的相机应用程序,而不是相同的#34; CameraSource"在Google API中我也在处理帧以检测颜色,而且使用Camerasource我不允许获取相机帧。
在搜索此问题后,我发现的唯一结果是将移动视觉与其CameraSource配合使用,而不是使用任何自定义camera1 API。 我试图覆盖帧处理,然后对输出的图片进行检测,如下所示:
angular.module('starter', [
'ionic', 'starter.controllers', 'angular-google-analytics'
])
.run(function($ionicPlatform, $rootScope, Analytics, $location) {
$ionicPlatform.ready(function() {
// [...]
$rootScope.$on('$stateChangeSuccess', function (event) {
console.log('Location changed to ' + $location.path());
Analytics.trackPage($location.path());
});
});
})
.config(function($stateProvider, $urlRouterProvider, AnalyticsProvider) {
AnalyticsProvider
.setAccount('UA-XXXXXXXX-X')
.logAllCalls(true) // Log all outbound calls to an in-memory array accessible via ```Analytics.log``` (default is false). This is useful for troubleshooting and seeing the order of calls with parameters
.useAnalytics(true) // Use ga.js (classic) instead of analytics.js (universal). By default, universal analytics is used, unless this is called with a falsey value.
.setHybridMobileSupport(true) // If set to a truthy value then each account object will disable protocol checking and all injected scripts will use the HTTPS protocol.
.setPageEvent('$stateChangeSuccess') // Change the default page event name. Helpful when using ui-router, which fires $stateChangeSuccess instead of $routeChangeSuccess.
.enterDebugMode(true); //Calling this method will enable debugging mode for Universal Analytics
// Here routing ...
});
那么有什么方法可以将移动视觉与我的相机实例联系起来,以便进行帧处理并用它来检测面部? 你可以看到我到目前为止所做的事情: https://github.com/etman55/FaceDetectionSampleApp
**新更新
找到CameraSource类的开源文件后,我解决了大部分问题,但现在当试图检测到面部时,探测器正确地接收了帧,但它无法检测到任何内容>>你可以在github repo中看到我的最后一次提交。
答案 0 :(得分:3)
我可以为您提供一些非常有用的提示。
为相机提供的每个帧构建一个新的FaceDetector是非常坏主意,也是不必要的。您只需在相机框架接收器外启动一次。
没有必要获取YUV_420_SP(或NV21)帧,然后将其转换为YUV实例,然后将其转换为Bitmap,然后使用Bitmap创建Frame.Builder()。如果您查看Frame.Builder Documentation,您可以看到它直接来自Camera Preview的NV21。 像这样:
@override public void onPreviewFrame(byte[] data, Camera camera) {detector.detect(new Frame.Builder().setImageData(ByteBuffer.wrap(data), previewW, previewH, ImageFormat.NV21));}
答案 1 :(得分:0)
以及Kotin版本:
import com.google.android.gms.vision.Frame as GoogleVisionFrame
import io.fotoapparat.preview.Frame as FotoapparatFrame
fun recogniseFrame(frame: FotoapparatFrame) = detector.detect(buildDetectorFrame(frame))
.asSequence()
.firstOrNull { it.displayValue.isNotEmpty() }
?.displayValue
private fun buildDetectorFrame(frame: FotoapparatFrame) =
GoogleVisionFrame.Builder()
.setRotation(frame.rotation.toGoogleVisionRotation())
.setImageData(
ByteBuffer.wrap(frame.image),
frame.size.width,
frame.size.height,
ImageFormat.NV21
).build()