下载链接
安装EmguCV4.2版本配置环境变量(在系统高级设置里面的PATH变量)
控制面板–>系统和安全–>系统–>高级系统设置–>高级–>环境变量–>系统变量–>PATH添加
D:\Emgu\emgucv4.2\bin;
D:\Emgu\emgucv4.2\libs\x86;
D:\Emgu\emgucv4.2\libs\x64;
安装EmguCV4.4版本
D:\EmguCV4.4\libs
//如果出现错误不存在cvextern.dll模块,参考0.0.2
using Emgu.CV;
using Emgu.CV.Util;
using Emgu.Util.TypeEnum;
using Emgu.CV.Structure;
string _winName = "Test Windows";// 窗体名字
CvInvoke.NamedWindow(_winName);
Mat image = new Mat(200,400,Emgu.CV.CvEnum.DepthType.Cv8U,3);//3通道图像
MCvScalar _Fontcolor = new Bgr(0,0,255).MCvScalar;// 字体颜色
MCvScalar _Imagecolor = new Bgr(0,255,0).MCvScalar;// 字体颜色
image.SetTo(_Imagecolor);//图像颜色
System.Drawing.Point _point = new System.Drawing.Point(10, 80);//字体位置
CvInvoke.PutText(image,"Hello World",_point,Emgu.CV.CvEnum.FontFace.HersheyComplex,1.0,_Fontcolor );
CvInvoke.Imshow(_winName,image);
CvInvoke.WaitKey(0);//按键等待
Mat image = CvInvoke.Imread("lena.png", Emgu.CV.CvEnum.ImreadModes.AnyColor);//读取图像
if (image.IsEmpty)
{
return;
}
int _imageWidth = image.Cols;//图像宽度
int _imageHeight = image.Rows;//高度
int _imageChannel = image.NumberOfChannels;//通道数
Mat gray_image = new Mat();
CvInvoke.CvtColor(image, gray_image, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);//图像转换
CvInvoke.Imwrite("save.jpg", image);//图像保存
命名空间 | 功能 |
---|---|
Emgu.CV | OpenCV图像处理功能的包装,包括cv::String的包装器CvString类 ,基本图像处理函数CvInvoke类,相机响应校准CalibrateCRF类等。 |
mgu.CV.CvInvoke | 该模块包括了基本的图像处理函数,像图像的读写、滤波、数学运算、颜色空间转换、形态学处理、仿射变换以及像素、对轮廓的操作等。 |
Emgu.CV.UI | 用于显示Image对象的用户界面(ImageBox)。 |
Emgu.CV.Structure | 该模块是OpenCV结构体的包装。相关的结构体诸如定义颜色相关的BGR、Gray、RGBA、LUV等;定义形状的CircleF、Ellipse、Cuboid等; |
Emgu.CV.Util | Emgu.CV项目使用的一组实用程序,像各种类型(int、CvString、Mat、Point、Rect等)的C ++标准向量的包装类等。 |
Emgu.CV.Shape | 该模块包含了形状距离的算法,可用于形状匹配检索和形状比较。 |
Emgu.CV.Features2D | 该模块包含用于2D特征检测、提取和匹配的类。提供了KAZE、AKAZE、SIFT、SURF、Brisk、ORB等特征点。 |
Emgu.CV.Stitching | 该模块包含图像拼接相关的类。 |
Emgu.CV.CvEnum | 该模块包含了各种常用的OpenCV枚举,像字体类型、窗口类型、插值类型、阈值类型、PCA类型、轮廓近似类型、距离变换类型等等。 |
Emgu.CV.ML | 该模块是OpenCV机器学习库的包装,包括ANN、DTrees、SVM、RTrees、EM算法等常用的机器学习模型。 |
Emgu.CV.ML.MlEnum | 该模块是OpenCV机器学习枚举,包括变量类型、Boost类型、Boost分裂标准等机器学习枚举。 |
Emgu.CV.Face | 该模块包含人脸识别相关的类和结构体。 |
Emgu.CV.Cuda | 包含了NVidia Cuda图像处理相关的函数。 |
Emgu.CV.BgSegm | 背景分割先关的类,提供了基于GMG、MOG的两种分割方法。 |
Emgu.CV.OCR | 光学字符识别,包括tesseract-ocr引擎。 |
Emgu.CV.Text | 包括自然场景图像中的文本检测和识别算法。 |
Emgu.CV.VideoStab | 包含视频稳定相关的类和函数。 |
Emgu CV::Emgu CV Library Documentation
//
// 摘要:
// Create a capture using the specific camera
//
// 参数:
// camIndex:
// The index of the camera to create capture from, starting from 0
//
// captureApi:
// The preferred Capture API backends to use. Can be used to enforce a specific
// reader implementation if multiple are available.
public VideoCapture(int camIndex = 0, API captureApi = API.Any);
//
// 摘要:
// Create a capture from file or a video stream
//
// 参数:
// fileName:
// The name of a file, or an url pointed to a stream.
//
// captureApi:
// The preferred Capture API backends to use. Can be used to enforce a specific
// reader implementation if multiple are available.
public VideoCapture(string fileName, API captureApi = API.Any);
VideoCapture video = new VideoCapture(0);//打开摄像头
Mat _imageGray = new Mat();
if (!video.IsOpened)//判断
{
MessageBox.Show("Open video failed..");
return;
}
Mat frame = new Mat();
while (true)
{
video.Read(frame);//取帧
if (frame.IsEmpty)
{
return;
}
CvInvoke.CvtColor(frame,_imageGray,Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
Bitmap pic1 = frame.ToBitmap();
Bitmap pic2 = _imageGray.ToBitmap();
pictureBox1.Image = pic1;
pictureBox2.Image = pic2;
if (CvInvoke.WaitKey(30)==27)
{
return;
}
}
问题:打开工程文件时,使用Emgu CV提示“cvextern”: 找不到指定的程序模块。
解决办法:将./Emgu/libs/x86或者./Emgu/libs/x64下cvextern.dll复制到工程文件./bin/x86/Debug或者./bin/x86/Release或者./bin/x64/Debug或者./bin/x64/Release。
Point: 命名空间
System.Drawing
//System.Drawing.dll 中
Point p0 = new Point(100,200)
Point p1 = new Point();
p1.X = p0.X+10;
p1.Y = p0.Y+10;
Size
System.Drawing
//System.Drawing.dll 中
1. Mat img = new Mat();
2. Mat img = new Mat("1.jpg");
3. Mat img = CvInvoke.Imread("1.jpg");
4. Mat img = CvInvoke.Imread("1.jpg");
Mat roi = new Mat(img, new Rectangle(10, 10, 100, 100));
5. Mat img = new Mat(new Size(300, 100), DepthType.Cv8U, 3);
img.SetTo(new MCvScalar(0, 255, 0));
6. Mat img = new Mat(100, 300, DepthType.Cv8U, 3);
img.SetTo(new MCvScalar(0, 255, 0));
public static void Line(IInputOutputArray img, Point pt1, Point pt2, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);
public static void Rectangle(IInputOutputArray img, Rectangle rect, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);
public static void Circle(IInputOutputArray img, Point center, int radius, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);
public static void Ellipse(IInputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);
public static void PutText(IInputOutputArray img, string text, Point org, FontFace fontFace, double fontScale, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, bool bottomLeftOrigin = false);
CvInvoke.Line(image,p,p1,new Bgr(0,255,0).MCvScalar);
CvInvoke.Rectangle(image,new Rectangle(10,10,100,150), new Bgr(0, 255, 0).MCvScalar);
CvInvoke.Circle(image,new Point(100,100),100, new Bgr(0, 255, 0).MCvScalar);
CvInvoke.PutText(image, "Hello world...", new Point(100, 100), FontFace.HersheyComplex, 2, new Bgr(0, 255, 0).MCvScalar);
图像在内存中存储方式
//三通道图像
Image<Bgr, Byte> img = new Image<Bgr, byte>("lena.png");
Bgr color = img[100,200]; //访问像素点的颜色
img[100,200] = new Bgr(0,0,255);//设置该像素点的颜色
//灰度图像
Image<Gray, Byte> img = new Image<Gray, byte>("lena.png");
Gray color = img[100,200]; //访问像素点的颜色
img[100,200] = new Gray(125);//设置该像素点的颜色
//
Image<Bgr, Byte> img = new Image<Bgr, byte>("lena.png");
for (int i = 0; i < img.Rows; i++)
{
for (int j = 0; j< img.Cols;j++)
{
if (i==j)
{
img[i, j] = new Bgr(0,0,255);//三通道颜色-->红色
//img[i, j] = new Gray(255);//灰色图像-->白色
}
}
}
//三通道图像
Image<Bgr,Byte> img = new Image<Bgr,Byte>("lena.png");
Byte BlueVal = img.Data[100,100,0];//读取Blue通道像素值
Byte GreenVal = img.Data[100,100,1];//读取Green通道像素值
Byte RedVal = img.Data[100,100,2];//读取Red通道像素值
img.Data[100,100,0] = 255;//Blue通道像素赋值
img.Data[100,100,1] = 255;//Green通道像素赋值
img.Data[100,100,2] = 255;//Red通道像素赋值
//灰度图像
Image<Gray,Byte> img = new Image<Gray,Byte>("lena.png");
Byte grayVal = img.Data[100,100,0];//读取像素值
img.Data[100,100,0] = 255;//像素赋值
Image<Bgr, Byte> img = new Image<Bgr, byte>("lena.png");
for (int i = 0; i < img.Rows; i++)
{
for (int j = 0; j< img.Cols;j++)
{
img.Data[i,j,0] = 255;//Blue通道
img.Data[i,j,1] = 0;//Green通道
img.Data[i,j,2] = 255;//红色通道
}
}