求出轮廓的周长进行筛选并绘制轮廓
来源:互联网 发布:捕鱼刷分软件 编辑:程序博客网 时间:2024/06/04 18:33
代码:
OpenFileDialog of = new OpenFileDialog();
if (of.ShowDialog() != DialogResult.OK)
{ return; }
Image<Gray, byte> img = new Image<Gray, byte>(of.FileName);
Mat dst1 = new Mat();
CvInvoke.Canny(img, dst1, 120, 180);//查找轮廓
imageBox2.Image = dst1;
VectorOfVectorOfPoint vvp = new VectorOfVectorOfPoint();
VectorOfVectorOfPoint use_vvp = new VectorOfVectorOfPoint();
CvInvoke.FindContours(dst1, vvp, null, Emgu.CV.CvEnum.RetrType.External/*提取最外层轮廓,经常使用也有取所有轮廓List*/, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);//轮廓提取
int number = vvp.ToArrayOfArray().Length;//取得轮廓的数量.
for (int i = 0; i < number; i++)
{
VectorOfPoint vp = vvp[i];
double lengch = CvInvoke.ArcLength(vp,false);//计算周长
if (lengch > 100)//以实际的图片按周长进行筛选
{ use_vvp.Push(vp); }
}
Mat result = new Mat(img.Size, Emgu.CV.CvEnum.DepthType.Cv8U, 3);
result.SetTo(new MCvScalar(0, 0, 0));
CvInvoke.DrawContours(result, use_vvp, -1, new MCvScalar(0, 255, 0));//绘制轮廓
imageBox3.Image = result;
imageBox1.Image = img;
API:
/// <summary>
/// Canny算法查找输入图像上的轮廓查找
/// </summary>
/// <param name="image">源图</param>
/// <param name="edges">输出图像</param>
/// <param name="threshold1">第一个阈值</param>
/// <param name="threshold2">第二个阈值</param>
/// <param name="apertureSize">光圈大小:用Sobel算子孔径参数(默认)</param>
/// <param name="l2Gradient">一个标志位,指示是否应该使用一个更精确的规范来计算图像的梯度幅值(l2gradient = true),或是默认(l2gradient = false)</param>
// public static void Canny(IInputArray image, IOutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool l2Gradient = false);
/// <summary>
/// 提取轮廓
/// </summary>
/// <param name="image">输入一个二进制的图像</param>
/// <param name="contours">输出的是一个轮廓图像</param>
/// <param name="hierarchy">可选择的输出向量,包含图像的拓扑信息不使用的时候可以用null填充,每个独立的轮廓(连通域)对应4个hieratchy元素</param>
/// <param name="mode">枚举类型 轮廓检索模式</param>
/// <param name="method">枚举类型 轮廓近似方法</param>
/// <param name="offset">每个轮廓 点的偏移量,对RoI图像中长出轮廓,并要在整片中分析,那第就会使用到这个偏移量</param>
// public static void FindContours(IInputOutputArray image, IOutputArray contours, IOutputArray hierarchy, RetrType mode, ChainApproxMethod method, Point offset = null);
public enum RetrType
{//轮廓检索模式
// 提取最外层轮廓
External = 0,
// 提取所有轮廓
List = 1,
//检索所有的轮廓并将它们组织到两个级别的层次结构:水平是组件的外部边界,二级约束边界的洞.
Ccomp = 2,
// 提取所有的轮廓和建构完整的层次结构嵌套的轮廓.
Tree = 3,
}
public enum ChainApproxMethod//轮廓近似方法
{
//Freeman链码输出轮廓,所有其他多边形(顶点序列)
ChainCode = 0,
//所有的点从链代码转化为点.
ChainApproxNone = 1,
//压缩水平、垂直和对角线部分,也就是说只剩下他们的终点.
ChainApproxSimple = 2,
//使用The_Chinl链逼近算法的一个
ChainApproxTc89L1 = 3,
//使用The_Chinl链逼近算法的一个
ChainApproxTc89Kcos = 4,
//使用完全不同的轮廓检索算法通过链接的水平段的1S轨道,用这种方法只能使用列表检索模式.
LinkRuns = 5,
}
/// <summary>
/// 返回double类型的长度
/// </summary>
/// <param name="curve">输入计算周长的轮廓,类型为VectorOfPoint</param>
/// <param name="isClosed">表示计算周长的轮廓是否封闭.isClosed=true:计算封闭轮廓 的周长</param>
/// <returns></returns>
// public static double ArcLength(IInputArray curve, bool isClosed);
/// <summary>
/// 绘制轮廓
/// </summary>
/// <param name="image">输入一个图片,也是传出来的图片</param>
/// <param name="contours">new VectorOfVectorOfPoint</param>
/// <param name="contourIdx">-1为绘制所有轮廓</param>
/// <param name="color">绘制轮廓的颜色</param>
/// <param name="thickness">线宽</param>
/// <param name="lineType"></param>
/// <param name="hierarchy"></param>
/// <param name="maxLevel"></param>
/// <param name="offset"></param>
//public static void DrawContours(IInputOutputArray image, IInputArrayOfArrays contours, int contourIdx, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, IInputArray hierarchy = null, int maxLevel = 2147483647, Point offset = null);
- 求出轮廓的周长进行筛选并绘制轮廓
- 求出轮廓多边形的Size进行筛选并绘制轮廓
- 封闭像素轮廓的周长筛选算法
- Poj1177(求矩形并的轮廓周长)
- 使用OpenCV的函数findContours提取轮廓并绘制轮廓
- opencv绘制图形轮廓并筛选面积操作
- opencv2,找轮廓,用周长筛选
- OpenCV:查找并绘制图像的轮廓
- EMGU 计算轮廓的面积并绘制
- opencv 查找并绘制轮廓
- 轮廓 - 查找轮廓、表示轮廓、绘制轮廓
- 轮廓 - 查找轮廓、表示轮廓、绘制轮廓
- 轮廓 - 查找轮廓、表示轮廓、绘制轮廓
- 初学 OpenCV 图像加载、输出+图像轮廓提取绘制并取出每个轮廓的坐标集合
- opencv找轮廓线并绘制轮廓线
- opencv学习之寻找轮廓并绘制轮廓
- opencv: 绘制矩形轮廓框,并记录轮廓框坐标
- opencv 查找轮廓 绘制轮廓
- 技术博客网站推荐
- JavaScript中的forEach、$.each、map方法
- 对PC某串口接收的外部数据进行处理操作的简单C程序 VC++6.0
- Gazebo機器人仿真學習探索筆記(三)機器人模型
- slf4j绑定log4j2日志系统的过程(源码分析)
- 求出轮廓的周长进行筛选并绘制轮廓
- Netty通信
- 编写一个Java程序将当100,101,102,103,104,105个数以数组的形式写入到Dest.txt文件中,并以相反的顺序读出显示在屏幕上
- 指向非静态成员函数的3种方式
- windows下的网络配置
- 微信端开发问题收集
- 斐波那契数列的齐肯多夫定理
- phpStorm 添加php调试工具 Xdebug
- Sublime Text 3 -mac简体中文汉化包下载及教程