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,一经查实,立即删除!

相关文章

Eclipse 导入项目乱码问题

Eclipse 导入项目乱码问题 1.编码不对 a.对某文件或某工程更改编码&#xff1a; 鼠标移到工程名或文件名&#xff0c;右键->Properties->Resource->Text file enCoding ->更改编码&#xff08;GBK、UTF-8等&#xff09;->Apply->OK退出 b.修改整个命名空…

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

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

mysql中的comment用法

mysql中的comment用法 在MySQL数据库中&#xff0c;字段或列的注释是用属性comment来添加。 创建新表的脚本中&#xff0c; 可在字段定义脚本中添加comment属性来添加注释。 示例代码如下&#xff1a; create table test( id int not null default 0 comment ‘用户id’ ) 如…

docker 安装mysql_Docker安装MySQL完整版流程

我们自己在linux上安装mysql的话&#xff0c;超级麻烦&#xff0c;安装完后还要进行各种各样的配置&#xff0c;之前在docker专题写了用docker安装mysql的快速版本以及修改编码的方式&#xff0c;这里总结一下安装流程和命令。环境Linux version 3.10.0-693.2.2.el7.x86_64dock…

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程序…

mysql index subquery_[慢查优化]慎用MySQL子查询,尤其是看到DEPENDENT SUBQUERY标记时

它的执行计划如下&#xff0c;请注意看关键词“DEPENDENT SUBQUERY”&#xff1a;id select_type table type possible_keys key key_len ref rows Extra------ ------------------ ------ ------------…

java程序开发步骤

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

mysql数据库rp集群_MySQL集群入门(PXC)

目标&#xff1a;1.掌握PXC集群MySQL方案的原理&#xff1b;2.掌握PXC集群的强一致性&#xff1b;3.掌握PXC集群的高可用方案&#xff1b;硬件要求&#xff1a;1.Win10x64企业版/linux/MacOS&#xff1b;2.Docker虚拟机&#xff1b;3.内存8GB以上&#xff1b;单节点数据库的弊端…

标识符、命名规则

标识符&#xff1a;是指在程序中&#xff0c;我们自己定义的内容。比如&#xff1a;类的名字、方法的名字和变量的名字等等&#xff1b; 命名规则&#xff1a;&#xff08;硬性要求&#xff09; 标识符可以包含英文字母26个&#xff08;区分大小写&#xff09;&#xff0c;0-9…

ssh源码编译安装mysql_总结源码编译安装mysql

最近在学习源码编译安装LAMP、LNMP时&#xff0c;一直遇到一个难题&#xff0c;就是就是mysql无论怎么源码编译安装&#xff0c;到最后启动服务都提示"Starting MySQL.The server quit without updating PID file (/data/mysql/localhost.pid). [FAILED]&quo…

java中的常量

常量&#xff1a;在程序运行期间&#xff0c;固定不变的量。 常量的分类&#xff1a; 字符串常量&#xff1a;凡是用双引号引起来的部分&#xff0c;如&#xff1a;“abc”,“Hello”,“123”整数常量&#xff1a;直接写上的数字&#xff0c;没有小数点&#xff0c;如&#xf…

mysql blgg__MySQL_exceptions.ProgrammingError:(2014,“命令不同步;您现在无法运行此命令”)?...

-- encoding: utf-8 --db_test.pyCreated on 2019/6/25 11:14Copyright (c) 2019/6/25, 海牛学院版权所有.author: 潘牛from commons.until.db_util import DBUtilfrom configs.config import _HAINIU_DBdb_util DBUtil(_HAINIU_DB)设置字符集是utf8mb4db_util.execute_no_com…

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

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

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

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

数字和字符对照关系表常用(编码表)

ASCII码表&#xff1a;美国信息交换标准代码 Unicode码表&#xff1a;万国码&#xff0c;也是数字和字符的对照关系&#xff0c;开头0-127部分和ASCII完全一样&#xff0c;但是从128开始包含更多字符。 ‘0’——48 ‘A’——65 ‘a’——97

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

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