欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Emgucv使用中常用函数总结

程序员文章站 2022-06-19 12:32:13
收集的Emgucv的整理书籍资料和Emgucv动态调试器:下载地址 本文代码下载:下载 ......
emgucv常用函数总结:
读取图片
mat scr = new mat(form1.path, emgu.cv.cvenum.loadimagetype.anycolor);
//根据路径创建指定的灰度图片
mat scr = new mat(form1.path, emgu.cv.cvenum.loadimagetype.grayscale);
获取灰度    //图像类型转换, bgr 转成 gray 类型。mat bw = new mat
cvinvoke.cvtcolor(scr, bw, emgu.cv.cvenum.colorconversion.bgr2gray);
//相当于二值化图 --黑白 根据大小10判断为0还是255
cvinvoke.threshold(bw,bw,10,255,emgu.cv.cvenum.thresholdtype.binaryinv);
//获取指定区域图片 scr为mat类型
rectangle rectangle = new rectangle(10,10,10,10);
scr = scr.toimage<bgr, byte>().getsubrect(rectangle).mat;
//将mat类型转换为image类型
image<bgr, byte> su = scr.toimage<bgr, byte>();
image<bgr, byte> img = new image<bgr, byte>(new bitmap(""));//路径声明
image<bgr, byte> sub = scr.toimage<bgr, byte>().getsubrect(rectangle);//指定范围
//指定参数获得结构元素
mat struct_element = cvinvoke.getstructuringelement(emgu.cv.cvenum.elementshape.cross, new size(3, 3), new point(-1, -1));
//膨胀
cvinvoke.dilate(bw, bw, struct_element, new point(1,1),3,emgu.cv.cvenum.bordertype.default, new mcvscalar(0, 0, 0));
//腐蚀 当struct_element模型创建不合理或者膨胀腐蚀次数较大时可能图像会发生偏移
cvinvoke.erode(bw, bw, struct_element, new point(-1, -1), 3,emgu.cv.cvenum.bordertype.default, new mcvscalar(0, 0, 0));
//轮廓提取
vectorofvectorofpoint contours = new vectorofvectorofpoint();
//筛选后
cvinvoke.findcontours(bw, contours, null, emgu.cv.cvenum.retrtype.list, emgu.cv.cvenum.chainapproxmethod.chainapproxsimple);
int ksize = contours.size;//获取连通区域的个数。     
vectorofpoint contour = contours[i];//获取独立的连通轮廓   
rectangle rect = cvinvoke.boundingrectangle(contour);//提取最外部矩形。
double length = cvinvoke.arclength(contour, false);//计算连通轮廓的周长。
//画出轮廓
mat mask = bw.toimage<bgr, byte>().copyblank().mat;
//获取一张背景为黑色的图像, 大小与 scr 的大小一样, 类型为 bgr。
cvinvoke.drawcontours(mask, contours, -1, new mcvscalar(0, 0, 255));
image<ycc, byte> ycc_img = bgr_img.convert<ycc, byte>();//把 bgr颜色图片转成ycbcr类型。
ycc min = new ycc(152, 38, 118);//最小值的颜色。
ycc max = new ycc(94, 43, 118);//最大值得颜色。
image<gray, byte> result = ycc_img.inrange(min, max);//进行颜色提取。
image<bgr, byte> bgr_img = ma.toimage<bgr, byte>();//载入一张 bgr 类型的图片。
bgr min = new bgr(255, 255, 255);//白色的最小值, 允许一定154的误差。
bgr max = new bgr(255, 255, 255);//白色的最大值, 允许一定的误差。
image<gray, byte> result = bgr_img.inrange(min, max);//进行颜色提取。
image<bgr, byte> imagesource = new image<bgr, byte>(scr.bitmap);
image<hsv, byte> imagehsv = imagesource.convert<hsv, byte>();//将色彩空间从bgr转换到hsv
image<gray, byte>[] imageshsv = imagehsv.split();//分解成h、s、v三部分
cvinvoke.absdiff(ma1, ma2, ma); // 返回两幅图片或此图与某个yanse像素的差的绝对值的图片
cvinvoke.add(ma1, ma2, ma); // 返回这张图片与图片或颜色直接相加的图片(矩阵加法)  (适应两种效果)
//cvinvoke.hconcat(ma1, ma2, ma); //返回与另一张图片横向链接的图片
//cvinvoke.vconcat(ma1, ma2, ma);//返回与另一张图片纵向链接的图片

//清除小于平均顶点10的二值图
point[] po = { new point(0, 0), new point(res.width, 0), new point(res.width, minavg - gets.fges[1] + 52), new point(0, minavg - gets.fges[1] + 52) };
vectorofpoint vp = new vectorofpoint(po);
//cvinvoke.drawcontours(res, vp, -1, new mcvscalar(0, 0, 255));
cvinvoke.fillconvexpoly(res,vp,new mcvscalar(0),linetype.eightconnected);//填充指定区域

/// <summary>
/// 灰度直方图计算  手动计算、/获取百分比的阀值  0.95
/// </summary>
public static void getdensehistogram95(ref int huidu, mat ma)
{
            densehistogram dense = new densehistogram(256, new rangef(0, 255));
            dense.calculate(new image<gray, byte>[] { ma.toimage<gray, byte>() }, true, null);
            //计算直方图数据。
            float[] data = dense.getbinvalues();
            float[] data2 = dense.getbinvalues();
            //获得直方图数据。
            /*** 进行数据归一化到[0,256]区域内并且绘制直方图***/
            float max = data[0]; //最大值
            for (int j = 1; j < data.length; j++)
            {
                if (data[j] > max)
                {
                    max = data[j];
                }
            }
            float sum = data2.tolist().sum();
            float flocount = 0;
            for (int k = 0; k < data.length; k++)
            {
                data[k] = data[k] * 256 / max;
                flocount += data2[k];
                if (flocount / sum >= 0.95)
                {
                    huidu = k;
                    break;
                }
            }}

//各种颜色空间 hsv/rgb/hls/xyz/ycc/gray
public static image<hsv, byte> imagehsv=new image<hsv, byte>(mat.bitmap);
public static image<rgb, byte> rgbimg = new image<rgb, byte>(mat.bitmap);
public static image<hls, byte> hlsimg = new image<hls, byte>(mat.bitmap);
public static image<xyz, byte> xyzimg = new image<xyz, byte>(mat.bitmap);
public static image<ycc, byte> yccimg = new image<ycc, byte>(mat.bitmap);
public static image<gray, byte> grayimg = new image<gray, byte>(mat.bitmap);
image<gray, byte>[] imageshsvs = imagehsv.split();//分解成h、s、v三部分其他相同
//高斯滤波实现
cvinvoke.gaussianblur(ma, ma, new size(5, 5), 4);
//形态学闭运算,先膨胀后腐蚀  others.matwithphi(by)自定义模型
cvinvoke.morphologyex(ma, ma, emgu.cv.cvenum.morphop.close, others.matwithphi(by), new point(-1, -1), 3, emgu.cv.cvenum.bordertype.default, new mcvscalar(0, 0, 0));
cvinvoke.medianblur(ma, ma, 5);//中值滤波实现
cvinvoke.puttext(ma05, "g num: 1", new point(10, 100), fontface.hersheycomplex, 0.5, new mcvscalar(255)); //指定坐标(10, 100)显示文字,中文乱码,
vectorofpoint vp = new vectorofpoint();
cvinvoke.convexhull(pointof, vp);////查找最小外接矩形cvinpaint
double dou = cvinvoke.contourarea(vp, false);  //计算面积
vectorofpoint vect = new vectorofpoint();
cvinvoke.findnonzero(ma, vect); //获取非0的点
mat masave1 = ma5.clone();//备份 保留原有图片
cvinvoke.adaptivethreshold(ma, mas, 255, adaptivethresholdtype.gaussianc, emgu.cv.cvenum.thresholdtype.binary, 3, 0);//查找最适合二值图

收集的emgucv的整理书籍资料和emgucv动态调试器

本文代码下载:下载