2015-07-20 71 views
1

当前我正在使用Lumia.Imaging获取预览帧并显示它。windows phone 8.1显示PreviewFrame并计算每帧的红色像素的平均值

我创建了新的方法“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); 
        } 
    } 
    

回答

0

相反检查的Lumia成像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成像SDK处理的优势。

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