opencv轮廓周长原理_opencv轮廓逼近的精度参数与周长cvContourPerimeter的汇总

1)CV_Assert():若括号中的表达式值为false,则返回一个错误信息。

函数原型是:#define CV_Assert( expr ) if((expr)) ; else cv::error

( cv::Exception(CV_StsAssert, #expr, "", __FILE__, __LINE__) )

2)cvContourPerimeter:函数作用于一个轮廓并返回其长度。事实上,

这个函数是一个调用通用函数cvArcLength的宏。

double cvArcLength(const void *curve,CvSlice slice =CV_WHOLE_SEQ,

int is_closed=-1);

curve:第一个参数是轮廓,其形式可以是点的序列(CvContour *或CvSeq *)

或任一n*2的点的数组。

slice:表面是否将轮廓视为闭合的一个布尔类型(例如,是否将轮廓的

最后一个点视为和第一个点有连接)。

slice可以让我们只选择曲线(curve)上的点的部分集合。

#define cvContourPerimeter(contour)

cvArcLength(contour,CV_WHOLE_SEQ,1)

代码:

#include

#include

#include

#include

#include

#include

using namespace cv;

using namespace std;

int main()

{

cvNamedWindow("ff",1);

string file_full_name = "D:\\VC98\\C++项目\\opencv\\cvContourPerimeter\\cvContourPerimeter\\a4.png";

IplImage * image_source = cvLoadImage(file_full_name.c_str(), CV_LOAD_IMAGE_GRAYSCALE);

CV_Assert(image_source);//若括号中的表达式值为false,则返回一个错误信息。

IplImage * image_binary = cvCloneImage(image_source);

cvZero(image_binary);

//在二值化图像的过程中,阀值很关键,将决定黑白化的效果。

cvThreshold(image_source, image_binary, 205, 255, CV_THRESH_BINARY);//二值化

cvShowImage("ff",image_binary);

CvMemStorage *storage = cvCreateMemStorage();

CvSeq* first_contour=NULL;

int contour_num;

contour_num = cvFindContours(image_binary, storage, &first_contour, sizeof(CvContour), CV_RETR_LIST);//轮廓获取

cout << "轮廓数为:" << contour_num << endl;

double contour_length;

//for (CvSeq * c = first_contour; c != NULL; c = c->h_next)

//{

//    contour_length = cvContourPerimeter(c);

//    cout << "周长" << contour_length << endl;

//}

contour_length = cvContourPerimeter(first_contour);//计算轮廓长度

cout << "周长为:";

cout<< contour_length << endl;

double perimeter = 126.7;//轮廓精度

double parameters[4] = { 126.7 / 90, 126.7 / 66, 126.7 / 11, 126.7 / 10 };

CvMemStorage* storage_approx = cvCreateMemStorage();

IplImage *image_approx = cvCloneImage(image_binary);

cvZero(image_approx);

CvSeq *seq_approx=NULL;

string window_name = "Approx窗口";

for (int i = 0; i < 4; ++i)

{   //分别用4中精度来进行多边形逼近轮廓,是一个轮廓

seq_approx = cvApproxPoly(first_contour, sizeof(CvContour), storage_approx, CV_POLY_APPROX_DP, parameters[i], 0);

contour_length = cvContourPerimeter(seq_approx);//每一次都计算出逼近轮廓的长度,也是一个轮廓

cout << i<

window_name = window_name + "1";//区别4个窗口

cvDrawContours(image_approx, seq_approx, cvScalar(255), cvScalar(125), 0);//画出轮廓

cvShowImage(window_name.c_str(), image_approx);

if(i==0)

cvSaveImage("result.jpg",image_approx);

if(i==1)

cvSaveImage("result1.jpg",image_approx);

if(i==2)

cvSaveImage("result2.jpg",image_approx);

if(i==3)

cvSaveImage("result3.jpg",image_approx);

}

cvWaitKey(0);

cvReleaseImage(&image_source);

cvReleaseImage(&image_binary);

cvReleaseImage(&image_approx);

cvDestroyAllWindows();

return 0;

}

结果:输入一个椭圆图:

e3e8e33f911e7e0387757352c5d7c483.png

一下图的精度参数分别对应: 126.7 / 90,126.7 / 66, 126.7 / 11, 126.7 / 10

5036c7cff684358ac20049c9dba47c28.png 图1

8e997183bcd93c79796c805d38710eb0.png图2,

6de4b5a007c7786ee5628ffcca20492d.png图3

3d0b90649041fbb25219e38874bb849f.png图4,

b0de7b6f2136fa5b8ee9cd551000130d.png

椭圆内部的折线就是多边形逼近轮廓的过程。不难发现,parameters精度参数值越小,

精度要求越大,多边形逼近越接近实际轮廓。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql的所有聚合函数_MySQL 聚合函数(一)聚合(组合)函数概述

MySQL版本:5.7+ 一、MySQL 5.7中的聚合函数 MySQL 5.7中的聚合函数如下: 除非另有说明,否则组合函数会忽略NULL值。 如果在不包含Group By子句的语句中使用组合函数,就等效于对所有行进行分组。(个人理解是,结果总是只有一行。)关于这点的更多信息,后面的小节“MySQL处理…

mysql 转型_MySQL的未来在哪?

阿里云 MySQL&MariaDB 数据库产品结合开源社区&#xff0c;提供了稳定、可靠、便捷、弹性的在线数据库服务&#xff0c;帮助全球企业客户进行数字化转型。MySQL发展经历了一系列变化&#xff0c;从Sun到Oracle&#xff0c;发展也经过了几个阶段。MySQL从5.7版本开始走上了代…

mongoose换成mysql_如何将MongoDB数据库的数据迁移到MySQL数据库中

FAQ v2.0终于上线了&#xff0c;断断续续忙了有2个多月。这个项目是我实践的第一个全栈的项目&#xff0c;从需求(后期有产品经理介入)到架构&#xff0c;再到设计(有征询设计师的意见)、构建(前端、后台、数据库、服务器部署)&#xff0c;也是第一次独立负责一个项目&#xff…

java虚拟机——JVM

JVM&#xff1a;java虚拟机&#xff0c;简称JVM&#xff0c;是运行所有java程序的假想计算机&#xff0c;是java程序的运行环境&#xff0c;是java最具吸引力的特征之一。我们编写的java代码&#xff0c;都运行在JVM之上。 跨平台&#xff1a;任何软件的运行&#xff0c;都必须…

mysql 5.0.37.tar.gz_Linux下MySQL5.0.37安装配置步骤

Linux下安装MySQL5.0.37需要以下面三个包:MySQL-client-community-5.0.37-0.rhel3.i386.rpmMySQL-server-community-5.0.37-0.rhel3.i386.rpmperl-DBI-1.53-2.fc7.i386.rpm(以下步骤需要root权限)1.验证是否已经安装过MySQLrpm -qa|grep MySQL如果发现有安装过,并需要卸载,使用…

JRE和JDK

JRE&#xff1a;是java程序的运行时环境&#xff0c;包含JVM和运行时所需要的核心类库。 JDK&#xff1a;时java程序开发工具包&#xff0c;包含JRE和开发人员使用的工具。 我们想要运行一个已有的java程序&#xff0c;那么只需要安装JRE即可。 我们想要开发一个全新的java程序…

java程序开发步骤

java程序开发步骤 开发环境搭建完毕后&#xff0c;可以开发第一个程序了 java程序开发三个步骤&#xff1a;编写&#xff0c;编译&#xff0c;运行。

thinkphp三级分销小程序源码_山东谷道微信小程序商城源码带后台 公众号平台三级分销系统...

山东谷道微信小程序商城源码带后台 公众号平台三级分销系统那么微信二级分销系统与微信三级分销系统到底有什么区别和联系呢?为什么改了个数字地位就天差地别?1、微信分销模式等级的区别用简洁的话来说&#xff0c;微信的三级分销系统包含了微信的二级分销系统&#xff0c;只…

linux mysql timestamp_MySQL时间类型Timestamp和Datetime 的深入理解

MySQL数据库常用的时间类型有timestamp和datetime&#xff0c;两者主要区别是占用存储空间长度不一致、可存储的时间也有限制&#xff0c;但针对不同版本下&#xff0c;timestamp字段类型的设置需要慎重&#xff0c;因为不注意的可能会被“坑死”。一、TIMESTAMP和DATETIME字段…

sql express 无法启动服务_在Windows2012下安装SQL Server 2005无法启动服务的解决办法...

因为安装了Windows2012操作系统&#xff0c;的确很不错&#xff0c;唯一的遗憾就是不支持Sql Server 2005的安装。找了很多办法&#xff0c;基本上都有缺陷。现在终于找到一种完全正常没有缺陷的办法了&#xff0c;和大家分享一下。1、正常安装任一版本的SQL Server 2005.2、安…

ecs php mysql集成环境_在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境...

阿里云的云服务器(ECS)可以选择多种操作系统&#xff0c;打算用它运行 Drupal或者 WordPress &#xff0c;你最好选择 Linux 系统&#xff0c;这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器。我们在上面搭建一个 nginx mysql php-fpm 的环境&#xff0c;这就是常说的…

python处理文件夹_python文件及文件夹操作

1.open()各模式详情r 以只读模式打开&#xff0c;没有write()方法&#xff0c;默认打开方式w 以只写模式打开&#xff0c;文件不存在时会自动创建文件&#xff0c;文件已存在时会清除文件内容并重建文件。这种模式打开的文件没有read()方法。a 以追加模式打…

svn中项目管理中ec_Mac中使用svn进行项目管理

Mac中使用svn进行项目管理,借鉴了http://blog.csdn.net/q199109106q/article/details/8655204以下方案多人亲测可用转载请注明出处&#xff1a;http://blog.csdn.net/yc7369在Windows环境中&#xff0c;我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下&#xff0c;由于Mac自…

10067mysql_MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)

《MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)》要点&#xff1a;本文介绍了MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。MYSQL入门后来在做WordPress,一开始还不知道…

java类的定义的实例_《Java基础知识》Java类的定义及其实例化

类必须先定义才能使用。类是创建对象的模板,创建对象也叫类的实例化。下面通过一个简单的例子来理解Java中类的定义:public classDog {String name;intage;void bark()//汪汪叫{System.out.println("汪汪&#xff0c;不要过来");}voidhungry(){System.out.println(&q…

excel mysql插件_智分析Excel插件

智分析Excel插件官方版是一款好用的自助分析云平台&#xff0c;智分析Excel插件官方版是一款面向业务用户的EXCEL插件工具&#xff0c;智分析Excel插件官方版支持各类云端数据库、本地excel数据导入功能&#xff0c;软件能够将本地数据和线上数据结合起来分析。软件可以帮助办公…

【计算机网络】——习题解析:一个UDP用户数据的数据字段为8192字节,在数据链路层要使用以太网来传输,试问应当划分为几个IP数据报片?说明每一个IP数据报字段长度和片偏移字段的值

【计算机网络】——习题解析&#xff1a;一个UDP用户数据的数据字段为8192字节&#xff0c;在数据链路层要使用以太网来传输&#xff0c;试问应当划分为几个IP数据报片&#xff1f;说明每一个IP数据报字段长度和片偏移字段的值 答&#xff1a;6个数据字段的长度&#xff1a;前5…

网络协议,各层功能,各层协议

一、OSI七层模型 OSI七层协议模型主要是&#xff1a;应用层&#xff08;Application&#xff09;、表示层&#xff08;Presentation&#xff09;、会话层&#xff08;Session&#xff09;、传输层&#xff08;Transport&#xff09;、网络层&#xff08;Network&#xff09;、数…

fastdfs java token_fastdfs-client-java操作fastdfs

一、在https://github.com/happyfish100/fastdfs-client-java 下载客户端&#xff0c;解压后并执行ant命令&#xff0c;在E:\tools\libs\fastdfs\fastdfs-client-Java-master\src\build下会生成fastdfs_client.jar如图示二、mvn安装fastdfs_client.jar&#xff0c;在cmd中执行命…

idea编辑器中使用@Data注解无效解决办法

使用Data注解可以减少了以前的get和set等方法&#xff0c;但是在idea编辑器中不认识会在使用实体类元素时候找不到&#xff08;但是运行不会报错&#xff09; 所以可以添加插件