如何在EmguCV C#中实时刷新网络摄像机的直方图?
有人能帮我用EmguCv C#从网络摄像机实时刷新直方图框中的直方图吗 这是我得到的片段,但当我在webcamera捕获方法中包含该对话框时,该对话框将刷新为空白,而不是更新如何在EmguCV C#中实时刷新网络摄像机的直方图?,c#,emgucv,C#,Emgucv,有人能帮我用EmguCv C#从网络摄像机实时刷新直方图框中的直方图吗 这是我得到的片段,但当我在webcamera捕获方法中包含该对话框时,该对话框将刷新为空白,而不是更新 使用System.Windows.Forms; 使用Emgu.CV; 使用Emgu.CV.CvEnum; 使用Emgu.CV.Structure; 使用Emgu.CV.UI; 名称空间Redcolor\u tracker\u GUI { 公共部分类Form1:Form { Capture capWebcam=null;
使用System.Windows.Forms;
使用Emgu.CV;
使用Emgu.CV.CvEnum;
使用Emgu.CV.Structure;
使用Emgu.CV.UI;
名称空间Redcolor\u tracker\u GUI
{
公共部分类Form1:Form
{
Capture capWebcam=null;
bool-inProcess=false;
图像img;
影像学表现;
HistogramBox hb=新的HistogramBox();
bool-toggle=false;
表格frm=新表格();
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
尝试
{
capWebcam=新捕获();
}
捕获(NullReferenceException除外)
{
txtxydradius.Text=except.Message;
返回;
}
Application.Idle+=processFrameGUI;
inProcess=true;
}
私有void Form1\u FormClosed(对象发送方,FormClosedEventArgs e)
{
如果(网络摄像头!=null)
{
capWebcam.Dispose();
}
}
void processFrameGUI(对象发送方、事件参数srg)
{
img=capWebcam.QueryFrame();
if(img==null)返回;
imgout=img.InRange(新Bgr(0,0,0),新Bgr(0,0,0));
imgout=imgout.SmoothGaussian(9);
如果(切换)
{
血红蛋白生成直方图(img,256);
hb.Refresh();//显示256个阴影
hb.Enabled=true;
}
ibOriginal.Image=img;
ibProcessed.Image=imgout;
}
私有void btnPauseOResume\u单击(对象发送者,事件参数e)
{
if(inProcess==true)
{
Application.Idle-=processFrameGUI;
inProcess=false;
btnPauseOrResume.Text=“恢复”;
}
其他的
{
Application.Idle+=processFrameGUI;
inProcess=true;
btnPauseOrResume.Text=“恢复”;
}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
如果(切换==false)
{
切换=真;
}
其他的
{
切换=假;
}
hb.Size=新系统图纸尺寸(400400);
frm.对照品添加(hb);
frm.ShowDialog();
}
}
}
完整代码******************
谢谢您可以在一个单独的工作线程中更新
historogrambox
控件,方法是在定义的时间间隔内调用其Refresh
方法(例如,使用计时器)。请注意,您应该通过引用UI线程的SyncContext将刷新调用封送到UI线程中
示例:
//Runs on a worker Thread
this.Invoke((MethodInvoker)delegate {
hb.Refresh();; // Runs on UI thread
});
尝试调用
ClearHistogram()
内部processFrameGUI(对象发送器,EventArgs srg)
:
你能给我们看看你的刷新循环吗,例如,获取相机图像并创建直方图的循环?我添加了它如何刷新直方图的图像。它只是将一个图像堆叠在另一个图像之下。它发生得如此之快,以至于我无法截屏。@AbbondanzaI的意思是,您需要提供从相机获取图像的代码片段,并用它更新直方图。一定有一个循环在这样做。请给我们看看这个环。我怀疑您在这个循环中调用了
frm.Controls.Add(hb)
,这意味着您正在向控件
的每个渲染周期添加相同的(甚至可能是新的)Historogrambox
。我已经添加了整个代码。另外,请您帮助我如何从直方图中提取值。
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.UI;
namespace Redcolor_tracker_GUI
{
public partial class Form1 : Form
{
Capture capWebcam = null;
bool inProcess = false;
Image<Bgr, Byte> img;
Image<Gray, Byte> imgout;
HistogramBox hb = new HistogramBox();
bool toggle = false;
Form frm = new Form();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
capWebcam = new Capture();
}
catch (NullReferenceException except)
{
txtXYRadius.Text = except.Message;
return;
}
Application.Idle += processFrameGUI;
inProcess = true;
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (capWebcam != null)
{
capWebcam.Dispose();
}
}
void processFrameGUI(object sender,EventArgs srg)
{
img=capWebcam.QueryFrame();
if(img==null) return;
imgout=img.InRange(new Bgr(0,0,0),new Bgr(0,0,0));
imgout=imgout.SmoothGaussian(9);
if (toggle)
{
hb.GenerateHistograms(img, 256);
hb.Refresh();// show 256 shades
hb.Enabled = true;
}
ibOriginal.Image=img;
ibProcessed.Image=imgout;
}
private void btnPauseOResume_Click(object sender, EventArgs e)
{
if (inProcess == true)
{
Application.Idle -= processFrameGUI;
inProcess = false;
btnPauseOrResume.Text = "resume";
}
else
{
Application.Idle += processFrameGUI;
inProcess = true;
btnPauseOrResume.Text = "resume";
}
}
private void button1_Click(object sender, EventArgs e)
{
if (toggle == false)
{
toggle = true;
}
else
{
toggle = false;
}
hb.Size = new System.Drawing.Size(400, 400);
frm.Controls.Add(hb);
frm.ShowDialog();
}
}
}
//Runs on a worker Thread
this.Invoke((MethodInvoker)delegate {
hb.Refresh();; // Runs on UI thread
});
void processFrameGUI(object sender,EventArgs srg)
{
img=capWebcam.QueryFrame();
if(img==null) return;
imgout=img.InRange(new Bgr(0,0,0),new Bgr(0,0,0));
imgout=imgout.SmoothGaussian(9);
if (toggle)
{
// Note the following line:
hb.ClearHistogram();
hb.GenerateHistograms(img, 256);
hb.Refresh();// show 256 shades
hb.Enabled = true;
}
ibOriginal.Image=img;
ibProcessed.Image=imgout;
}