第19集 轮廓的提取

步骤1:转化为二值图像,因为cvFindContours要求必须为二值图像:cvThreshold

步骤2:备份二值图像,因为cv FindContours 会改变原二值图像:cvClone或cvCopy

步骤3:创建彩***像(在原图上用红色边框表示轮廓)和黑白图像(只画出轮廓)用于演示:cvCreateImage,cvCvtColor

步骤4:查找轮廓: cvCreateMemStorage,cvFindContours

步骤5:打印结果:cvGetSeqElem,cvSetReal2D,cvSet2D

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
int FindContours(int argc,char** argv)
{
IplImage* src=cvLoadImage("e:\\FindContours.png",CV_LOAD_IMAGE_GRAYSCALE); //注意要以灰度图像方式加载,默认1为彩***像
cvNamedWindow("src");
cvShowImage("src",src);
//步骤1:转化为二值图像,因为cvFindContours要求必须为二值图像
IplImage* BinaryImage=cvCreateImage(cvGetSize(src),8,1);
cvZero(BinaryImage);
cvThreshold(src,BinaryImage,100,255,CV_THRESH_BINARY);
//cvNamedWindow("BinaryImage");
//cvShowImage("BinaryImage",BinaryImage);
//步骤2:备份二值图像,因为cvThreshold会改变原二值图像
IplImage *BinaryImageClone=(IplImage *)cvClone(BinaryImage);
cvNamedWindow("BinaryImageClone");
cvShowImage("BinaryImageClone",BinaryImageClone);
//步骤3:创建彩***像(在原图上用红色边框表示轮廓)和黑白图像(只画出轮廓)用于演示
IplImage *ContoursColor=cvCreateImage(cvGetSize(src),8,3);
cvZero(ContoursColor);
cvCvtColor(BinaryImage,ContoursColor,CV_GRAY2BGR); //把原图处理成的灰度二值图转换为BGR彩***
IplImage *ContoursGray=cvCreateImage(cvGetSize(src),8,1);
cvZero(ContoursGray);
//步骤4:查找轮廓
CvMemStorage* storage=cvCreateMemStorage(0);
cvClearMemStorage(storage);
CvSeq* FirstPoint=0;
//方式1:CV_RETR_EXTERNAL,只寻找最外轮廓
//cvFindContours(BinaryImage,storage,&FirstPoint,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
//方式2:CV_RETR_LIST,寻找所有轮廓,并且用CvSeq*的h_next和h_prev和从右到左,从内到外串起来
//cvFindContours(BinaryImage,storage,&FirstPoint,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
//方式3:CV_RETR_CCOMP,寻找所有轮廓,并且用CvSeq*的h_next,h_prev和v_next,v_prev和从右到左,从内到外串起来
//内轮廓和外轮廓之间用v_next,v_prev;内轮廓和内轮廓,外轮廓和外轮廓之间用h_next,h_prev
cvFindContours(BinaryImage,storage,&FirstPoint,sizeof(CvContour),CV_RETR_CCOMP,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
//方式4:CV_RETR_TREE,从最高到最低按照树形结构用双向指针串起来
//cvFindContours(BinaryImage,storage,&FirstPoint,sizeof(CvContour),CV_RETR_TREE,CV_CHAIN_APPROX_NONE,cvPoint(0,0));
cvNamedWindow("FindContours");
cvShowImage("FindContours",BinaryImage);
CvSeq* PointTemp=FirstPoint;
//步骤5:打印结果
for(;PointTemp!=NULL;PointTemp=PointTemp->h_next)
{
for(int i=0;i<PointTemp->total;i++)
{
CvPoint *point=(CvPoint *)cvGetSeqElem(PointTemp,i);
cvSetReal2D(ContoursGray,point->y,point->x,255.0);
cvSet2D(ContoursColor,point->y,point->x,cvScalar(0,0,255,NULL));
}
CvSeq* vnext=PointTemp->v_next;
for(;vnext!=NULL;vnext=vnext->h_next)
{
for(int k=0;k<vnext->total;k++)
{
CvPoint *point=(CvPoint *)cvGetSeqElem(vnext,k);
cvSetReal2D(ContoursGray,point->y,point->x,255.0);
cvSet2D(ContoursColor,point->y,point->x,cvScalar(0,0,255,NULL));
}
}
}
cvNamedWindow("ContoursColor");
cvShowImage("ContoursColor",ContoursColor);
cvNamedWindow("ContoursGray");
cvShowImage("ContoursGray",ContoursGray);
cvWaitKey(0);
cvDestroyWindow("src");
cvDestroyWindow("BinaryImage");
cvDestroyWindow("BinaryImageClone");
cvDestroyWindow("ContoursColor");
cvDestroyWindow("ContoursGray");
cvReleaseImage(&src);
cvReleaseImage(&BinaryImage);
cvReleaseImage(&BinaryImageClone);
cvReleaseImage(&ContoursColor);
cvReleaseImage(&ContoursGray);
cvReleaseMemStorage(&storage);
return 0;
}

第19集 轮廓的提取

时间: 2024-11-04 10:05:20

第19集 轮廓的提取的相关文章

OpenCV成长之路:直线、轮廓的提取与描述

http://ronny.blog.51cto.com/8801997/1394139 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ronny.blog.51cto.com/8801997/1394139 基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. 一.Canny检测轮

OpenCV入门教程之八 直线、轮廓的提取与描述

基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. 一.Canny检测轮廓 在上一篇文章中有提到sobel边缘检测,并重写了soble的C++代码让其与matlab中算法效果一致,而soble边缘检测是基于单一阈值的,我们不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题.而canny算子则很好的弥补了这一不足,从目前看来,canny边缘检测在

智慧解析第19集:老子开导你

智慧解析第19集:老子开导你,布布扣,bubuko.com

python数字图像处理(19):骨架提取与分水岭算法

骨架提取与分水岭算法也属于形态学处理范畴,都放在morphology子模块内. 1.骨架提取 骨架提取,也叫二值图像细化.这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示. morphology子模块提供了两个函数用于骨架提取,分别是Skeletonize()函数和medial_axis()函数.我们先来看Skeletonize()函数. 格式为:skimage.morphology.skeletonize(image) 输入和输出都是一幅二值图像. 例1: from s

mysql-cluster-gpl-7.3.19集群安装及问题(3台机器)

主要教程参考这里:https://blog.csdn.net/chengfei112233/article/details/7703812 会根据实际操作过程中的问题进行改动 系统:Centos7mysql软件:mysql-cluster-gpl-7.3.19-linux-glibc2.12-x86_64.tar 下载地址: http://cdn.mysql.com/Downloads/MySQL-Cluster-7.3/mysql-cluster-gpl-7.3.19-linux-glibc2

【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形

FindContours 在二值图像中寻找轮廓 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) ); image  输入的 8-比特.单通道图像.

matlab 提取图像轮廓(图像边缘提取)

利用edge()函数提取图像轮廓,绘制出对象的边界和提取边界坐标信息,matlab实现代码如下: close all;clear all;clc; % 提取图像轮廓,提取图像边缘 I = imread('yifu.jpg'); c = im2bw(I,graythresh(I)); figure; subplot(131);imshow(I); c = flipud(c); %实现矩阵c上下翻转 b = edge(c,'canny'); [u,v] = find(b); %返回边界矩阵b中非零元

FP-growth高效频繁项集发现

FP-growth 算法优缺点: 优点:一般快于Apriori 缺点:实现比较困难,在某些数据上性能下降 适用数据类型:标称型数据 算法思想: FP-growth算法是用来解决频繁项集发现问题的,这个问题再前面我们可以通过Apriori算法来解决,但是虽然利用Apriori原理加快了速度,仍旧是效率比较低的.FP-growth算法则可以解决这个问题.FP-growth算法使用了频繁模式树(Frequent Pattern Tree)的数据结构.FP-tree是一种特殊的前缀树,由频繁项头表和项前

RPM包校验和提取

一.RPM包校验 [[email protected] Packages]# rpm -V 已安装的包名 #选项: #????-V????校验指定RPM包中的文件(verify) [[email protected] Packages]# vim /etc/httpd/conf/httpd.conf????????---> 对包的配置文件进行修改 [[email protected] Packages]# rpm -V httpd????????????????????---> 对修改后的包再