这里,在第一个例子的基础上,稍微做修改,达到最终定位三角形位置的目的。

先在网络上找一张包含有三角形的图片,我们这里使用一张有三个三角形和一些标记的图片来处理。

原图:

先贴结果图片:左侧,中间,右侧寻找的位置如下,用红色圆形来包围。

基本处理思路:1:先用上一节的二值化进行预处理,这里由于目标三角形式黑色,所以使用反向阈值化。

相关代码:

  private void Tobinimg_inv(Mat inimg,out Mat binimg)
{
binimg = new Mat();
try
{ if (inimg != null)
{
//转灰度
Mat grayimg;
if (inimg.Channels() == )
{
grayimg = inimg.CvtColor(ColorConversionCodes.BGR2GRAY); }
else
{
grayimg = inimg.Clone();
}
Imgwindow.Showimg(grayimg);
//bin
double dvalue = ;
double.TryParse(textBox_ThreshValue.Text, out dvalue);
if (dvalue == )
{
dvalue = ;
} binimg = grayimg.Threshold(dvalue, , ThresholdTypes.BinaryInv);
Imgwindow.Showimg(binimg);
grayimg.Dispose();
// binimg.Dispose(); }
}
catch (Exception ex)
{
throw (ex);
}
}

阈值200,反向二值化的效果如下:

:

2:筛选轮廓特征,选中三个三角形,并根据位置要求来进行输出。

相关代码:

 /// <summary>
/// 通过矩形选择contours
/// </summary>
/// <param name="contours"></param>
/// <param name="Minvaluelow"></param>
/// <param name="Minvalueup"></param>
/// <param name="Maxvaluelow"></param>
/// <param name="Maxvalueup"></param>
/// <returns></returns>
public List<OpenCvSharp.Point[]> SelectContoursByRect(Mat binimg, double Minvaluelow, double Minvalueup, double Maxvaluelow, double Maxvalueup)
{
OpenCvSharp.Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(binimg, out contours, out hierarchy, RetrievalModes.CComp, ContourApproximationModes.ApproxSimple);
List<OpenCvSharp.Point[]> Resultcontours = new List<OpenCvSharp.Point[]>();
int L = contours.Length;
for (int i = ; i < L; i++)
{
Rect recttemp = Cv2.BoundingRect(contours[i]);
double Hmin, Wmax;
Hmin = Math.Min(recttemp.Width, recttemp.Height);
Wmax = Math.Max(recttemp.Width, recttemp.Height);
if (Hmin > Minvaluelow && Hmin < Minvalueup && Wmax > Maxvaluelow && Wmax < Maxvalueup)
{
//满足指定要求的contours
Resultcontours.Add(contours[i]);
}
}
return Resultcontours;
}
     private List<OpenCvSharp.Point[]> SelectContoursByRectPos(List<OpenCvSharp.Point[]> inputcontours,int pos)
{
List<OpenCvSharp.Point[]> resultpoints = new List<OpenCvSharp.Point[]>();
try
{ List<float> colposition = new List<float>();
for (int i = ; i < inputcontours.Count; i++)
{
Point2f cp;
float r;
Cv2.MinEnclosingCircle(inputcontours[i],out cp,out r); colposition.Add(cp.X);
}
int Right= colposition.IndexOf(colposition.Max());
int Left= colposition.IndexOf(colposition.Min());
int Middle = - Right - Left;
switch (pos)
{
case :
//左侧
resultpoints.Add( inputcontours[Left]);
break;
case :
resultpoints.Add(inputcontours[Middle]);
//中间
break;
case :
resultpoints.Add(inputcontours[Right]);
//右侧
break;
default:
break; }
return resultpoints;
}
catch(Exception ex)
{
return resultpoints;
throw (ex); } }

目标位置绘图,

相关代码:

 if(onecontours.Count==)
{
Point2f cp;
float r;
Cv2.MinEnclosingCircle(onecontours[], out cp, out r);
//
Mat backimg = img.Clone();
Cv2.Circle(backimg, new OpenCvSharp.Point(cp.X,cp.Y), (int)r, Scalar.Red);
Imgwindow.Showimg(backimg);
backimg.Dispose();
}

通过以上就完成了三角形的定位,当然,其他定位你可以发挥你的能力,把握对象特点,选定合适的处理方法,所谓条条大路通罗马,我们的目的就能达到。

如果需要源代码,请留言。谢谢。如果你有其他的图片项目,欢迎交流。本文只做学习之用。

第2个C# Winform实例,寻找三角形的位置的更多相关文章

  1. OpenGL实例:三角形

    OpenGL实例:三角形 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 三角形的旋转 #include <GL/ ...

  2. 一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(下)

    接着上一篇:一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(上) 直接贴代码了: using System; using System. ...

  3. luogu 1355 神秘大三角 判断点和三角形的位置关系 面积法 叉积法

    题目链接 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样 ...

  4. 叉积_判断点与三角形的位置关系 P1355 神秘大三角

    题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...

  5. 第一个C# Winform实例

    前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入.VS版本VS2017 1:打开VS建立一个WInform 项目.拉入两个控件,gr ...

  6. 198个经典C#WinForm实例源码(超赞) 里面的例子 .sln 目录

    \-窗体技巧\QQ窗体\QQFrm.sln; \-窗体技巧\仿XP系统的任务栏菜单\仿XP系统的任务栏菜单.sln; \-窗体技巧\向窗体中拖放图片并显示\向窗体中拖放图片并显示.sln; \-窗体技 ...

  7. [fzu 2273]判断两个三角形的位置关系

    首先判断是否相交,就是枚举3*3对边的相交关系. 如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外.两边各判断一次. //http://acm.fzu.edu.cn/problem.ph ...

  8. 如何方便的保存WinForm窗体控件的位置大小等等配置信息

    由于分辨率.屏幕主题.字体大小的不同,窗体显示效果在不同机器上不尽相同.窗体的弹性设计并不能满足多样的需求.为保证在各种情况下,能有满意的效果.窗体的多样显示方式能改变,并且保存.载入配置,显得很重要 ...

  9. C#winform调整控件的位置

    现在有三个控件并排放置 第二个控件有隐藏功能 隐藏后第一个控件和第三个控件的距离要缩小,于是就要改变第三个控件的位置 尝试用Location.X属性去设置,但是被告知此非变量 于是只能另外想办法 搜到 ...

随机推荐

  1. Linux ssh及远程连接工具

    putty:http://www.so.com/link?url=http%3A%2F%2Fsoftdl.360tpcdn.com%2FPuTTY%2FPuTTY_0.67.zip&q=put ...

  2. redis python 操作 Python操作Redis数据库

    原文章于此:https://www.cnblogs.com/cnkai/p/7642787.html 有个人修改与改正 Python操作Redis数据库   连接数据库 StrictRedisfrom ...

  3. 生产环境MySQL优化

    a:硬件的优化: 1. 采用64位cpu,cpu至少4颗,L2缓存越大越好2. 内存要大,32-64G运行1-2个实例,96-128G运行3-4个实例3. 机械盘选用sas盘,转速15000以上,有可 ...

  4. vue实现Excel文件的上传与下载

    一.前言项目中使用到比较多的关于Excel的前端上传与下载,整理出来,以便后续使用或分析他人. 1.前端vue:模板下载与导入Excel 导入Excel封装了子组件,点击导入按钮可调用子组件,打开文件 ...

  5. orale数据库to_char时间中英文转换

    一.显示中文星期天 select to_char(sysdate,'day','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual; 二.显示英文 ...

  6. 移动端布局(viewport)方法

    viewport默认有6个属性 width: 设置viewport的宽度(即之前所提及到的,浏览器的宽度详),这里可以为一个整数,又或者是字符串"width-device" ini ...

  7. QT 资料收集 (不定期添加)

    Qt之界面实现技巧 http://blog.sina.com.cn/s/blog_a6fb6cc90101dech.html

  8. BFS(一):广度优先搜索的基本思想

    广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略. 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的.首先生成第一层 ...

  9. python数据库-安装问题总结(48)

    一.ERROR1698(28000):Access denied for user root@localhost错误 我的操作系统是ubuntu: 我的MySQL版本是: 安装完成后,登录mysql的 ...

  10. MySql中的SHOW INDEX 查出的结果列代表的意义

    MySQL SHOW INDEX语法的实际操作用法以及其实际查看索引状态(语法)的具体内容的描述,如果你对这一技术,心存好奇的话,以下的文章将会揭开它的神秘面纱. INDEX FROM tbl_nam ...