第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属性去设置,但是被告知此非变量 于是只能另外想办法 搜到 ...
随机推荐
- Qt动画效果的幕后英雄:QTimeLine
其实动画的本质就是在每一定时间间隔内显示一帧图像,当这个间隔较短的时候人眼就感觉不出来了,觉得看到的是连续的影像.Qt为开发动画效果的人员提供了一个很好的时间控制类QTimeLine. QTimeLi ...
- java集合框架collection(4)HashMap和Hashtable的区别
HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别.主要的区别有:线程安全性,同步(synchronizatio ...
- JVM底层实现与总结
一.类加载器 1.BootstrapClassLoader(启动类加载器) 它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath参数指定的路径以及%JAVA_HOME% ...
- Azkaban学习之路(二)—— Azkaban 3.x 编译及部署
一.Azkaban 源码编译 1.1 下载并解压 Azkaban 在3.0版本之后就不提供对应的安装包,需要自己下载源码进行编译. 下载所需版本的源码,Azkaban的源码托管在GitHub上,地址为 ...
- TCP/IP协议栈---网络基础篇(3)
TCP/IP协议栈 在网络中实际使用的是TCP/IP,OSI是参考模型. TCP/IP协议栈 – 是由一组不同功能的协议组合在一起构成的协议栈 – 利用一组协议完成OSI所实现的功能 应用层协议 传输 ...
- JRebel的优势与使用(基于IDEA)
在平时的工作产出中,代码出现问题时往往要不停的修改测试其正确性,每次修改一部分代码都需要重启项目,这十分的耗时,对于企业大型项目来说你重启的时间够你去喝杯咖啡了,本篇博文主要就减少重启项目时间为目的来 ...
- 农夫过河 (BFS)(队列)
1 .问题描述 要求设计实现农夫过河问题(农夫带着一只狼,一只养,一棵白菜,一次只能带一个东西)如何安全过河. 2 .问题的解决方案: 可以用栈与队列.深度优先搜索算法及广度优先搜索算法相应的原理去解 ...
- 并发编程-Future+callable+FutureTask 闭锁机制
项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable实现. FutureTask ...
- 并发编程-concurrent指南-信号量Semaphore
Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可. acquire( ...
- (转)User-Agent的由来(原来这么有意思)
你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样?Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ( ...