opencv的实用研究--分析轮廓并寻找边界点

//灰度域变化
threshold(gray,gray,0,255,THRESH_BINARY_INV);
GaussianBlur(gray,gray,Size(3,3),0,0);
//寻找和绘制轮廓
VP bigestContour = FindBigestContour(gray);
contours.push_back(bigestContour);

vector<vector<point>>
保存的,那么如何获得这个轮廓的四个顶点了?


int itopleft =65535;
int idownright =0;
Point ptopleft;
Point pdownright;
Point pdownleft;
for(int i=0;i<bigestContour.size();i++){
//左上
if(bigestContour[i].x + bigestContour[i].y <itopleft){
itopleft = bigestContour[i].x + bigestContour[i].y ;
ptopleft = bigestContour[i];
}
//右下
if(bigestContour[i].x+bigestContour[i].y>idownright){
idownright = bigestContour[i].x+bigestContour[i].y;
pdownright = bigestContour[i];
}
}
int idownleft =65534;
//对于左下的点来说,应该是所有y大于左上的点中,x最小的
for(int i=0;i<bigestContour.size();i++){
if(bigestContour[i].y>ptopleft.y){
if(bigestContour[i].x<idownleft){
idownleft = bigestContour[i].x;
pdownleft = bigestContour[i];
}
}
}
//绘制
circle(board,ptopleft,10,Scalar(255),5);
circle(board,pdownright,10,Scalar(255),5);
circle(board,pdownleft,10,Scalar(255),5);
///在board上寻找角点
///// Detector parameters
int blockSize = 2;
int apertureSize = 3;
double k = 0.04;
int thresh = 1;
/// Detecting corners
board.convertTo(board,CV_32F);
cornerHarris( board,dst,2,3,0.04);
///// Normalizing
normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );
convertScaleAbs( dst_norm, dst_norm_scaled );
///// Drawing a circle around corners
for( int j = 0; j < dst_norm.rows ; j++ ) {
for( int i = 0; i < dst_norm.cols; i++ ) {
if( (int) dst_norm.at<float>(j,i) > thresh ) {
circle( dst_norm_scaled, Point( i, j ), 5, Scalar(0), 2, 8, 0 );
circle(src,Point( i, j ), 5, Scalar(255,0,0), -1, 8, 0 );
}
}
}










//遍历轮廓,求出所有支撑角度
int icount = bigestContour.size();
float fmax = -1;//用于保存局部最大值
int imax = -1;
bool bstart = false;
for (int i=0;i<bigestContour.size();i++){
Point2f pa = (Point2f)bigestContour[(i+icount-7)%icount];
Point2f pb = (Point2f)bigestContour[(i+icount+7)%icount];
Point2f pc = (Point2f)bigestContour[i];
//两支撑点距离
float fa = getDistance(pa,pb);
float fb = getDistance(pa,pc)+getDistance(pb,pc);
float fang = fa/fb;
float fsharp = 1-fang;
if (fsharp>0.05){
bstart = true;
if (fsharp>fmax){
fmax = fsharp;
imax = i;
}
}else{
if (bstart){
circle(board,bigestContour[imax],10,Scalar(255),1);
circle(src,bigestContour[imax],10,Scalar(255,255,255),1);
imax = -1;
fmax = -1;
bstart = false;
}
}
}

opencv的实用研究--分析轮廓并寻找边界点的更多相关文章
- SQL中的Null深入研究分析
SQL中的Null深入研究分析 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错. Tony Hoare 在1965年发明了 null 引 ...
- TCP异常关闭研究分析
版权声明:本文由谢代斌原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108 来源:腾云阁 https://www.qclo ...
- 介绍了Apache日志文件每条数据的请意义以及一些实用日志分析命令
这篇文章主要介绍了apache日志文件每条数据的请意义,以及一些实用日志分析命令,需要的朋友可以参考下(http://wap.0834jl.com) 一.日志分析 如果apache的安装时采用默认的配 ...
- 【计算机视觉】OpenCV篇(9) - 轮廓(寻找/绘制轮廓)
什么是轮廓? 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 轮廓与边缘好像挺像的? 是的,确实挺像,那么区别是什么呢?简而言之,轮廓是连续的,而边缘并不全都连续(见下图示例).其实边缘主要是 ...
- opencv——形态学深究(分析和应用)
摘要: 形态学一般指生物学中研究动物和植物结构的一个分支.用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具. 基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对 ...
- opencv——PCA(主要成分分析)数学原理推导
引言: 最近一直在学习主成分分析(PCA),所以想把最近学的一点知识整理一下,如果有不对的还请大家帮忙指正,共同学习. 首先我们知道当数据维度太大时,我们通常需要进行降维处理,降维处理的方式有很多种, ...
- OpenCV图像处理与视频分析详解
1.OpenCV4环境搭建 VS2017新建一个控制台项目 配置包含目录 配置库目录 配置链接器 配置环境变量 重新启动VS2017 2.第一个图像显示程序 main.cpp #include< ...
- openCV之头文件分析
我们利用openCV开源库进行项目开发时,往往要牵涉到头文件的添加问题,而openCV中头文件众多,该如何选择呢?下面对openCV2.4.10的头文件进行一个简单的梳理,以便能够快速的添加对应的头文 ...
- opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓
阅读对象:无要求. 1.代码 ''' OpenCV中的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化 ...
随机推荐
- 当As3遇见Swift(二)
字符串:String 都是用String来表示,都是值类型,在传递过程中都会进行拷贝. 计算字符数量 As3: str.length Swift: countElements(str) 数组:Arra ...
- zabbix监控企业esxi虚拟机
zabbix监控企业esxi虚拟机 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我来公司有一段时间了,最近也发现模型部有测试和开发反应某台机器登陆不上去了,结果登陆esxi服务器 ...
- Codeforce Round #219 Div2
妈蛋,C题又没搞出来! 看上去很简单的一题 到是这次的题目意思都比较容易懂,C没弄出来时,回去看了下A,以为来不及了,没想到这次的手速还是可以的7分钟搞出来了,因为太简单- -! A:大于两倍的不行- ...
- .net开发,html ajax开发架构之我见 bs ajax最简化法 Knock out Request,totally oo
.net开发中,无论ajax还是webform,webpage, 总免不了要和request这个静态全局,可以远程通信的对象打交道. 而对于软件来讲,按照Matin Fowler的的面向对象,可利用软 ...
- [原创]java WEB学习笔记56:Struts2学习之路---Struts 版本的 登录 demo
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- MySQL 中NULL和空值的区别 (转载 http://blog.sina.com.cn/s/blog_3f2a82610102v4dn.html)
平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ...
- Android中使用SurfaceView+MediaPlayer+自定义的MediaController实现自定义的视屏播放器
效果图如下: (PS本来是要给大家穿gif动态图的,无奈太大了,没法上传) 功能实现:暂停,播放,快进,快退,全屏,退出全屏,等基本功能 实现的思路: 在主布局中放置一个SurfaceView,在Su ...
- paper 22:kl-divergence(KL散度)实现代码
这个函数很重要: function KL = kldiv(varValue,pVect1,pVect2,varargin) %KLDIV Kullback-Leibler or Jensen-Shan ...
- angular 自定义指令
Template-expanding directive: <div ng-controller="Controller"> <div my-customer&g ...
- Oracle EBS环境下查找数据源(OAF篇)
在用户层设置预制文件:Personalize Self-Service Defn 的值为Yes 来启动个性化模式 参考:http://www.2cto.com/database/201109/1041 ...