C# 使用EmguCv HaarCascade测量特定车身零件
我正试图开发一个程序来测量用户的肩膀宽度,我遇到了很多问题,我不知道如何解决C# 使用EmguCv HaarCascade测量特定车身零件,c#,winforms,emgucv,C#,Winforms,Emgucv,我正试图开发一个程序来测量用户的肩膀宽度,我遇到了很多问题,我不知道如何解决 当我使用笔记本电脑的网络摄像头拍摄用户的全身照片时,系统给出的测量结果不正确 我试着用相同的距离拍摄同一用户的3张照片,等等。但当我开始测量时,测量结果不一致 这是我的密码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using S
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.Util;
namespace fitting
{
public partial class Form1 : Form
{
HaarCascade UpperBody = new HaarCascade("haarcascade_mcs_upperbody.xml");
HaarCascade LowerBody = new HaarCascade("haarcascade_lowerbody.xml");
Capture camera;
bool captureProcess = false;
Image<Bgr, Byte> img;
public Form1()
{
InitializeComponent();
}
void viewImage(object sender, EventArgs e)
{
img = camera.QueryFrame();
if (img == null)
return;
CamImageBox.Image = img;
}
private void btnCapture_Click(object sender, EventArgs e)
{
if (captureProcess == true)
{
string data;
Application.Idle -= viewImage;
captureProcess = false;
SaveFileDialog dlg = new SaveFileDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
img.ToBitmap().Save(dlg.FileName + ".bmp", System.Drawing.Imaging.ImageFormat.Bmp);
data = dlg.FileName + ".bmp";
}
measureImage();
}
}
void measureImage()
{
OpenFileDialog dlg2 = new OpenFileDialog();
dlg2.Filter = "Image|*.Bmp";
if (dlg2.ShowDialog() == DialogResult.OK)
{
Image<Bgr, Byte> frame = new Image<Bgr, byte>(dlg2.FileName);
Image<Gray, Byte> Gray_Frame = frame.Convert<Gray, Byte>();
/////////////////////////LOWER BODY DETECTION////////////////////////////////
MCvAvgComp[][] LowerBodyDetect = Gray_Frame.DetectHaarCascade(
LowerBody,
1.985603925968,
0,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size());
///////////////////HERE IS THE UPPER BODY DETECTION/////////////////////////
MCvAvgComp[][] UpperBodyDetect = Gray_Frame.DetectHaarCascade(
UpperBody,
1.3,
5,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size());
/////////////////////////DRAWING OF RECTANGLE ON DETECTED UPPER BODY///////////////////
try
{
frame.Draw(UpperBodyDetect[0][0].rect, new Bgr(Color.Red), 2);
double width = (UpperBodyDetect[0][0].rect.Width);
textBox1.Text = (Convert.ToString(width));
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
///////////////////////DRAWING OF RECTANGLE ON DETECTED LOWER BODY///////////////////
try
{
frame.Draw(LowerBodyDetect[0][0].rect, new Bgr(Color.Green), 2);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
CamImageBox.Image = frame;
}
}
private void Form1_Load(object sender, EventArgs e)
{
bool useCam = true;
if (!useCam)
measureImage();
else {
try
{
camera = new Capture();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
return;
}
Application.Idle += viewImage;
captureProcess = true;
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用Emgu.CV;
使用Emgu.CV.Structure;
使用Emgu.Util;
名称空间拟合
{
公共部分类Form1:Form
{
HaarCascade UpperBody=新的HaarCascade(“HaarCascade_mcs_UpperBody.xml”);
HaarCascade LowerBody=新的HaarCascade(“HaarCascade_LowerBody.xml”);
摄像机;
bool captureProcess=false;
图像img;
公共表格1()
{
初始化组件();
}
void viewImage(对象发送方,事件参数e)
{
img=camera.QueryFrame();
如果(img==null)
返回;
CamImageBox.Image=img;
}
私有void btnCapture_单击(对象发送者,事件参数e)
{
如果(captureProcess==true)
{
字符串数据;
Application.Idle-=viewImage;
captureProcess=false;
SaveFileDialog dlg=新建SaveFileDialog();
if(dlg.ShowDialog()==DialogResult.OK)
{
img.ToBitmap().Save(dlg.FileName+“.bmp”,System.Drawing.Imaging.ImageFormat.bmp);
数据=dlg.FileName+“.bmp”;
}
measuremage();
}
}
void measuremage()
{
OpenFileDialog dlg2=新建OpenFileDialog();
dlg2.Filter=“Image |*.Bmp”;
if(dlg2.ShowDialog()==DialogResult.OK)
{
图像帧=新图像(dlg2.FileName);
Image Gray_Frame=Frame.Convert();
/////////////////////////下半身检测////////////////////////////////
MCvAvgComp[]]LowerBodyDetect=灰色\u帧。DetectHarcascade(
下体,
1.985603925968,
0,
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_prunting,
新尺寸());
///////////////////这是上身检测/////////////////////////
MCvAvgComp[][]上部车身检测=灰色(帧)。检测ARCASCADE(
上身,
1.3,
5.
Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_prunting,
新尺寸());
/////////////////////////在检测到的上半身上绘制矩形///////////////////
尝试
{
frame.Draw(UpperBodyDetect[0][0].rect,新Bgr(Color.Red),2);
double width=(UpperBodyDetect[0][0]。矩形宽度);
textBox1.Text=(Convert.ToString(宽度));
}
捕获(例外e)
{
MessageBox.Show(e.Message);
}
///////////////////////在检测到的下半身上绘制矩形///////////////////
尝试
{
frame.Draw(LowerBodyDetect[0][0].rect,新Bgr(Color.Green),2);
}
捕获(例外e)
{
MessageBox.Show(e.Message);
}
CamImageBox.Image=帧;
}
}
私有void Form1\u加载(对象发送方、事件参数e)
{
bool-useCam=true;
如果(!useCam)
measuremage();
否则{
尝试
{
照相机=新捕获();
}
捕获(异常exc)
{
MessageBox.Show(exc.Message);
返回;
}
Application.Idle+=viewImage;
captureProcess=true;
}
}
}
}