如何在EmguCV C#中实时刷新网络摄像机的直方图?

如何在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;

有人能帮我用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;
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;
 }