华为 HMS MLLocalTextAnalyzer with Transactor returns 相机流 (Xamarin) 没有结果
Huawei HMS MLLocalTextAnalyzer with Transactor returns no results from camera stream (Xamarin)
我已将 HMS MLkit 集成到我的 Xamarin.Android 移动应用程序项目中,遵循 https://forums.developer.huawei.com/forumPortal/en/topic/0201466917572130070 中的步骤(“Xamarin ML Kit 设置过程”和“Xamarin 应用程序开发”部分)。然后我开始制作一个 Activity class,它使用 LensEngine 和 MLAnalyzer API 来检测相机流中的文本。这看起来或多或少是这样的:
MLLocalTextSetting textSetting = new MLLocalTextSetting.Factory().SetLanguage("en").SetOCRMode(MLLocalTextSetting.OcrTrackingMode).Create();
var analyzer = MLAnalyzerFactory.Instance.GetLocalTextAnalyzer(textSetting);
analyzer.SetTransactor(new OcrDetector());
_cameraEngine = new LensEngine.Creator(ApplicationContext, analyzer)
.SetLensType(LensEngine.BackLens)
.ApplyDisplayDimension(1280, 720)
.ApplyFps(6.0f)
.EnableAutomaticFocus(true)
.Create();
OcrDetector class 现在看起来像这样:
public class OcrDetector : Java.Lang.Object, MLAnalyzer.IMLTransactor
{
public OcrDetector()
{
}
public void Destroy()
{
}
public void TransactResult(MLAnalyzer.Result results)
{
SparseArray objectSparseArray = results.AnalyseList;
AnalyzeDetections(objectSparseArray);
}
public void AnalyzeDetections(SparseArray detectedItems)
{
// TODO:
}
}
相机似乎 运行 很流畅,但是,我没有从文本分析器中得到任何结果(永远不会调用 TransactResult)。在流式传输期间,控制台重复抛出如下所示的异常:
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): Exception thrown from receiver.
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): java.lang.NullPointerException: *t*e*p* *o*i*v*k* *i*t*a* *e*h*d*'*n*r*i*.*t*l*S*a*s*A*r*y*c*m*h*a*e*.*m*.*l*d*.*e*t*i*t*r*a*.*l*e*t*N*t*v*T*x*A*a*y*e*.*n*l*s*(*o*.*u*w*i*h*s*m*s*k*c*m*o*.*L*r*m*)* *n*a*n*l* *b*e*t*r*f*r*n*e
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): at com.huawei.hms.mlsdk.text.MLTextAnalyzer.analyseFrame(MLTextAnalyzer.java:3)
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): at com.huawei.hms.mlsdk.common.MLAnalyzer.obtainPicture(MLAnalyzer.java:124)
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): at com.huawei.hms.mlsdk.common.LensEngine$LensAnalyzerRunable.run(LensEngine.java:39)
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): at java.lang.Thread.run(Thread.java:929)
02-23 12:02:57.157 E/HaLogProvider(15027): forbiddenHiLog openHa = false
02-23 12:02:57.158 E/HaLogProvider(15027): forbiddenHiLog.getVenderCountry=UNKNOWN
02-23 12:02:57.158 E/HaLogProvider(15027): forbiddenHiLog openHa = false
我不知道这个 NullPointerException 是什么意思。
当我使用不同类型的分析仪时,像这样:
MLObjectAnalyzerSetting setting = new MLObjectAnalyzerSetting.Factory().SetAnalyzerType(MLObjectAnalyzerSetting.TypeVideo)
.AllowMultiResults()
.AllowClassification()
.Create();
var objanalyzer = MLAnalyzerFactory.Instance.GetLocalObjectAnalyzer(setting);
一切正常(也就是说,TransactResult 被调用并且我在控制台中没有发现异常,尽管这种分析器对我的情况没有用)。
如有任何建议,我将不胜感激。
MLLocalTextSetting.Factory().SetLanguage("en").SetOCRMode(MLLocalTextSetting.OcrTrackingMode).Create();
var analyzer = MLAnalyzerFactory.Instance.GetLocalTextAnalyzer(textSetting); ```
尝试将您的代码更改为以下内容
var analyzer = new MLTextAnalyzer.Factory(this)
.SetLanguage("en")
.SetLocalOCRMode(MLLocalTextSetting.OCR_TRACKING_MODE)
.Create();
希望对您有所帮助。 :)
以下是一些尝试解决问题的建议:
- 在代码中,将错误堆栈跟踪中显示的同步调用 MLTextAnalyzer.analyseFrame() 更改为异步调用,请参阅以下文档代码部分中的示例代码 ML Kit-Text Recognition (huawei.com).
Task task = this.analyzer.AnalyseFrameAsync(frame);
await task;
if (task.IsCompleted && task.Result != null)
{
// Analyze success.
var result = task.Result;
}
else
{
// Analyze failure.
}
- 确保使用最新的 Xamarin ML 插件 2.0.5.300 (2020-12-31)。本次升级对减少识别英文和其他语言的延迟有一定的增强。
- HMS ML Kit集成参考以下Xamarin示例代码ML Kit-Xamarin Sample Code (huawei.com).
我已将 HMS MLkit 集成到我的 Xamarin.Android 移动应用程序项目中,遵循 https://forums.developer.huawei.com/forumPortal/en/topic/0201466917572130070 中的步骤(“Xamarin ML Kit 设置过程”和“Xamarin 应用程序开发”部分)。然后我开始制作一个 Activity class,它使用 LensEngine 和 MLAnalyzer API 来检测相机流中的文本。这看起来或多或少是这样的:
MLLocalTextSetting textSetting = new MLLocalTextSetting.Factory().SetLanguage("en").SetOCRMode(MLLocalTextSetting.OcrTrackingMode).Create();
var analyzer = MLAnalyzerFactory.Instance.GetLocalTextAnalyzer(textSetting);
analyzer.SetTransactor(new OcrDetector());
_cameraEngine = new LensEngine.Creator(ApplicationContext, analyzer)
.SetLensType(LensEngine.BackLens)
.ApplyDisplayDimension(1280, 720)
.ApplyFps(6.0f)
.EnableAutomaticFocus(true)
.Create();
OcrDetector class 现在看起来像这样:
public class OcrDetector : Java.Lang.Object, MLAnalyzer.IMLTransactor
{
public OcrDetector()
{
}
public void Destroy()
{
}
public void TransactResult(MLAnalyzer.Result results)
{
SparseArray objectSparseArray = results.AnalyseList;
AnalyzeDetections(objectSparseArray);
}
public void AnalyzeDetections(SparseArray detectedItems)
{
// TODO:
}
}
相机似乎 运行 很流畅,但是,我没有从文本分析器中得到任何结果(永远不会调用 TransactResult)。在流式传输期间,控制台重复抛出如下所示的异常:
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): Exception thrown from receiver.
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): java.lang.NullPointerException: *t*e*p* *o*i*v*k* *i*t*a* *e*h*d*'*n*r*i*.*t*l*S*a*s*A*r*y*c*m*h*a*e*.*m*.*l*d*.*e*t*i*t*r*a*.*l*e*t*N*t*v*T*x*A*a*y*e*.*n*l*s*(*o*.*u*w*i*h*s*m*s*k*c*m*o*.*L*r*m*)* *n*a*n*l* *b*e*t*r*f*r*n*e
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): at com.huawei.hms.mlsdk.text.MLTextAnalyzer.analyseFrame(MLTextAnalyzer.java:3)
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): at com.huawei.hms.mlsdk.common.MLAnalyzer.obtainPicture(MLAnalyzer.java:124)
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): at com.huawei.hms.mlsdk.common.LensEngine$LensAnalyzerRunable.run(LensEngine.java:39)
02-23 12:02:57.154 E/LensAnalyzerRunable(15027): at java.lang.Thread.run(Thread.java:929)
02-23 12:02:57.157 E/HaLogProvider(15027): forbiddenHiLog openHa = false
02-23 12:02:57.158 E/HaLogProvider(15027): forbiddenHiLog.getVenderCountry=UNKNOWN
02-23 12:02:57.158 E/HaLogProvider(15027): forbiddenHiLog openHa = false
我不知道这个 NullPointerException 是什么意思。 当我使用不同类型的分析仪时,像这样:
MLObjectAnalyzerSetting setting = new MLObjectAnalyzerSetting.Factory().SetAnalyzerType(MLObjectAnalyzerSetting.TypeVideo)
.AllowMultiResults()
.AllowClassification()
.Create();
var objanalyzer = MLAnalyzerFactory.Instance.GetLocalObjectAnalyzer(setting);
一切正常(也就是说,TransactResult 被调用并且我在控制台中没有发现异常,尽管这种分析器对我的情况没有用)。
如有任何建议,我将不胜感激。
MLLocalTextSetting.Factory().SetLanguage("en").SetOCRMode(MLLocalTextSetting.OcrTrackingMode).Create(); var analyzer = MLAnalyzerFactory.Instance.GetLocalTextAnalyzer(textSetting); ```
尝试将您的代码更改为以下内容
var analyzer = new MLTextAnalyzer.Factory(this)
.SetLanguage("en")
.SetLocalOCRMode(MLLocalTextSetting.OCR_TRACKING_MODE)
.Create();
希望对您有所帮助。 :)
以下是一些尝试解决问题的建议:
- 在代码中,将错误堆栈跟踪中显示的同步调用 MLTextAnalyzer.analyseFrame() 更改为异步调用,请参阅以下文档代码部分中的示例代码 ML Kit-Text Recognition (huawei.com).
Task task = this.analyzer.AnalyseFrameAsync(frame);
await task; if (task.IsCompleted && task.Result != null) { // Analyze success. var result = task.Result; } else { // Analyze failure. }
- 确保使用最新的 Xamarin ML 插件 2.0.5.300 (2020-12-31)。本次升级对减少识别英文和其他语言的延迟有一定的增强。
- HMS ML Kit集成参考以下Xamarin示例代码ML Kit-Xamarin Sample Code (huawei.com).