【练习8.5】轮廓长度计算机cvApproxPoly逼近

页内索引
题目要求 程序代码 结果图片 要言妙道 借鉴参考

题目要求:

a、检测轮廓并计算轮廓长度

b、分别使用1/90,1/66,1/11,1/10做为精度参数,使用cvApproxPoly逼近,计算轮廓长度并画出结果

程序代码:

 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点。
 2 //
 3 //    string file_full_name = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第8章\\r20.jpg";
 4
 5
 6 #include "stdafx.h"
 7 #include<string>
 8 #include <cv.h>
 9 #include <highgui.h>
10 #include <iostream>
11 #include<math.h>
12
13 #include <opencv2/legacy/legacy.hpp>
14 //#pragma comment(lib, "opencv_legacy2411.lib")
15
16 using namespace cv;
17 using namespace std;
18
19 //函数声明-->--->-->--->-->--->-->--->//
20
21
22 //<--<--<--<--<--<--<--<--<--函数声明//
23
24 int _tmain(int argc, _TCHAR* argv[])
25 {
26     string file_full_name = "D:\\Work\\Work_Programming\\Source\\Image\\OpenCVExerciseImage\\第8章\\r20.jpg";
27
28     IplImage * image_source = cvLoadImage(file_full_name.c_str(), CV_LOAD_IMAGE_GRAYSCALE);
29     CV_Assert(image_source);
30
31     IplImage * image_binary = cvCloneImage(image_source);
32     cvZero(image_binary);
33
34     cvThreshold(image_source, image_binary, 125, 255, CV_THRESH_BINARY);
35
36     CvMemStorage *storage = cvCreateMemStorage();
37     CvSeq* first_contour=NULL;
38     int contour_num;
39     contour_num = cvFindContours(image_binary, storage, &first_contour, sizeof(CvContour), CV_RETR_LIST);
40
41     cout << "轮廓数" << contour_num << endl;
42
43     double contour_length;
44     //for (CvSeq * c = first_contour; c != NULL; c = c->h_next)
45     //{
46     //    contour_length = cvContourPerimeter(c);
47     //    cout << "周长" << contour_length << endl;
48     //}
49     contour_length = cvContourPerimeter(first_contour);
50     cout << "周长" << contour_length << endl;
51
52     double perimeter = 126.7;
53     double parameters[4] = { 126.7 / 90, 126.7 / 66, 126.7 / 11, 126.7 / 10 };
54     CvMemStorage* storage_approx = cvCreateMemStorage();
55
56     IplImage *image_approx = cvCloneImage(image_binary);
57     cvZero(image_approx);
58     CvSeq *seq_approx=NULL;
59
60     string window_name = "Approx窗口";;
61     for (int i = 0; i < 4; ++i)
62     {
63         seq_approx = cvApproxPoly(first_contour, sizeof(CvContour), storage_approx, CV_POLY_APPROX_DP, parameters[i], 0);
64         contour_length = cvContourPerimeter(seq_approx);
65         cout << contour_length << endl;
66         window_name = window_name + ".";
67         cvDrawContours(image_approx, seq_approx, cvScalar(255), cvScalar(125), 0);
68         cvShowImage(window_name.c_str(), image_approx);
69     }
70
71     cvWaitKey(0);
72
73     cvReleaseImage(&image_source);
74     cvReleaseImage(&image_binary);
75     cvReleaseImage(&image_approx);
76     cvDestroyAllWindows();
77
78     return 0;
79 }

结果图片:

要言妙道:

借鉴参考:

时间: 2024-08-03 03:04:43

【练习8.5】轮廓长度计算机cvApproxPoly逼近的相关文章

OpenCV &mdash;&mdash; 轮廓

把检测出的边缘像素组装成轮廓  --  cvFindContours   OpenCV 使用内存存储器来统一管理各种动态对象的内存.内存存储器在底层被实现为一个有许多相同大小的内存块组成的双向链表 内存储器可以通过四个函数访问 : cvCreateMemStorage(创建一个内存存储器,0采用默认大小)    cvReleaseMemStorage   cvClearMemStorage(和通常释放内存的函数区别 -- 只是将释放的内存返还给内存存储器,而并不返还给系统 -- 可以重复使用内存

OpenCV 轮廓基本特征

一.概述 我们通过cvFindContours( )函数获取得图像轮廓有何作用呢?一般来说,我们对轮廓常用的操作有识别和处理,另外相关的还有多种对轮廓的处理,如简化或拟合轮廓,匹配轮廓到模板,等等. 我们在轮廓处理中经常需要对轮廓变化一些特征进行概括,比如长度或者一些反映轮廓整体大小的度量.另外轮廓矩也是概括轮廓的特征的重要方法. 二.常见特征函数 1.多边形逼近 CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemSt

OPENCV图像轮廓检测

前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像轮廓检测. 一.图像轮廓检测 在opencv中,轮廓对应着一系列的点的集合,opencv提供了一个函数,用来获得这些点的集合 API:void finContours(输入图像,输出轮廓点集,输出向量,int 轮廓检索模式,int 轮廓近似方法,Point 轮廓点的可选偏移量) 注:1.输入图像,是

物体轮廓检测

int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_contour,int header_size=sizeof(CvContour),int mode=CV_RETR_LIST,int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) ); 这个函数用起来很方便,但是随着你使用的深入,你会发现有一些迷惑在这里.比如当你提取轮廓时只需要最外

OpenCV提取轮廓 去掉面积小的轮廓

转自:http://www.kaixuela.net/?p=23 #include <stdio.h> #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> using namespace std; #pragma comment(lib,"cv.lib") #pragma comment(lib,&qu

Opencv2系列学习笔记10(提取连通区域轮廓) 另一个

http://blog.csdn.net/lu597203933/article/details/17362457 连通区域指的是二值图像中相连像素组成的形状.而内.外轮廓的概念及opencv1中如何提取二值图像的轮廓见我的这篇博客:http://blog.csdn.net/lu597203933/article/details/14489225 轮廓的简单提取算法如下: 系统性地扫描图像直到遇到连通区域的一个点,以它为起始点,跟踪它的轮廓,标记边界上的像素.当轮廓完整闭合,扫描回到上一个位置,

POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算

求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的,这样理论上是对的 要注意处理高度相同的线段,把底边优先处理(在代码里就是f标记为1的线段),因为若是一个矩形的底边和另一个矩形的上边重合,则这个轮廓肯定不能算 不过POJ和HDU的数据好像都比较弱,我没进行上面的细节处理也AC了,不过一个很简单的数据就会不对,所以还是要处理一下才是真正正确的代码 我

[初赛备战]计算机基础知识错题集(1)

这里整理一些错题,太sb的题就没放上来了,有些题还有疑问,求大佬解答,然后解析都是来自网络(wiki和百度百科),无法保证正确性. 在微机中,通用寄存器的位数是() A.8 位    B.16 位   C.计算机字长  D.32 位 计算机字长不仅是CPU一次可处理的位数,同时也是寄存器的位数. 不同的计算机,其指令系统也不相同,这主要取决于( ) A.所用的 CPU    B.所用的操作系统   C.所用的程序设计语言  D.系统的总体结构 主要是取决于所用的CPU指令系统的意思是计算机硬件的

opencv 轮廓的外围多边形提取或者删除最小最大轮廓

std::vector resultpoly; cv::approxPolyDP(contours[0], resultpoly,4, true);//轮廓contours[0] ,resultpoly多边形的点集 cv::polylines(src, resultpoly, true, 150, 1);//画多边形的外轮廓 cv::imshow("detected polyLines", src);//显示多边形的外轮廓 //相关链接https://www.cnblogs.com/d