windows phone 8.1显示PreviewFrame并计算每帧的红色像素的平均值

时间:2015-07-20 11:56:02

标签: windows-phone-8.1 flashlight lumia-imaging-sdk

目前我正在使用Lumia.Imaging获取预览框并显示它。

我创建新方法“GetPreview()”来查找像素,找到红色像素,而不是我想计算每帧的红色像素的平均值。

我的问题是,当我通过像素时,app中存在滞后:(

  • 在没有性能损失的情况下计算每帧红色像素平均值的正确解决方案是什么?

  • 预览开始时如何开启闪光灯?

        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 个答案:

答案 0 :(得分:0)

在Lumia Imaging SDK处理完图像之后,在您使位图无效之前,您可以检查所有像素,而不是检查所有像素:

  • imidiatelly使可写位图无效,然后在单独的异步任务中执行分析步骤。这意味着内容将立即显示,您的分析将单独完成。基于您的样本的一些伪代码将是:
    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处理。

    开始编写自定义过滤器look at the documentation