如何在 Viola-Jones 中编写 Parallel ForEach
How to write Parallel ForEach in Viola-Jones
我想通过提取检测到的人脸来加速 Viola-Jones,我使用了这段代码,但是 For Each 语句中的人脸参数有一个错误,你能告诉我如何解决这个错误吗?
错误是
(Error 2 The type arguments for method System.Threading.Tasks.Parallel.ForEach<TSource>(System.Collections.Concurrent.OrderablePartitioner<TSource>, System.Action<TSource,System.Threading.Tasks.ParallelLoopState,long>)
cannot be inferred from the usage. Try specifying the type arguments explicitly.
D:\Hadeel[=12=] thesis\Face recognition\C #\Backup\Viola and Jones Results
2 - Copy\Viola and Jones Results 2\Form1.cs 356 25
Viola and Jones Results 2)
else if (chcParallel.Checked == true)
{//Rectangle face=new Rectangle();
Parallel.ForEach( face, faceObjects =>
{
graphicRect.DrawRectangle(p, face);
face.Inflate(-10, -10);// resize face for crop face without background
Crop crop = new Crop(face);
Bitmap newimage = crop.Apply(image);
// ResizeBicubic resixe = new ResizeBicubic(460, 480);
//newimage = resixe.Apply(newimage);
//pictureBox2.Image = (newimage);
if (chcSkin.Checked == false)
{
facearray[i] = newimage;
pictureBox2.Image = facearray[i];
i = i + 1;
}
else if (chcSkin.Checked == true)
{
f1 = 0; f2 = 0; f3 = 0;
Bitmap imagess = new Bitmap(newimage);
for (int x = 0; x < imagess.Width - 1; x++)
{
for (int y = 0; y < imagess.Height - 1; y++)
{
Color pixelColor = imagess.GetPixel(x, y);
int r = pixelColor.R;
int g = pixelColor.G;
int b = pixelColor.B;
// int f1 = 0;
// int f2 = 0;
// int f3 = 0;
int differenceMinMax = Math.Max(r, Math.Max(g, b)) - Math.Min(r, Math.Min(g, b));
if (r > 95 & g > 40 & b > 20 & differenceMinMax > 15 & r > g & r > b)
{
f1 = f1 + 1;// image.SetPixel(x, y, Color.White);
}
else if (r > 220 & g > 210 & b > 170)
{
f2 = f2 + 1;// imagess.SetPixel(x, y, Color.White);
}
else
{
f3 = f3 + 1;// imagess.SetPixel(x, y, Color.White);
}
}
}
if ((f1 > f2) && (f1 > f3))
{
facearray[i] = newimage;
pictureBox2.Image = facearray[i];
i = i + 1;
}
}
//else
//{ }
});
graphicRect.Dispose();
pictureBox1.Image = image;
}//end if Parallel True
很难确定,但您是否试图将 face
对象标记为 lambda 参数?然后需要切换参数:
// for each of faceObject do
Parallel.ForEach(faceObjects, face =>
{
// your code here
});
我想通过提取检测到的人脸来加速 Viola-Jones,我使用了这段代码,但是 For Each 语句中的人脸参数有一个错误,你能告诉我如何解决这个错误吗? 错误是
(Error 2 The type arguments for method
System.Threading.Tasks.Parallel.ForEach<TSource>(System.Collections.Concurrent.OrderablePartitioner<TSource>, System.Action<TSource,System.Threading.Tasks.ParallelLoopState,long>)
cannot be inferred from the usage. Try specifying the type arguments explicitly.
D:\Hadeel[=12=] thesis\Face recognition\C #\Backup\Viola and Jones Results
2 - Copy\Viola and Jones Results 2\Form1.cs 356 25
Viola and Jones Results 2)
else if (chcParallel.Checked == true)
{//Rectangle face=new Rectangle();
Parallel.ForEach( face, faceObjects =>
{
graphicRect.DrawRectangle(p, face);
face.Inflate(-10, -10);// resize face for crop face without background
Crop crop = new Crop(face);
Bitmap newimage = crop.Apply(image);
// ResizeBicubic resixe = new ResizeBicubic(460, 480);
//newimage = resixe.Apply(newimage);
//pictureBox2.Image = (newimage);
if (chcSkin.Checked == false)
{
facearray[i] = newimage;
pictureBox2.Image = facearray[i];
i = i + 1;
}
else if (chcSkin.Checked == true)
{
f1 = 0; f2 = 0; f3 = 0;
Bitmap imagess = new Bitmap(newimage);
for (int x = 0; x < imagess.Width - 1; x++)
{
for (int y = 0; y < imagess.Height - 1; y++)
{
Color pixelColor = imagess.GetPixel(x, y);
int r = pixelColor.R;
int g = pixelColor.G;
int b = pixelColor.B;
// int f1 = 0;
// int f2 = 0;
// int f3 = 0;
int differenceMinMax = Math.Max(r, Math.Max(g, b)) - Math.Min(r, Math.Min(g, b));
if (r > 95 & g > 40 & b > 20 & differenceMinMax > 15 & r > g & r > b)
{
f1 = f1 + 1;// image.SetPixel(x, y, Color.White);
}
else if (r > 220 & g > 210 & b > 170)
{
f2 = f2 + 1;// imagess.SetPixel(x, y, Color.White);
}
else
{
f3 = f3 + 1;// imagess.SetPixel(x, y, Color.White);
}
}
}
if ((f1 > f2) && (f1 > f3))
{
facearray[i] = newimage;
pictureBox2.Image = facearray[i];
i = i + 1;
}
}
//else
//{ }
});
graphicRect.Dispose();
pictureBox1.Image = image;
}//end if Parallel True
很难确定,但您是否试图将 face
对象标记为 lambda 参数?然后需要切换参数:
// for each of faceObject do
Parallel.ForEach(faceObjects, face =>
{
// your code here
});