EmguCV4.4+VS2019 图像处理(1)

EmguCV4.4+VS2019 图像处理(1)_第1张图片

文章目录

        • Emgu 下载
        • Emgu 配置
        • Emgu 引用类库
        • 0.0.0 Emgu "Hello World"
        • 0.0.1 Emgu 读取、显示、保存图像
        • 0.0.2 主要模块
        • 0.0.3 视频类
        • 0.0.4 Point 、Mat、Size类
        • 0.0.5 绘图
        • 0.0.6 图像像素
          • 0.0.6.1 通过索引直接访问,返回Tcolor类型
          • 0.0.6.2 通过Data索引访问,返回TDepth类型

Emgu 下载

下载链接

Emgu 配置

安装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

Emgu 引用类库

using Emgu.CV;
using Emgu.CV.Util;
using Emgu.Util.TypeEnum;
using Emgu.CV.Structure;

0.0.0 Emgu “Hello World”

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);//按键等待

EmguCV4.4+VS2019 图像处理(1)_第2张图片

0.0.1 Emgu 读取、显示、保存图像

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);//图像保存

0.0.2 主要模块

命名空间 功能
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 包含视频稳定相关的类和函数。

EmguCV4.4+VS2019 图像处理(1)_第3张图片
Emgu CV::Emgu CV Library Documentation

0.0.3 视频类

//
// 摘要:
//     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);

属性
EmguCV4.4+VS2019 图像处理(1)_第4张图片方法
EmguCV4.4+VS2019 图像处理(1)_第5张图片事件
在这里插入图片描述

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。

0.0.4 Point 、Mat、Size类

Point: 命名空间

System.Drawing
//System.Drawing.dll 中

EmguCV4.4+VS2019 图像处理(1)_第6张图片

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 中

EmguCV4.4+VS2019 图像处理(1)_第7张图片

Mat
构造函数:
EmguCV4.4+VS2019 图像处理(1)_第8张图片

 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));

opencv与EmguCv对比
EmguCV4.4+VS2019 图像处理(1)_第9张图片

0.0.5 绘图

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);

0.0.6 图像像素

图像在内存中存储方式

0.0.6.1 通过索引直接访问,返回Tcolor类型
//三通道图像
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);//灰色图像-->白色
       }
   }
}
0.0.6.2 通过Data索引访问,返回TDepth类型
//三通道图像
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;//红色通道
   }
}

坚持每天写一点…
EmguCV4.4+VS2019 图像处理(1)_第10张图片

你可能感兴趣的:(EmguCV,opencv)