EmguCV之ImageBox和HistogramBox的使用

EmguCV是可以说是.NET平台下的OpenCV,可以用来进行界面程序开发,提供了ImageBox,HistogramBox,MatrixBox,PanAndZoomPictureBox,这些工具箱对于为视觉应用程序开发提供了很大的便捷性。

经过测试,该产品集成的图像控件确实好用。不过在使用中,发现官方教程和示例程序只给了某些典型应用,关于imageBOX的应用很详细,但是关于histogramBox的应用却没有合适的示例,经过尝试,终于实现了C#下直方图工具盒HistogramBox的使用。

EmguCV的下载安装,系统配置,软件配置就不赘述了,网上一大堆,实践起来也很简单。

程序功能如下图所示,左边显示摄像机图像,右边显示当前图像的直方图:

EmguCV之ImageBox和HistogramBox的使用_第1张图片


程序C#代码如下所示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.Util;


namespace WindowsFormsApplication5
{
    public partial class cameraCapture : Form
    {
        private Capture _capture;
        private bool isCaptureInProgress;
        private Mat frame = new Mat();

        public cameraCapture()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
            CvInvoke.UseOpenCL = false;
            try
            {
                _capture = new Capture();
                _capture.ImageGrabbed += frameProcess;
            }
            catch(NullReferenceException excpt)
            {
                MessageBox.Show(excpt.Message);
            }
        }

        private void frameProcess(object sender, EventArgs arg)
        {
      
            _capture.Retrieve(frame, 0);                         // 摄像机抓取图像

            imageBox_ori.Image = frame;                          // 设置图像显示控件的图像

            histogramBox_hist.ClearHistogram();                  // 直方图控件,清除直方图
            histogramBox_hist.GenerateHistograms(frame, 256);    // 直方图控件,生成当前直方图
            histogramBox_hist.Refresh();                         // 直方图控件,刷新
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (_capture != null)
            {
                if (isCaptureInProgress) // stop capture
                {
                    button_cameraCapture.Text = "start capture";
                    _capture.Pause();
                }
                else if (!isCaptureInProgress) // start capture
                {
                    button_cameraCapture.Text = "stop capture";
                    _capture.Start();
                }
                isCaptureInProgress = !isCaptureInProgress;
            }
        }
    }
}


ImageBox的HistogramBox的使用就设计到以下几行代码,如下所示:

private void frameProcess(object sender, EventArgs arg)
{
      
    _capture.Retrieve(frame, 0);                         // 摄像机抓取图像

    imageBox_ori.Image = frame;                          // 设置图像显示控件的图像

    histogramBox_hist.ClearHistogram();                  // 直方图控件,清除直方图
    histogramBox_hist.GenerateHistograms(frame, 256);    // 直方图控件,生成当前直方图
    histogramBox_hist.Refresh();                         // 直方图控件,刷新
}

也可以改变GenerateHisograms函数里的通道数来改变生成的直方图。

public void GenerateHistograms(
	IImage image,
	int numberOfBins
)
GenerateHisograms函数的第一个参数是输入的图像,第二个参数是直方图bin个数,最大256,设置再多也没意义,最多只有256,以为每个通道值在[0 255]之间。



你可能感兴趣的:(OpenCV)