步骤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;
}

转载于:https://blog.51cto.com/flyclc/1540050

第19集 轮廓的提取相关推荐

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

    http://ronny.blog.51cto.com/8801997/1394139 OpenCV成长之路:直线.轮廓的提取与描述 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  2. 在线会议中人脸面部轮廓图像提取(三)——Dlib库人脸面部轮廓图像特征提取

    前言:所使用图片并无盈利等目的,如有侵犯他人肖像权请联系删除. 当当当当,第三期来廖!接上一期在线会议中人脸面部轮廓图像提取(二)--HOG人脸面部轮廓图像特征提取,介绍完HOG特征提取我们继续学习D ...

  3. 【OpenCV】直线、轮廓的提取与描述

    基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. ...

  4. MATLAB应用实战系列(四十五)-matlab任意图形轮廓坐标提取【含源代码】

    细心的伙伴不难发现上图的每个图形外面都画了一圈黑色虚线,不错,这些虚线就是根据图形轮廓提取的图像坐标绘制的. 之前有伙伴在咱们的QQ交流群中询问有关图像轮廓坐标提取的问题,今天就给大家念叨念叨. 今天 ...

  5. 越狱(第二季)19集,开始了!

    越狱(第二季)19集,开始了 转载于:https://www.cnblogs.com/qc1984326/archive/2007/03/11/670715.html

  6. Kubernetes系列(一)基于CentOS8部署Kubernetes1.19集群

    1.系统环境 系统版本:CentOS8.1.1911 Kubernetes版本:1.19.1 Docker版本:19.03.1 节点信息: 10.24.10.3 master 10.24.10.6 n ...

  7. 《LabVIEW数据采集》视频教程第19集:数值型数据—复数

    <LabVIEW数据采集>视频教程第19集:数值型数据-复数

  8. 耶鲁大学博弈论公开课全24集第19集笔记:招商引资和战略投资

    耶鲁大学博弈论公开课全24集第19集笔记:招商引资和战略投资 1. 视频地址 2. 本集思维导图 3. 上集回顾 4. 案例一:"别搞砸了" 4.1 问题分析 4.2 冗余的指示告 ...

  9. OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  10. 机器视觉运动控制一体机应用例程|轮廓在线提取与轮廓轨迹加工(下)

    应用背景 在实际的机器视觉应用项目中,常常需要提取在相机视野下不同形状的样品,根据样品的轮廓轨迹位置进行轮廓轨迹加工处理. 上期课程中我们讲述了轮廓在线提取与轮廓轨迹加工中视觉的轮廓提取部分.本期课程 ...

最新文章

  1. mongo报错:not authorized on bb to execute command { create: \“xxx\“...}
  2. 26岁创造UNIX,退休后却成为一名飞行员,这位编程界大佬不走寻常路
  3. input[type=checkbox] ; input[type=radio] 改变默认样式
  4. 在 Linux 环境下,我用了这款端口扫描工具~
  5. 用pip命令把python包安装到指定目录
  6. 基于Java的Selenium学习笔记——Assert
  7. html ascii编码方式,HTML 字符集 参考手册
  8. 冰汽朋克侦查机器人_冰汽时代生病机制是什么 寒霜朋克所有机制漏洞一览
  9. 文本挖掘学习笔记(二):文档信息向量化与主题关键词提取
  10. 在cmd指令看计算机位数,如何判断电脑是32位还是64位
  11. JS indexOf 用法
  12. 苹果手机电池保养再用两年!
  13. 有道单词导入 大量有道单词 生词本 批量导入 添加 有道单词XML 背单词
  14. php自学难_php难吗?自学要多久?需要报培训班吗?
  15. 在线电子书阅读微信小程序 毕业设计(3)图书列表
  16. echarts在中国地图上绘制各省指标
  17. cocos creator 优化之相机渲染 drawcall优化
  18. windows下Linux系统U盘启动盘制作与系统安装图文教程
  19. php mysql 排班表_PHP倒班五班三倒
  20. kermit的安装、配置、使用等

热门文章

  1. sql server 2005 T-SQL @@TOTAL_WRITE (Transact-SQL)
  2. 分割 反比 权重图 梯度 灰度_numpy gradient梯度函数1
  3. 传输层协议(11):超时重传
  4. 块层介绍 第一篇: bio层
  5. 设备树解析过程及platform设备注册
  6. fatal error: highgui.h: No such file or directory
  7. 数据包接收系列 — 上半部实现(内核接口)
  8. 求大于3的素数c语言,c语言判断一个大于3的数是否是素数
  9. shell 逐行读取文件
  10. rdlc报表 矩形高固定_什么是 BI?和报表有什么关系?有了 BI 还要做报表吗?