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

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

原图:

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

基本处理思路: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. CSocket实现端口扫描

    界面如下: 主要代码如下: //对于每一个线程,传过去的参数 typedef struct ThreadParamStruct { CString strIP; //要扫描的IP地址 UINT uPo ...

  2. 血的教训--如何正确使用线程池submit和execute方法

    血的教训之背景:使用线程池对存量数据进行迁移,但是总有一批数据迁移失败,无异常日志打印 凶案起因 ​ 听说parallelStream并行流是个好东西,由于日常开发stream串行流的场景比较多,这次 ...

  3. angular2最详细的开发环境搭建过程

    本文所需要的源代码,从 http://files.cnblogs.com/files/lingzhihua/angular2-quickstart.rar 下载 angular官方推荐使用quicks ...

  4. ASP.NET Core on K8S学习初探(3)部署API到K8S

    在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...

  5. IIS下网站对options请求直接返回404

    什么是options请求 options请求为发送非简单跨域请求前的预检请求,若该请求未正常返回,浏览器会阻止后续的请求发送. 一般情况下,有三种方式会导致浏览器发起预检请求 1.请求的方法不是GET ...

  6. JavaScript 词法作用域不完全指北

    在 JavaScript 作用域不完全指北 中,我们介绍了作用域的概念以及 JavaScript 引擎.编译器和作用域的关系.作用域有两种主要的工作模型:词法作用域和动态作用域.其中最为普遍的也是大多 ...

  7. C++ 洛谷 P2704 [NOI2001]炮兵阵地

    P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...

  8. VueRouter认识

    1. 什么是路由? 路由(vue-router)是负责将进入的浏览器请求映射到特定的 组件 代码中.即决定了由谁(组件)去响应客户端请求.简单说路由就是url地址和对应的资源的映射,通过一个路径的ur ...

  9. Git使用小技巧之多个远程仓库

    想要获取更多文章可以访问我的博客 - 代码无止境. 这是一个普通的工作日,小代正在勤勤恳恳的写代码.这时陈BOSS走到小代身边,跟小代说:"我们的代码需要同时推送到Github和码云两个仓库 ...

  10. python网络爬虫(11)近期电影票房或热度信息爬取

    目标意义 为了理解动态网站中一些数据如何获取,做一个简单的分析. 说明 思路,原始代码来源于:https://book.douban.com/subject/27061630/. 构造-下载器 构造分 ...