EmguCV是可以说是.NET平台下的OpenCV,可以用来进行界面程序开发,提供了ImageBox,HistogramBox,MatrixBox,PanAndZoomPictureBox,这些工具箱对于为视觉应用程序开发提供了很大的便捷性。
经过测试,该产品集成的图像控件确实好用。不过在使用中,发现官方教程和示例程序只给了某些典型应用,关于imageBOX的应用很详细,但是关于histogramBox的应用却没有合适的示例,经过尝试,终于实现了C#下直方图工具盒HistogramBox的使用。
EmguCV的下载安装,系统配置,软件配置就不赘述了,网上一大堆,实践起来也很简单。
程序功能如下图所示,左边显示摄像机图像,右边显示当前图像的直方图:
程序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;
}
}
}
}
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]之间。