xna-4.0


XNA, EmguCV and perfomance issue with webcam


I started working with EmguCV, but I stumble upon a performance issue trying to convert from the grabber's bitmap to a Texture2D
This is my code
private void FrameGrabber()
{
NamePersons.Add("");
currentFrame = grabber.QueryFrame().Resize(320, 240, INTER.CV_INTER_CUBIC);
gray = currentFrame.Convert<Gray, Byte>();
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(face, 1.2, 10, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20));
foreach (MCvAvgComp f in facesDetected[0])
{
t = t + 1;
result = currentFrame.Copy(f.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
currentFrame.Draw(f.rect, new Bgr(System.Drawing.Color.Red), 2);
if (trainingImages.ToArray().Length != 0)
{
MCvTermCriteria termCrit = new MCvTermCriteria(ContTrain, 0.001);
EigenObjectRecognizer recognizer = new EigenObjectRecognizer(trainingImages.ToArray(), labels.ToArray(), 2500, ref termCrit);
name = recognizer.Recognize(result);
currentFrame.Draw(name, ref font, new System.Drawing.Point(f.rect.X - 2, f.rect.Y - 2), new Bgr(System.Drawing.Color.LightGreen));
}
NamePersons[t - 1] = name;
NamePersons.Add("");
}
t = 0;
for (int nnn = 0; nnn < facesDetected[0].Length; nnn++)
names = names + NamePersons[nnn] + ", ";
names = "";
NamePersons.Clear();
Bitmap b = currentFrame.ToBitmap();
//slow
using (MemoryStream s = new MemoryStream())
{
b.Save(s, System.Drawing.Imaging.ImageFormat.Png);
s.Seek(0, SeekOrigin.Begin); //must do this, or error is thrown in next line
frame = Texture2D.FromStream(GraphicsDevice, s);
}
////second option but image is bluish and still slow
//GraphicsDevice.Textures[0] = null;
//if (frame == null || b.Width != frame.Width || b.Height != frame.Height)
// frame = new Texture2D(GraphicsDevice, b.Width, b.Height);
//BitmapData bData = b.LockBits(new System.Drawing.Rectangle(new System.Drawing.Point(), b.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
//int byteCount = bData.Stride * b.Height;
//byte[] bmpBytes = new byte[byteCount];
//Marshal.Copy(bData.Scan0, bmpBytes, 0, byteCount);
//b.UnlockBits(bData);
//frame.SetData(bmpBytes);
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
grabber = new Capture();
}
protected override void UnloadContent()
{
grabber.Dispose();
}
protected override void Update(GameTime gameTime)
{
FrameGrabber();
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.LightGray);
spriteBatch.Begin();
if (frame !=null)
spriteBatch.Draw(frame, new Microsoft.Xna.Framework.Rectangle(0, 0, ScreenWidth, ScreenHeight), Microsoft.Xna.Framework.Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
I searched the web for documentation but with no luck.
Well I solved my problem creating a class that start a parallel thread and handle the frame conversion coming from the webcam.
If anyone is interested, to convert to texture and also handle the face recognition I used this:
private Image<Gray, byte> gray = null;
private HaarCascade haarCascade = new HaarCascade("haarcascade_frontalface_default.xml");
private void QueryFrame()
{
while (is_running)
{
nextFrame = capture.QueryFrame().Flip(FLIP.HORIZONTAL);
if (nextFrame != null)
{
gray = nextFrame.Convert<Gray, Byte>();
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(haarCascade, 1.2, 10, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new System.Drawing.Size(20, 20));
foreach (MCvAvgComp face in facesDetected[0])
nextFrame.Draw(face.rect, new Bgr(System.Drawing.Color.Red), 2);
byte[] bgrData = nextFrame.Bytes;
for (int i = 0; i < colorData.Length; i++)
colorData[i] = new Color(bgrData[3 * i + 2], bgrData[3 * i + 1], bgrData[3 * i]);
}
}
}

Related Links

Vertexbuffer Getdata VertexPositionNormalTexture
Converting from 3.1 to 4.0… gamestates
XNA large coordinates and float precision
Trying to make Gaussian Blur stronger/blurrier - XNA 4.0 HLSL
XNA, EmguCV and perfomance issue with webcam
Does XNA apps run on Windows RT?
How to pass a Texture2D object to Pixel Shader in XNA 4.0?
how to connect windows phone 7 application by using 2 different mobile device?
Adding a game service in XNA 4.0 through vb.net
Can the position of pixel be changed from Pixel Shader in XNA 4.0?
Adding GamerServicesComponent causes ridiculously long program start
Platformer tile engine--advice on what to do with long tiles
XNA Vector2 path contained inside rectangle
XNA changing 200 or so tiles pixels
Loading files during run time in XNA 4.0
Optimized keyboard controls for XNA game

Categories

HOME
netsuite
image-processing
reserved
tesseract
grep
sd-card
q
sqlite-net-extensions
frameworks
ckeditor
serverspec
networkx
row
jplayer
event-handling
tostring
swingx
opencover
pass-by-reference
angular2-aot
vlsi
tooltipster
greendao
social-media
spring-mybatis
jaxb2
windowbuilder
contact-form
scorm2004
catch-all
form-data
cloud-code
ios5
stacked
devextreme
adobe-premiere
qwerty
abstract-class
greenrobot-eventbus
nomethoderror
no-www
flashair
qcombobox
promela
rdfs
svmlight
font-size
dtexec
cudafy.net
chord-diagram
pycaffe
watchconnectivity
static-ip-address
home-directory
url-masking
impresspages
player
master-slave
yaws
freedesktop.org
natvis
iad
sdhc
cyclomatic-complexity
simple-framework
jqgrid-formatter
quicklisp
rgeo
varargs
embedded-code
ideamart
unity3d-gui
truevault
system.reflection
pick
tablelayout
java.util.concurrent
rdl
terminfo
google-reader
jquery-layout
expected-exception
system.net.webexception
undefined-reference
jboss-weld
dir
blending
limejs
typoscript2
rdoc
armcc
javaspaces
objective-c-2.0
ocx
reddot
semantic-diff
pydot
coredump
locate
remember-me
digest-authentication
coda-slider
gamequery
adrotator
zune

Resources

Database Users
RDBMS discuss
Database Dev&Adm
javascript
java
csharp
php
android
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App