Windows Phone 8.1 показывает PreviewFrame и вычисляет среднее значение красных пикселей для каждого кадра
В настоящее время я использую Lumia.Imaging, чтобы получить предварительный просмотр кадра и отобразить его.
Я создаю новый метод "GetPreview()", чтобы пройти через пиксели, найти красный пиксель и затем я хотел бы рассчитать среднее значение красных пикселей для каждого кадра.
Моя проблема в том, что при прохождении пикселя в приложении возникают лаги:(
Как правильно рассчитать среднее значение красных пикселей для каждого кадра без потери производительности?
Дополнительно, как включить Flash light при запуске предварительного просмотра?
private async Task startCameraPreview() { // Create a camera preview image source (from the Lumia Imaging SDK) _cameraPreviewImageSource = new CameraPreviewImageSource(); // Checking id of back camera DeviceInformationCollection devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(Windows.Devices.Enumeration.DeviceClass.VideoCapture); String backCameraId = devices.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back).Id; await _cameraPreviewImageSource.InitializeAsync(backCameraId); // use the back camera var previewProperties = await _cameraPreviewImageSource.StartPreviewAsync(); fps = previewProperties.FrameRate.Numerator/previewProperties.FrameRate.Denominator; _cameraPreviewImageSource.PreviewFrameAvailable += drawPreview; // call the drawPreview method every time a new frame is available // Create a preview bitmap with the correct aspect ratio using the properties object returned when the preview started. var width = 640.0; var height = (width / previewProperties.Width) * previewProperties.Height; var bitmap = new WriteableBitmap((int)width, (int)height); _writeableBitmap = bitmap; // Create a BitmapRenderer to turn the preview Image Source into a bitmap we hold in the PreviewBitmap object _effect = new FilterEffect(_cameraPreviewImageSource); _effect.Filters = new IFilter[0]; // null filter for now _writeableBitmapRenderer = new WriteableBitmapRenderer(_effect, _writeableBitmap); } private async void drawPreview(IImageSize args) { // Prevent multiple rendering attempts at once if (_isRendering == false) { _isRendering = true; await _writeableBitmapRenderer.RenderAsync(); // Render the image (with no filter) // Draw the image onto the previewImage XAML element await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High, () => { getPreview(); previewImage.Source = _writeableBitmap; // previewImage is an image element in MainPage.xaml _writeableBitmap.Invalidate(); // force the PreviewBitmap to redraw }); _isRendering = false; } } private void getPreview() { var pixelBuffer = _writeableBitmap.PixelBuffer; for (uint i = 0; i + 4 < pixelBuffer.Length; i += 4) { var red = pixelBuffer.GetByte(i + 2); } }
1 ответ
Вместо того, чтобы проверять все пиксели после того, как Lumia Imaging SDK обработал изображение, но перед тем, как аннулировать растровое изображение, вы можете:
- Немедленно аннулируйте записываемое растровое изображение, затем выполните шаг анализа в отдельной асинхронной задаче. Это означает, что контент будет отображаться сразу, и ваш анализ будет сделан отдельно. Некоторый псевдокод, основанный на вашем образце:
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High, () => {
var analysisTask = Task.Run(() => getPreview());
previewImage.Source = _writeableBitmap; // previewImage is an image element in MainPage.xaml
_writeableBitmap.Invalidate(); // force the PreviewBitmap to redraw
await analysisTask;
});
Таким образом, задача анализа изображения не блокирует обновление на экране. Конечно, эта опция может оказаться непригодной, если вам нужен результат анализа в самой цепочке рендеринга.
Создайте пользовательский фильтр для анализа, чтобы вы могли воспользоваться преимуществами оптимизированной обработки Lumia Imaging SDK.
Чтобы начать писать собственные фильтры, посмотрите документацию.