私の目的:形状認識(画像上に大きな四角形)を行うには、Kinectビデオを使用し、結果をハイライト表示して表示するために矩形を描きます。AFinを使用したKinectビデオのC#画像処理
私が使用テクノ:
- C#のコードは、
- AForge、より具体的にその形状チェッカー魔法がどのように動作するかを
http://www.aforgenet.com/articles/shape_checker/
:
- フレームが、私はバイト配列としてフレームデータを取得し、許可するようにビットマップにそれを変換する準備ができているたびに、私は結果をレンダリング
- は、形状認識アルゴリズム
- を適用し、それを分析する...
私の問題:
全体のプロセスは、これまでに動作しますが、私はそれがひどく遅れWPFイメージで結果をレンダリングしようとすると...(1つのフレームごとに10秒)...
マイコード:
// AllFramesReady is called every time a frame is ready to use...
private void AllFramesReady(object sender, AllFramesReadyEventArgs e)
{
using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
{
if (colorFrame == null)
{
return;
}
_Pixels = new byte[colorFrame.PixelDataLength];
colorFrame.CopyPixelDataTo(_Pixels);
// Analyze the image
int stride = colorFrame.Width * 4;
System.Drawing.Size size = new System.Drawing.Size(colorFrame.Width, colorFrame.Height);
// get the bitmap from bytes
Bitmap btmap = BytesToBmp(_Pixels, size);
//analyze the data...
btmap = _shapeReco.AnalyzeImage(btmap);
// copy the new data back to pixels
_Pixels = BmpToBytes(btmap);
// rendering the analyzed image
imageAnalyzed.Source =
BitmapSource.Create(colorFrame.Width, colorFrame.Height,
96, 96, PixelFormats.Bgr32, null, _Pixels, stride);
}
}
//
// HERE IS MY SHAPE RECOGNIZER THAT IMPLEMENTS THE SHAPE RECOGNITION ALGORITHM
//
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using AForge;
using AForge.Imaging;
using AForge.Math.Geometry;
namespace KinectSetupDev
{
class MyShapeRecognizer
{
private static String TAG = "MyShapeRecognizer";
/***************************************************************************
* VARIABLES *
***************************************************************************/
private SimpleShapeChecker _ShapeChecker;
private Bitmap _Image; // the image to analyze
private Blob[] _Blobs;
private BlobCounter _BlobCounter;
/***************************************************************************
* CONSTRUCTOR *
***************************************************************************/
public MyShapeRecognizer()
{
Debug.Log(TAG, "MyShapeRecognizer");
_ShapeChecker = new SimpleShapeChecker();
_Image = new Bitmap(300, 400);
_Blobs = null;
_BlobCounter = null;
}
/***************************************************************************
* METHODS *
***************************************************************************/
public Bitmap AnalyzeImage(Bitmap image)
{
Debug.Log(TAG, "AnalyzeImage");
this._Image = image;
this.LocatingObjects();
this.AnalyzeObjects();
return _Image;
}
private void LocatingObjects()
{
Debug.Log(TAG, "LocatingObjects");
// lock image
BitmapData bitmapData = _Image.LockBits(
new Rectangle(0, 0, _Image.Width, _Image.Height),
ImageLockMode.ReadOnly, _Image.PixelFormat);
//locating objects
_BlobCounter = new BlobCounter();
_BlobCounter.FilterBlobs = true;
_BlobCounter.MinHeight = 5;
_BlobCounter.MinWidth = 5;
_BlobCounter.ProcessImage(bitmapData);
_Blobs = _BlobCounter.GetObjectsInformation();
// unlock image
_Image.UnlockBits(bitmapData);
}
private void AnalyzeObjects()
{
Debug.Log(TAG, "AnalyzeObjects");
Graphics g = Graphics.FromImage(_Image);
[DRAW RECT OR CIRCLE ON GRAPHICS]
g.Dispose();
}
// Conver list of AForge.NET's points to array of .NET points
private System.Drawing.Point[] ToPointsArray(List<IntPoint> points)
{
System.Drawing.Point[] array = new System.Drawing.Point[points.Count];
for (int i = 0, n = points.Count; i < n; i++)
{
array[i] = new System.Drawing.Point(points[i].X, points[i].Y);
}
return array;
}
}
}
が、私は(... MV C#2010プロジェクト)完全なコードを提供することができます。私は助けていただきありがとうございます!
ありがとうございました。
あなたはそこにひどくやっています。どの回線が最も時間を費やしているかを調べるためにプロファイリングしましたか? – Ani
以下のような画像処理に関連する行:_BlobCounter.ProcessImage(bitmapData); _Blobs = _BlobCounter.GetObjectsInformation(); ....しかし、私は問題を解決します。私は単に画像処理1を3フレーム以上と呼んでいます。これは必要なもの(10fps)で十分で、メインディスプレイはもはや遅れません。 :) –
巨大な領域をコメントアウトする代わりに、 '#region Example Region'を使用して、コード'#endregion'の最後に、最終結果は[this:http://i.imgur。 com/LS18m。png) –