第2个C# Winform实例,寻找三角形的位置
这里,在第一个例子的基础上,稍微做修改,达到最终定位三角形位置的目的。
先在网络上找一张包含有三角形的图片,我们这里使用一张有三个三角形和一些标记的图片来处理。
原图:


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



基本处理思路: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实例,寻找三角形的位置的更多相关文章
- OpenGL实例:三角形
OpenGL实例:三角形 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 三角形的旋转 #include <GL/ ...
- 一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(下)
接着上一篇:一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(上) 直接贴代码了: using System; using System. ...
- luogu 1355 神秘大三角 判断点和三角形的位置关系 面积法 叉积法
题目链接 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样 ...
- 叉积_判断点与三角形的位置关系 P1355 神秘大三角
题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...
- 第一个C# Winform实例
前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入.VS版本VS2017 1:打开VS建立一个WInform 项目.拉入两个控件,gr ...
- 198个经典C#WinForm实例源码(超赞) 里面的例子 .sln 目录
\-窗体技巧\QQ窗体\QQFrm.sln; \-窗体技巧\仿XP系统的任务栏菜单\仿XP系统的任务栏菜单.sln; \-窗体技巧\向窗体中拖放图片并显示\向窗体中拖放图片并显示.sln; \-窗体技 ...
- [fzu 2273]判断两个三角形的位置关系
首先判断是否相交,就是枚举3*3对边的相交关系. 如果不相交,判断包含还是相离,就是判断点在三角形内还是三角形外.两边各判断一次. //http://acm.fzu.edu.cn/problem.ph ...
- 如何方便的保存WinForm窗体控件的位置大小等等配置信息
由于分辨率.屏幕主题.字体大小的不同,窗体显示效果在不同机器上不尽相同.窗体的弹性设计并不能满足多样的需求.为保证在各种情况下,能有满意的效果.窗体的多样显示方式能改变,并且保存.载入配置,显得很重要 ...
- C#winform调整控件的位置
现在有三个控件并排放置 第二个控件有隐藏功能 隐藏后第一个控件和第三个控件的距离要缩小,于是就要改变第三个控件的位置 尝试用Location.X属性去设置,但是被告知此非变量 于是只能另外想办法 搜到 ...
随机推荐
- leetcode解答索引一期工程:1 - 40题
更多内容敬请期待.解法是否最优不能保证,但OJ肯定是能过的. 1: Two Sum 2: Median of Two Sorted Arrays 3: Longest Substring Withou ...
- Hadoop集群(第3期)机器信息分布表
1.分布式环境搭建 采用4台安装Linux环境的机器来构建一个小规模的分布式集群. 图1 集群的架构 其中有一台机器是Master节点,即名称节点,另外三台是Slaver节点,即数据节点.这四台机器彼 ...
- python之数据分析pandas
做数据分析的同学大部分入门都是从excel开始的,excel也是微软office系列评价最高的一种工具. 但当数据量超过百万行的时候,excel就无能无力了,python第三方包pandas极大的扩展 ...
- ZooKeeper学习第七期--ZooKeeper一致性原理(转)
转载来源:https://www.cnblogs.com/sunddenly/p/4138580.html 一.ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过Zo ...
- never下ioc
生命周期 当前分单例,作用域(范围),短暂.单例是整个服务中只有一个实例,短暂则是每一次得到的都是新的实例,作用域就是在该一套行动中内得到的是同一个实例,该行动中指的是什么?我们看看demo下的sta ...
- HBase —— 集群环境搭建
一.集群规划 这里搭建一个3节点的HBase集群,其中三台主机上均为Regin Server.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002上部署备用的 ...
- Python 3.6 安装
1. 下载 # 我下载到了 /tmp 目录中 cd /tmp wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz 2. 安装依赖 ...
- 什么是JS跨域请求
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- spring源码深度解析— IOC 之 bean 的初始化
一个 bean 经历了 createBeanInstance() 被创建出来,然后又经过一番属性注入,依赖处理,历经千辛万苦,千锤百炼,终于有点儿 bean 实例的样子,能堪大任了,只需要经历最后一步 ...
- Jmeter接口测试实例-牛刀小试
本次测试的是基于HTTP协议的接口,主要是通过Jmeter来完成接口测试,借此熟悉Jmeter的基本操作. 本次实战,我是从网上找的接口测试项目,该项目提供了详细的接口文档,我们可以通过学习接口文档来 ...