windows phone 实现mjpeg流视频的人脸识别

来源:互联网 发布:苗立杰wnba数据 编辑:程序博客网 时间:2024/05/17 20:51

先上图片,看看效果

首先是wp有自带的mjpeg解码功能
能输出WriteableBitmap格式,方便接下来进行图像分析
速度还行,最大也只是100多MS的延迟
接收图像方法

public void recVideo()        {            string sourceURL = "图片流地址";            while (true)            {                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(sourceURL));                req.BeginGetResponse(new AsyncCallback(resResult), req);                //Thread.Sleep(10);            }        }



异步调用方法

      private void resResult(IAsyncResult ir)        {            try            {                HttpWebRequest req = ir.AsyncState as HttpWebRequest;                WebResponse resp = req.EndGetResponse(ir);                Stream stream = resp.GetResponseStream();                Dispatcher.BeginInvoke(() =>                {                    WriteableBitmap myBitmap = PictureDecoder.DecodeJpeg(stream);    这里就是自带的解码方法,一句话就行了,如果只要实现视频输出,下面图像识别就可以删掉了                    image1.Source = myBitmap;                    #region 图像识别                    var w = myBitmap.PixelWidth;                    var h = myBitmap.PixelHeight;                    if (_pixelDataGray == null || _pixelDataGray.Length != h * w)                    {//定义了几个数组                        _pixelDataGray = new byte[w / _downsampleFactor * h / _downsampleFactor];                        _pixelDataDownsampled =                            new byte[w / _downsampleFactor * h / _downsampleFactor];                        _pixelDataGrayInt = new int[w / _downsampleFactor * h / _downsampleFactor];                        _wb = new WriteableBitmap(w / _downsampleFactor, w / _downsampleFactor);                    }//另外写了几个类。Utils 和 FaceDetection,其中FaceDetection的检测算法是跟opencv学的                    Utils.DownSample(myBitmap.Pixels, w, h, ref _pixelDataGrayInt, _downsampleFactor);                    Utils.ARGBToGreyScale(_pixelDataGrayInt, ref _pixelDataGray);                    //_pixelDataGray = e.FrameBuffer;                    Utils.HistogramEqualization(ref _pixelDataGray);                    Utils.GrayToARGB(_pixelDataGray, ref _pixelDataGrayInt);                    List<FaceDetection.Rectangle> faces =                        _detector.getFaces(                        _pixelDataGrayInt,                        w / _downsampleFactor,                        h / _downsampleFactor,                        2f, 1.25f, 0.1f, 1, false, true);                    _pixelDataGrayInt.CopyTo(_wb.Pixels, 0);                    _wb.Invalidate();//image控件上覆盖了个 canvas控件,用来画圆圈                    cnvsFaceRegions.Children.Clear();                    foreach (var r in faces)                    {                        Ellipse el = new Ellipse();                        TranslateTransform loc = new TranslateTransform();                        loc.X = r.X * _downsampleFactor / (double)w * cnvsFaceRegions.Width;                        loc.Y = r.Y * _downsampleFactor / (double)w * cnvsFaceRegions.Height;                        el.RenderTransform = loc;                        el.Width = r.Width * _downsampleFactor *2;                        el.Height = r.Height * _downsampleFactor *2;                        el.Stroke = new SolidColorBrush(Colors.Red);                        cnvsFaceRegions.Children.Add(el);                    }                    #endregion                });            }            catch (Exception ex)            {                Dispatcher.BeginInvoke(() => sysInfo.Text = ex.Message);            }        }


 


相关类:
到我的资源下载

http://download.csdn.net/detail/cooska/4895104

原创粉丝点击