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

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

原图:

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

基本处理思路: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. C#最新功能(6.0、7.0)

    一直用C#开发程序,.NET的功能越来越多,变化也挺大的,从最初的封闭,到现在的开源,功能不断的增加,一直在进步.作为C#的强烈支持者,C#的变化,我不能不关注,这篇文章主要介绍,C#6.0和C#7. ...

  2. Scala 学习之路(十一)—— 模式匹配

    一.模式匹配 Scala支持模式匹配机制,可以代替swith语句.执行类型检查.以及支持析构表达式等. 1.1 更好的swith Scala不支持swith,可以使用模式匹配match...case语 ...

  3. spring boot 2.x 系列 —— actuator 服务监控与管理

    文章目录 一.概念综述 1.1 端点 1.2 启用端点 1.3 暴露端点 1.4 健康检查信息 二.项目说明 1.1 项目结构说明 1.2 主要依赖 1.3 项目配置 1.4 查看监控状态 三.自定义 ...

  4. Github项目备份与更新

    需求 假如现在想对使用到的一些Github上的开源组件进行备份,采用自建Gitlab服务器的方式进行备份保存,并且组件需定时保持与Github更新. 总体步骤 组件备份- 整体步骤如下: a.搭建gi ...

  5. Django中间件加载原理

    假设我们有如下中间件: setting.py文件 MIDDLEWARE = [ 'django.middleware.A', 'django.middleware.B', 'django.middle ...

  6. Spring Bean 生命周期之destroy——终极信仰

    上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...

  7. Docker环境下的前后端分离项目部署与运维(十二)使用Portainer管理Docker

    安装 docker hub地址:https://hub.docker.com/r/portainer/portainer/ # 每台服务器都要安装 docker pull portainer/port ...

  8. python 中的__name__ == "__main__"(转)

    有句话经典的概括了这段代码的意义: “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可 ...

  9. [Vue 牛刀小试]:第十六章 - 针对传统后端开发人员的前端项目框架搭建

    一.前言 在之前学习 Vue 基础知识点的文章中,我们还是采用传统的方式,通过在 html 页面上引用 vue.js 这个文件,从而将 Vue 引入到我们的项目开发中.伴随着 Node.js 的出现, ...

  10. 【UR #7】水题走四方 题解

    链接:http://uoj.ac/problem/84 20分算法:萌萌的小爆搜,别搜进环里就行. 50分:我们考虑一下最优决策是什么样的.看似很显然的一点就是我们先让本体在原地不动,让分身去遍历子树 ...