用vc++实现连通区域标记

合集下载

多对象特征提取和优化神经网络的玉米种子品种识别解析

多对象特征提取和优化神经网络的玉米种子品种识别解析

第26卷第6期农业工程学报V ol.26No.62010年6月Transactions of the CSAE Jun. 2010199多对象特征提取和优化神经网络的玉米种子品种识别王玉亮1,刘贤喜2※,苏庆堂3,王朝娜2(1.南京航空航天大学机电学院,南京210016;2.山东农业大学机械与电子工程学院,泰安271018;3.鲁东大学现代教育技术教学部,烟台264025)摘要:为了实现机器视觉代替人的视觉,对玉米种子品种进行实时、客观、准确和无损伤识别,研制了玉米品种识别硬件系统和软件系统。

针对玉米种子及种子图像的特点,对玉米种子品种识别技术与算法进行了深入地研究和探索,提出了一种基于多对象有效特征提取和主成分分析优化神经网络的玉米种子品种识别方法,提取了玉米种子的几何特征和颜色特征参数,优化了基于机器视觉的玉米种子图像处理策略和品种识别算法,提高了玉米品种识别的速度和准确率。

对农大108、鲁单981、郑单958、五岳18共4个品种玉米种子进行了品种识别试验,每粒种子识别的平均耗时为0.127s ,综合识别率达到97%以上。

研究表明,基于机器视觉的玉米种子品种识别与检测方法是可行的,该方法可提高玉米种子品种识别效率和正确率。

关键词:特征提取,主成分分析,神经网络,玉米种子,品种识别doi :10.3969/j.issn.1002-6819.2010.06.035中图分类号:TP391,S513文献标识码:A 文章编号:1002-6819(2010-06-0199-06王玉亮,刘贤喜,苏庆堂,等.多对象特征提取和优化神经网络的玉米种子品种识别[J].农业工程学报,2010,26(6:199-204.Wang Yuliang, Liu Xianxi, Su Qingtang, et al. Maize seeds varieties identification based on multi-object feature extraction and optimized neural network[J]. Transactions of the CSAE, 2010, 26(6:199-204. (inChinese with English abstract0引言玉米作为中国主要的农作物之一,在食品、饲料等行业中备受关注。

OpenCV Blob分析-基于FindContours联通区域分析

OpenCV Blob分析-基于FindContours联通区域分析

OpenCV Blob分析-基于FindContours联通区域分析本文是一个较完整的Blob分析思路解说,是用OpenCvSharp联合c#编写的。

思路如下:1、对图像进行二值化2、设定ROI3、腐蚀、膨胀(可选)4、边缘提取(有区分是否需填充孔洞)5、进行筛选看一组使用效果图1 原图图2 提取黑色对象图3 提取黑色对象并填充孔洞部分源代码解说:InputImage来着输入的要处理的图片。

gray_min、gray_max二值化的上下阈值1、对图像进行二值化(根据二值化的上下阈值来判定二值化方式)Mat binaryImage = new Mat(InputImage.Size(), MatType.CV_8UC1, Scalar.Black);if (gray_min != 0 && gray_max != 255){binaryImage = InputImage.Threshold(gray_min, 255, ThresholdTypes.Binary);Mat binaryImage2 = InputImage.Threshold(gray_max, 255, ThresholdTypes.BinaryInv);Mat binaryImage3 = new Mat(InputImage.Size(), MatType.CV_8UC1,Scalar.Black);binaryImage.CopyTo(binaryImage3, binaryImage2);binaryImage = binaryImage3.Clone();binaryImage2.Dispose();binaryImage3.Dispose();}else{if (gray_min == 0) binaryImage = InputImage.Threshold(gray_max, 255, ThresholdTypes.BinaryInv);if (gray_max == 255) binaryImage = InputImage.Threshold(gray_min, 255, ThresholdTypes.Binary);}Mat binaryImage1 = new Mat(InputImage.Size(), MatType.CV_8UC1, Scalar.Black);2、设定ROI(Mask就是ROI感兴趣区域)binaryImage.CopyTo(binaryImage1, Mask);3、腐蚀、膨胀(可选)if (erosion_dilation == "腐蚀"){Cv2.Erode(binaryImage1, binaryImage1, element);}else{Cv2.Dilate(binaryImage1, binaryImage1, element);}4、边缘提取(有区分是否需填充孔洞)if (fill_up_flag == true){Cv2.FindContours(binaryImage1, out contours, hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);}else{Cv2.FindContours(binaryImage1, out contours, hierarchy, omp, ContourApproximationModes.ApproxSimple);}5、进行筛选Mat uu = hierarchy.GetMat();// 筛选那些面积小的List<MyCenter> centers = new List<MyCenter>();List<RotatedRect> regions = new List<RotatedRect>();var detectorParams = new SimpleBlobDetector.Params{MinDistBetweenBlobs = 10, // 10 pixels between blobsMinRepeatability = 1,MinThreshold = 0,MaxThreshold = 128,ThresholdStep = 2,FilterByArea = area_bool,MinArea = area_min, // 10 pixels squaredMaxArea = area_max,//圆度FilterByCircularity = circularity_bool,MinCircularity = circularity_min,MaxCircularity = circularity_max,// 凸包形状分析 - 过滤凹包FilterByConvexity = false,//FilterByConvexity = true,MinConvexity = 0.001f,MaxConvexity = 10,FilterByInertia = false,//FilterByInertia = true,MinInertiaRatio = 0.001f,FilterByColor = false,//FilterByColor = true,BlobColor = 255 // to extract light blobs};MyCenter center;int j = 0;Vec4i value;Mat cnt = new Mat();foreach (Mat cnt0 in contours){value = uu.Get<Vec4i>(0, j);j++;//int i = hierarchy;// 根据轮廓面积进行筛选if (value[3] != -1){cnt = contours[value[3]];}else{cnt = cnt0;}center.confidence = 1;Moments moms = Cv2.Moments(cnt);if (detectorParams.FilterByArea) //斑点面积的限制{double area = moms.M00; //零阶矩即为二值图像的面积//如果面积超出了设定的范围,则不再考虑该斑点if (area < detectorParams.MinArea || area >= detectorParams.MaxArea)continue;}if (detectorParams.FilterByCircularity) //斑点圆度的限制{double area = moms.M00; //得到斑点的面积//计算斑点的周长double perimeter = Cv2.ArcLength(cnt, true);//由公式3得到斑点的圆度double ratio = 4 * Cv2.PI * area / (perimeter * perimeter);//如果圆度超出了设定的范围,则不再考虑该斑点if (ratio < detectorParams.MinCircularity || ratio >= detectorParams.MaxCircularity)continue;}if (detectorParams.FilterByInertia) //斑点惯性率的限制{//计算公式13中最右侧等式中的开根号的值double denominator = Math.Sqrt(Math.Pow(2 * moms.Mu11, 2) +Math.Pow(moms.Mu20 - moms.Mu02, 2));const double eps = 1e-2; //定义一个极小值double ratio;if (denominator > eps){//cosmin和sinmin用于计算图像协方差矩阵中较小的那个特征值λ2double cosmin = (moms.Mu20 - moms.Mu02) / denominator;double sinmin = 2 * moms.Mu11 / denominator;//cosmin和sinmin用于计算图像协方差矩阵中较大的那个特征值λ1double cosmax = -cosmin;double sinmax = -sinmin;//imin为λ2乘以零阶中心矩μ00double imin = 0.5 * (moms.Mu20 + moms.Mu02) - 0.5 * (moms.Mu20 - moms.Mu02) * cosmin - moms.Mu11 * sinmin;//imax为λ1乘以零阶中心矩μ00double imax = 0.5 * (moms.Mu20 + moms.Mu02) - 0.5 * (moms.Mu20 - moms.Mu02) * cosmax - moms.Mu11 * sinmax;ratio = imin / imax; //得到斑点的惯性率}else{ratio = 1; //直接设置为1,即为圆}//如果惯性率超出了设定的范围,则不再考虑该斑点if (ratio < detectorParams.MinInertiaRatio || ratio >= detectorParams.MaxInertiaRatio)continue;//斑点中心的权值定义为惯性率的平方center.confidence = ratio * ratio;}if (detectorParams.FilterByConvexity) //斑点凸度的限制{Mat hull = new Mat(); //定义凸壳变量//调用convexHull函数,得到该斑点的凸壳Cv2.ConvexHull(cnt, hull);//分别得到斑点和凸壳的面积,contourArea函数本质上也是求图像的零阶矩double area = Cv2.ContourArea(cnt);double hullArea = Cv2.ContourArea(hull);double ratio = area / hullArea; //公式5,计算斑点的凸度//如果凸度超出了设定的范围,则不再考虑该斑点if (ratio < detectorParams.MinConvexity || ratio >= detectorParams.MaxConvexity)continue;}//根据公式7,计算斑点的质心center.location = new Point2d(moms.M10 / moms.M00, moms.M01 / moms.M00);// 根据轮廓近似进行筛选,作用很小double epsilon = 0.001 * Cv2.ArcLength(cnt, true);Mat approx = new Mat();Cv2.ApproxPolyDP(cnt, approx, epsilon, true);// 根据最小矩形进行筛选,该矩形可能有方向RotatedRect rect = Cv2.MinAreaRect(approx);//int row = rect.BoundingRect().X;//int col = rect.BoundingRect().Y;if (width_bool){int width = rect.BoundingRect().Width;if (width < width_min || width > width_max) continue;}if (height_bool){int height = rect.BoundingRect().Height;if (height < height_min || height > height_max) continue;}//根据质心来判断颜色不合理,但是我觉得这个不合理就把它禁用了//if (detectorParams.FilterByColor) //斑点颜色的限制//{// //判断一下斑点的颜色是否正确// if (binaryImage.At(int) (cvRound(center.location.Y),cvRound(center.location.X)) != detectorParams.BlobColor)// continue;// }////compute blob radius//{// Mat dists; //定义距离队列// //遍历该斑点边界上的所有像素// for (size_t pointIdx = 0; pointIdx < contours[contourIdx].size(); pointIdx++)// {// Point2d pt = contours[contourIdx][pointIdx]; //得到边界像素坐标// //计算该点坐标与斑点中心的距离,并放入距离队列中// dists.push_back(norm(center.location - pt));// }// std::sort(dists.begin(), dists.end()); //距离队列排序// //计算斑点的半径,它等于距离队列中中间两个距离的平均值// center.radius = (dists[(dists.size() - 1) / 2] + dists[dists.size() / 2]) / 2.;//}centers.Add(center);outcontours.Add(cnt0);}。

直流高电压试验细则

直流高电压试验细则

直流高电压试睑细则1试验条件1.1环境要求除非另有规定,试验均在以下大气条件下进行,且试验期间,大气环境条件应相对稳定。

a)环境温度不宜低于温度对泄漏电流的影响是极为显著的,因此,最好在以往试验相近的温度条件下进行测量,以便于进行分析比较。

b)环境相对湿度不宜大于80%oc)现场区域满足试验安全距离要求。

1.2待试设备要求a)待试设备处于检修状态,且待试设备上无接地线或者短路线。

b)试品的表面应清洁干燥,试品在试验前不应受机械、热的作用。

c)充油设备若经滤油或运输,耐压试验前应将试品按规定时间静置并排气,以排除内部可能残存的气体。

d)设备上无各种外部作业。

1.3人员要求试验人员需具备如下基本知识与能力:a)了解各种绝缘材料、绝缘结构的性能、用途。

b)了解各种电力设备的型式、用途、结构及原理。

c)熟悉变电站电气主接线及系统运行方式。

d)熟悉各类试验设备、仪器、仪表的原理、结构、用途及使用方法,并能排除一般故障。

e)能正确完成试验室及现场各种试验项目的接线、操作及测量。

f)熟悉各种影响直流高电压试验结论的因素及消除方法。

g)经过上岗培训并考试合格。

1.4安全要求a)应严格执行《国家电网公司电力安全工作规程(变电部分)》的相关要求。

b)高压试验工作不得少于两人。

试验负责人应由有经验的人员担任,开始试验前,试验负责人应向全体试验人员详细交待试验中的安全注意事项,交待邻近间隔的带电部位,以及其他安全注意事项。

c)试验现场应装设遮栏或围栏,遮栏或围栏与试验设备高压部分应有足够的安全距离,向外悬挂“止步,高压危险!”的标示牌,并派人看守。

d)应确保操作人员及试验仪器与电力设备的高压部分保持足够的安全距离,且操作人员应使用绝缘垫。

e)试验装置的金属外壳应可靠接地,高压引线应尽量缩短,并采用专用的高压试验线,必要时用绝缘物支持牢固。

f)对于被试设备两端不在同一工作地点时,如电力电缆另一端应派专人看守。

g)加压前必须认真检查试验接线,使用规范的短路线,表计倍率、量程、调压器零位及仪表的开始状态,均应正确无误。

PDH、SDH、MSTP、ASON、PTN、OTN技术介绍

PDH、SDH、MSTP、ASON、PTN、OTN技术介绍

PDH 、SDH 、MSTP 、ASON/PTN 、OTN技术介绍第一部分:PDH 准同步数字系列(1) PCM30/32路 即E1 欧洲和我国采用此标准 (2) PCM24/路 即T1 北美采用此标准 一、 E1和T1PCM 脉冲调制,对模拟信号采样,8000个样值每S ,每个样值8bit ,所以一个话路的速率为64kbps 。

E1有32个时隙,TS0用来同步,TS16用来传送信令,其中30路用来传话音信号的,32个话路的速率为2.048Mbps ,即PCM 基群,也叫一次群。

…,他们的速率是四倍关系。

T1的采样与E1相同,只是有24个话路,其速率为64kbps*24 = 1.544Mbps 四个一次群复用为一个二次群,当然一个二次群的速率比四个一次群的速率总和还要多一些,用于同步的码元。

四个二次群复用为一个三次群,依次类推。

E1=2.048、E2=8.448、E3=34.368Mbps ……二、 在传送网上传送时,现在的PDH 体制中,只有1.5Mbit/s 和2Mbit/s 速率的信号是同步的,其他速率的信号都是异步的,需要通过码速的调整来匹配和容纳时钟的差异。

由于PDH 采用异步复用方式,那么就导致当低速信号复用到高速信号时,其在高速信号的帧结构中的位置没规律性和固定性。

也就是说在高速信号中不能确认低速信号的位置,而这一点正是能否从高速信号中直接分/插出低速信号的关键所在。

所以在传送过程中,难于从高次群信号中直接分出低次群甚至基群的信号,也就是说四次群必须先分接为三次群,而不能直接分接为一次群,这就使得在对中继站上、下话路时,需要进行多级的复用分接,使得上下话路不方便,而且较多的接口对于信号的损伤非常大。

使得提取的时钟出现不一致。

也增加了设备的复杂性,降低了效率和可靠性。

又存在多个制式,接口不统一,这就促成了PDH 发展为SDH——数字同步系列。

此部分介绍了PDH中的E1,和PDH组网的缺陷。

江苏省计算机二级考试(vc)备考提纲(主要为基础知识) (1)

江苏省计算机二级考试(vc)备考提纲(主要为基础知识) (1)

江苏省计算机二级考试备考提纲第一章Visual C++程序设计入门1>定义标识符规则:第一个字符只能是英文字母或下画线,后面可跟字母,数字,下画线;不能是C++语言的关键字。

2>键盘上除去3个字符:@,¥,其余的可显示字符在程序代码中均能使用。

3>编写程序的注意事项:/*和*/为多行注释,//为单行注释,从标识起至本行结束:程序一般包含输入输出编译预处理命令;C++的程序有且只有一个主函数main;对于C++编译器而言,一条语句可以写成若干行,一行内也可以写若干条语句,:而且它严格区分大小写字母。

4>运算符;1.求模/余运算符%,要求操作数必须都是整形数,若不是整型数必须将操作数强制转化成整型再进行求余运算,否则将出现编译错误,如(int)5.2%3=2; 2.若操作数中有负值,求余原则为:先取绝对值求余,余数取与被除数相同的符号,如-10%3=-1,10%-3=1. 3。

而除法运算符/和*,若两个操作数都是整型,则结果也是整型,若有一个是实型,则结果是实型。

4。

注意,如a=4,b=3,c=2,求a>b>c的值,因为原式=(a>b)>c,a>b值为1,则原式相当于1>c,所以最终结果是0。

5。

自增、减运算符的操作数不能是常量或表达式,如2++,(x+1)++都是不合法的,再如,2*a++等价于2*(a++). 6.条件运算符“?:”是C++中唯一的三目运算符,条件表达式的一般格式为:逻辑表达式1?表达式2:表达式3.,1为真执行2,为假执行3,注意:条件表达式的功能相当于条件语句,但一般不能取代if语句;表达式1,2,3类型可不同,此时条件表达式的值取较高的类型,如a>b?2:5.5,a<b时,值为5.5,a>b时,值为2.0,而不是2。

注意:逗号运算符计算方法:按先后顺序依次计算各个表达式的值,最后一个表达式的值作为整个逗号表达式的值。

一种基于关节角度的步态识别新方法

一种基于关节角度的步态识别新方法

一种基于关节角度的步态识别新方法曾莹;刘波【摘要】基于行走运动的关节角度变化包含更丰富的个体识别信息的观点,提出利用下肢关节角度进行步态识别的新方法.依据人体解剖学的先验知识,通过对下肢运动分析定位盆骨、左右膝、左右踝关节点,提取相邻关节点连线与竖直线的夹角作为运动关节角度.识别时.考虑到NN,KNN等传统步态分类器分类能力较弱的缺点,采用针对小样本问题具有很好分类效果的支持向量机对步态特征向量进行分类.CASIA步态数据库上的仿真结果证明该方法具有较高的识别性能.【期刊名称】《现代电子技术》【年(卷),期】2010(033)010【总页数】4页(P86-89)【关键词】步态识别;支持向量机;关节角度;轮廓特征【作者】曾莹;刘波【作者单位】湖南农业大学,东方科技学院,湖南,长沙,410128;湖南农业大学,东方科技学院,湖南,长沙,410128【正文语种】中文【中图分类】TP391.410 引言步态识别是一种新兴的生物特征识别技术,旨在通过人行走的姿势来识别人的身份。

因其具备在远距离或低视频质量情况下的识别潜力,且难以隐藏或伪装,近年来引起了各国学术界的广泛关注。

人的步态是自身生理结构、行为习惯、心理状态等诸多因素在行走时的外在综合表现。

由于个体之间存在差异,步态亦不尽相同,故步态特征可以为人的身份识别提供独特的线索。

步态特征既包括身高、体形等基于几何度量的特征,也包括对行为变化较敏感的运动学特征,如关节点的运动轨迹及位移速度、肢体关节角度等。

直观上,人类视觉对步态的识别很大程度上依赖于人体轮廓形状随时间的变化过程[1],因此,现有的步态识别方法大多基于人体轮廓特征。

文献[2]应用傅里叶描述子描述人步行时的轮廓特征,利用模板匹配法获取待测样本与训练样本的相似度,最后采用最近邻分类器进行决策;文献[3]利用人体二值图像的侧面外轮廓宽度矢量作为步态特征,使用隐马尔可夫模型(HMM)进行步态识别;文献[4]提出一种是基于Procrustes形状分析的步态识别方法,利用统计形状分析提取步态特征向量,分别采用最近邻分类器、K近邻分类器及最近标本分类器进行分类识别。

在MFC中使用OpenCV教程

在MFC中使用OpenCV教程

典型例图 ExampleL.bmp、 ExampleQ.bmp
简要说明 仅适用于单连通区域, 不能处理多连通区域与孔边界
ExampleC.bmp、
适用各类二值图像,使用范围较宽
SteelBar.bmp、pic3.png 图像反相后也可进行处理,得到不同结果
ExampleD.bmp
为灰值形态学运算,波谷检测又称黑顶帽变换
三、用 DirectShow 编制的视频采集程序 采用 DirectShow 实现视频采集,其优点是支持高分辨率图像采集,最高分辨率由所用的摄像头决定, 如罗技 130 万像素 USB 摄像头 C300 最高分辨率可达 1280*1024,在 MPEG 模式下采集速度为每秒 15 帧。 使用时 CPU 的时间占用率在 15~30%之间。 通过多图像平均可以采集得到质量不错的图像,经过 4 幅图像平均采集所得图像的信噪比可提高一倍。 由于需要连续采集多帧图像,约需 0.25 秒,故适宜采集静态或缓慢移动对象的图像。 视频采集功能调用 OpenCV China 网站下载的软件 camerads 中的函数实现。
主要内容
下面列出 stdafx.h 尾部集中的几个头文件,程序结构由此可见一斑。
#include "CVMFC.h"
// 窗口管理
#include "cv.h" #include "highgui.h"
// OpenCV 头文件
#include "CameraDS.h" #include "CVDSCap.h"
图像反相后处理与另一方法直接处理等价
lena.jpg、fruits.jpg lena.jpg、fruits.jpg

vc注释技巧

vc注释技巧

vc注释技巧一、什么是vc注释1. 简单来说呢,vc注释就是在写vc程序的时候,给代码做的一些小标记、小解释。

就好像你在课本上划重点,然后在旁边写上为啥这是重点一样。

比如说,你有一段代码是计算两个数相加的,那注释可能就是“这个部分是计算变量a和变量b的和”。

这就像是给代码加了个小标签,让人一看就明白这代码是干啥的。

2. 它可重要啦。

就像你走在一个陌生的城市,如果没有路标,你是不是很容易迷路呀?代码也是这样,没有注释,别人看你的代码就跟在陌生城市没路标一样,完全不知道哪跟哪。

二、注释的风格1. 清晰明了型这种风格就是把事情说得特别直白。

比如你有个函数是用来打开文件的,注释就可以写“这个函数的作用是打开名为xxx的文件,使用的是xxx模式”。

不要搞那些花里胡哨的,简单直接就好。

就像你跟朋友说事儿,直来直往。

2. 幽默风趣型有时候你可以在注释里加点小幽默。

例如有个代码块是处理错误的,你可以写“这里呢,就像是一个小医生,专门给代码的小毛病看病。

要是代码‘生病’了,这个部分就会来治它”。

这样的注释会让看代码的人会心一笑,也更容易记住代码的功能。

三、注释的位置1. 在函数开头这是最常见的位置啦。

当你写一个函数的时候,在函数的最开始就写注释。

就像给这个函数做个自我介绍一样。

比如说“这个函数是用来计算圆的面积的,输入的是圆的半径,输出的是圆的面积”。

这样别人一看到这个函数,就马上知道它是干啥的了。

2. 在代码块旁边如果你的代码里有一段比较复杂的逻辑,比如说一个嵌套的循环,那就在这个循环旁边写上注释。

比如说“这个循环是用来遍历数组中的每个元素的,然后对每个元素进行某种操作”。

这就像给这个复杂的逻辑做个小导游,引导别人理解。

四、注释的内容1. 功能描述这是注释最基本的内容啦。

就是说清楚代码是干什么的。

比如有个代码是用来排序的,注释就写“这个部分是对输入的数组进行排序,采用的是冒泡排序算法”。

2. 输入输出说明要告诉别人这个代码需要什么输入,又会输出什么。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档