使用OpenCV可以对图像的轮廓进行检测。这是之前用过的代码,挺简单的,回顾一下。主要要进行以下2步操作:

1.cvThreshold():对图像进行二值化处理

2.cvFindContours():查找图像轮廓

注意:这个过程中图像要转化为灰度图。

  1. /***********************************************************************
  2. 雷霄骅
  3. ***********************************************************************/
  4. #include "stdafx.h"
  5. #include "cv.h"
  6. #include "cxcore.h"
  7. #include "highgui.h"
  8.  
  9. int main( int argc, char** argv )
  10. {
  11. //声明IplImage指针
  12. IplImage* pImg = NULL;
  13. IplImage* pContourImg = NULL;
  14.  
  15. CvMemStorage * storage = cvCreateMemStorage(0);
  16. CvSeq * contour = 0;
  17. int mode = CV_RETR_EXTERNAL;
  18.  
  19. if( argc == 3)
  20. if(strcmp(argv[2], "all") == 0)
  21. mode = CV_RETR_CCOMP; //内外轮廓都检测
  22.  
  23. //创建窗口
  24. cvNamedWindow("src", 1);
  25. cvNamedWindow("contour",1);
  26. cvNamedWindow("threshold",1);
  27.  
  28. //载入图像,强制转化为Gray
  29. if( argc >= 2 &&
  30. (pImg = cvLoadImage( argv[1], 0)) != 0 )
  31. {
  32.  
  33. cvShowImage( "src", pImg );
  34.  
  35. //为轮廓显示图像申请空间
  36. //3通道图像,以便用彩色显示
  37. pContourImg = cvCreateImage(cvGetSize(pImg),
  38. IPL_DEPTH_8U,
  39. 3);
  40. //copy source image and convert it to BGR image
  41. cvCvtColor(pImg, pContourImg, CV_GRAY2BGR);
  42. //----阈值分割-------------------------------------------
  43. cvThreshold( pImg, pImg, 150, 255, CV_THRESH_BINARY );
  44. cvShowImage( "threshold", pImg );
  45. //-----------------------------------------------
  46. //查找contour----------------输入必须是二值图像
  47. cvFindContours( pImg, storage, &contour, sizeof(CvContour),
  48. mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
  49.  
  50. }
  51. else
  52. {
  53. //销毁窗口
  54. cvDestroyWindow( "src" );
  55. cvDestroyWindow( "contour" );
  56. cvReleaseMemStorage(&storage);
  57.  
  58. return -1;
  59. }
  60.  
  61. //将轮廓画出
  62. cvDrawContours(pContourImg, contour,
  63. CV_RGB(0,0,255), CV_RGB(255, 0, 0),
  64. 2, 2, 8, cvPoint(0,0));
  65. //显示图像
  66. cvShowImage( "contour", pContourImg );
  67.  
  68. cvWaitKey(0);
  69.  
  70. //销毁窗口
  71. cvDestroyWindow( "src" );
  72. cvDestroyWindow( "contour" );
  73. //释放图像
  74. cvReleaseImage( &pImg );
  75. cvReleaseImage( &pContourImg );
  76.  
  77. cvReleaseMemStorage(&storage);
  78.  
  79. return 0;
  80. }

源图像:

二值化以后:

轮廓:

OpenCV 轮廓检测的更多相关文章

  1. OpenCV轮廓检测,计算物体旋转角度

    效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入 ...

  2. OpenCV图像轮廓检测

    轮廓检测: 轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 一.关键函数1.1  cvFindContours函数功能:对图像进行轮廓检测,这个函数将 ...

  3. OpenCV—Python 轮廓检测 绘出矩形框(findContours\ boundingRect\rectangle

    千万注意opencv的轮廓检测和边缘检测是两码事 本文链接:https://blog.csdn.net/wsp_1138886114/article/details/82945328 1 获取轮廓 O ...

  4. 第十七节,OpenCV(学习六)图像轮廓检测

    1.检测轮廓 轮廓检测是图像处理中经常用到的,OpenCV-Python接口中使用cv2.findContours()函数查找检测物体的轮廓. cv2.findContours(image, mode ...

  5. opencv--图像轮廓检测

    //图像的轮廓检测上 //By MoreWindows (http://blog.csdn.net/MoreWindows) #include <opencv2/opencv.hpp> u ...

  6. [转载+原创]Emgu CV on C# (七) —— Emgu CV on 轮廓检测

    轮廓检测 对于查找轮廓我们一般要对图像Canny检测.但是对于很特殊的场合其实我们还可以直接对二值化的图像进行轮廓的提取. 关键函数 1. cvFindContours Retrieves conto ...

  7. OPENCV条形码检测与识别

    条形码是当前超市和部分工厂使用比较普遍的物品,产品标识技术,使用摄像头检测一张图片的条形码包含有两个步骤,第一是定位条形码的位置,定位之后剪切出条形码,并且识别出条形码对应的字符串,然后就可以调用网络 ...

  8. OpenCV矩形检测

    OpenCV矩形检测 需求:提取图像中的矩形,图像存在污染现象,即矩形区域不是完全规则的矩形. 思路一:轮廓法 OpenCV里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像, ...

  9. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..

    1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...

随机推荐

  1. GC对象分配规则

    1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC. 2.大对象直接进入老年代(大对象是指需要大量连续内存空间的对象).这样做的目的是避免在Eden区和两个S ...

  2. 大数据基础知识问答----spark篇,大数据生态圈

    Spark相关知识点 1.Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架 dfsSpark基于mapredu ...

  3. Android简易实战教程--第四十三话《上拉加载与下拉刷新》

    ListView的下拉刷新很常见,很多开源的框架都能做到这个效果,当然也可以自己去实现.本篇案例是基于xlistview的. 布局: <RelativeLayout xmlns:android= ...

  4. Swift中关于任意类型的数组

    在Objc中你是不可以把一个非对象类型放入数组的,你必须将其"封箱",然后再放入数组. 在Swift中你可将非对象类型轻松放入数组: let ary = [1,2,3] 你可以明确 ...

  5. EBS多组织结构

    1. 业务组: 它代表组织结构的最高层次, 它分离了人力资源的信息. 例如, 当你查询人员时, 它会列出所有分配给相应业务组的成员, 而你自己所属于的组织只不过是业务组的一份子. 这样说可能造成一种误 ...

  6. LInux last命令详解

    命令简介:     该命令用来列出目前与过去登录系统的用户相关信息.指令英文原义:show listing of last logged in users 执行权限 :有些需要特殊权限 指令所在路径: ...

  7. UNIX网络编程——Socket/TCP粘包、多包和少包, 断包

    为什么TCP 会粘包 前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个数据包不完整.为什么会这样吗,我们用mina这样通信框架,还会出现这种问题? TCP(transport cont ...

  8. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...

  9. octave installation on RHEL6.4

    octave installation on RHEL6.4 rhel6.4上安装octave GNU Octave 是一种高级语言,主要设计用来进行数值计算,它是 MathWorks 出品的 Mat ...

  10. android开发之broadcast学习笔记

    android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一 ...