C#调用open cv函数
首先介绍一下自己的情况,2010年的3月份开始接触学习C#编程,之前C#和OpenCV都是零基础,由于全都是自学进度比较慢,中间也走了不少弯路。进过三个月自己的学习与探索,对C#中使用OpenCV也算是有点心得,希望对初学者有所帮助,也希望大牛们进行指点。我使用的编程环境是VS2005,使用的Emgucv 2.1.0.793版本。
1.先是在程序中图像的导入,我是根据图像路径实现,其中path是string类型,是图像路径。
IntPtr img=CvInvoke.cvLoadImage(path, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
2.图像灰度化处理,先创建一幅尺寸大小为为原图的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);
3.直方图的创建,并获取数据
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中保存了直方图数据。
4.对第一步中由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];
5.在二值话的图像,对不为零的区域经行检测。
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表示检测到不为零区域的个数。
6.对第五步检测到的区域绘制轮廓
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;
7.对第五步检测出的区域的坐标提取,通过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;
}
C#调用open cv函数相关推荐
- OpenCV计算机视觉学习(1)——图像基本操作(图像视频读取,ROI区域截取,常用cv函数解释)
人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...
- Go 学习笔记(54)— Go 第三方库之 uber-go/zap/lumberjack(记录日志到文件、支持自动分割日志、支持日志级别、打印调用文件、函数和行号)
1. 简要说明 zap 是 uber 开源的 Go 高性能日志库,支持不同的日志级别, 能够打印基本信息等,但不支持日志的分割,这里我们可以使用 lumberjack 也是 zap 官方推荐用于日志分 ...
- R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能
R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数.交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能 ...
- R语言构建xgboost模型:xgb.cv函数交叉验证确定模型的最优子树个数(可视化交叉验证对数损失函数与xgboost模型子树个数的关系)、交叉验证获取最优子树之后构建最优xgboost模型
R语言构建xgboost模型:xgb.cv函数交叉验证确定模型的最优子树个数(可视化交叉验证对数损失函数与xgboost模型子树个数的关系).交叉验证获取最优子树之后构建最优xgboost模型 目录
- 奇淫怪巧之在Delphi中调用不申明函数
前一阵子,研究了一段时间的Win32Asm,研究到后来发现Win32的ASM实际上还是和C版的介绍的一样.甚至还封装了一个简版的类似VCL库结构框架的32ASM结构库,不过搞着搞着就没兴趣了,也没继续 ...
- PL/SQL -- 动态SQL调用包中函数或过程
动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...
- 寻找调用DebugPort的函数
打开虚拟机,打开一个程序.如 LoadSys.exe 之后本机打开Windbg通过串行端口连接虚拟机. lkd->!process 0 0 LoadSys.exe 得到LoadSys.exe 的 ...
- 【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )
文章目录 一.进程状态 二.进程创建 三.进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一.进程状态 Linux 进 ...
- 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
文章目录 I . 调用 Java 方法流程 II . 获取 jclass 对象 ( GetObjectClass ) III . 获取 jclass 对象 ( FindClass ) IV . JNI ...
最新文章
- 职场观察:高薪需要什么?
- AI一分钟 | 别了老司机!深圳无人驾驶公交车霸气上路;乌镇上演最强饭局,丁磊王兴刘强东大宴宾客
- 《Python程序设计》题库(2)
- 省选前的计划(日更,然而你们天天吊打我)
- python实现双向最大匹配法
- Gumbel-Softmax Trick和Gumbel分布 附VAE讲解
- pl sql 工具insert into 中文 后, select为乱码
- 一个类可以实现多个接口吗_java中接口的概念
- pandas 字符串切片后保存_我擦~字符串转字节切片后,切片的容量竟然千奇百怪...
- Instgram和color,谁会更成功?
- VISIO2016的安装报错
- Xilinx_JESD204B
- NOIP2016 暑期培训 D6
- 计算机常用的颜色英文缩写,计算机用语中常见英文缩写和词组J
- C++ Builder开发AutoCAD应用程序的方法
- 西安交通大学计算机学院保研面试,西安交通大学电子与信息工程学院(专业学位)计算机技术保研细则...
- 脑洞大开的思维工具:PMI
- Android刷机SD卡分区指南 [
- vue 下载文件流和捕获后端返回的状态码和错误信息的方法
- MySQL忘记root密码解决方案