EmguCV 一些基本操作
来源:互联网 发布:node会取代php吗 编辑:程序博客网 时间:2024/06/09 22:40
一、先是在程序中图像的导入,我是根据图像路径实现,其中path是string类型,是图像路径。
IntPtr img=CvInvoke.cvLoadImage(path, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
二、图像灰度化处理,先创建一幅尺寸大小为为原图的8位图像GrayImg1:
Rectangle cr = CvInvoke.cvGetImageROI(img1);
int width = cr.Width;
int height = cr.Height;
IntPtr GrayImg1 = CvInvoke.cvCreateImage(cr.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_8U, 1);
现在就能使用cvCvtColor函数实现灰度化:
CvInvoke.cvCvtColor(img1, GrayImg1, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);
三、直方图的创建,并获取数据
int[] hist_size = new int[1] { 256 };//建一个数组来存放直方图数据
IntPtr HistImg=CvInvoke.cvCreateHist(1, hist_size, Emgu.CV.CvEnum.HIST_TYPE.CV_HIST_ARRAY, null, 1);//创建了一个空的直方图
CvInvoke.cvCalcHist(inPtr1, HistImg,false,System.IntPtr.Zero);//计算inPtr1指向图像的数据,并传入Histimg中,其中IntPtr[] inPtr1 = new IntPtr[1] { SubImg}。
现在要获取Histimg中的具体数据:
for (int i = 0; i < 256; i++)
{
temphist[i] = CvInvoke.cvQueryHistValue_1D(histImg, i);
}
这样在数组temphist中保存了直方图数据。
四、对第一步中由cvLoadImage导入的图像进行像素点的操作。由于img 是IntPtr类型无法直接进行操作,所以首先要进行格式的转化,把IntPtr型转换成MIplImage:
Emgu.CV.Structure.MIplImage MIpImg =
(Emgu.CV.Structure.MIplImage)System.Runtime.InteropServices.Marshal.PtrToStructure(img, typeof(Emgu.CV.Structure.MIplImage));
然后再C#中使用unsafe中指针操作:npixel = (int)((byte*)img.imageData + img.widthStep * i)[j];
五、IntPtr Dyncontour = new IntPtr();//存放检测到的图像块的首地址
IntPtr Dynstorage = CvInvoke.cvCreateMemStorage(0);开辟内存区域
int n= CvInvoke.cvFindContours(tempimg, Dynstorage, ref Dyncontour, StructSize.MCvContour, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_CCOMP,Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_NONE, new Point(0, 0));
n表示检测到不为零区域的个数。
六、对第五步检测到的区域绘制轮廓
for(;DyncontourTemp!=null&&DyncontourTemp.Ptr.ToInt32()!=0;DyncontourTemp=DyncontourTemp.HNext)
{
CvInvoke.cvDrawContours(tempContImg, DyncontourTemp,new MCvScalar(255, 255, 255),new MCvScalar(255, 255, 255), 0, 1, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));
}
其中的DyncontourTemp为
Seq<Point> DyncontourTemp1= new Seq<Point>(Dyncontour, null);//方便对IntPtr类型进行操作
Seq<Point> DyncontourTemp=DyncontourTemp1;
七、对第五步检测出的区域的坐标提取,通过cvFindContours函数的调用在 Dyncontour中存放的是不为零区域坐标的值存储在内存中的首地址指针。
seq<Point> DyncontourTemp1= new Seq<Point>(Dyncontour, null); //方便对IntPtr类型进行操作
int total=contourImg.Total;//contourImg包含的元素的总数
int TempX = 0; int TempY = 0;int[,] contourArray = new int[2,total];
//获得轮廓的坐标值
for (int i = 0; i < total;i++ )
{
contourArray[0,i]=contourImg[i].X;
contourArray[1,i]=contourImg[i].Y;
}
- EmguCV 一些基本操作
- Opencv EmguCv 基本识别步骤
- gitlab基本一些基本操作
- EmguCV的一些代码笔记
- sql一些基本操作
- Oracle 一些基本操作
- maven一些基本操作
- maven一些基本操作
- 一些基本sql操作
- oracle 一些基本操作
- kafka一些基本操作
- 数据库一些基本操作
- MySQL:一些基本操作
- FMDatabase一些基本操作
- SQLAlchemy 一些基本操作
- 表格一些基本操作
- hive一些基本操作
- linux一些基本操作记录
- Shell 间接变量问题
- 实施CMMI3有感:CMMI绝对是治疗软件公司特大毒瘤的特效药!
- 155_集合_Collection集合的常用方法详解_03_contains
- Codeforces 793D Presents in Bankopolis DP
- 自定义AlertDialog在android-7.0上距离屏幕边界margin无法消除问题
- EmguCV 一些基本操作
- jq 获取option 选中的各种值
- "解决“就是当做信仰的存在
- 'OSError: .*.so: undefined symbol'
- 线性表—顺序存储结构-顺序表
- hadoop全分布式环境配置-访问slave节点路径不存在问题
- 大数相乘 例 n的阶乘
- 常用转义字符(摘自W3School )
- 反转链表(Java实现)