1、 类比halcon的筛选区域面积的操作select_shape算子,opencv也可以对图形的轮廓进行面积的筛选,剔除无效区域。

int main()
{
Mat srcImage = imread("D:\\Opencv\\Project\\ConnectionProject\\modules_08.png");
imshow("【原图】", srcImage);

//首先对图像进行空间的转换  
Mat grayImage;
cvtColor(srcImage, grayImage, CV_BGR2GRAY);
//对灰度图进行滤波  
GaussianBlur(grayImage, grayImage, Size(3, 3), 0, 0);
imshow("【滤波后的图像】", grayImage);

//为了得到二值图像,对灰度图进行边缘检测  
Mat cannyImage;
Canny(grayImage, cannyImage, 128, 255, 3);
//在得到的二值图像中寻找轮廓  
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(cannyImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

//绘制轮廓  
for (int i = 0; i < (int)contours.size(); i++)
{
drawContours(cannyImage, contours, i, Scalar(255), 1, 8);
}
imshow("【处理后的图像】", cannyImage);

//计算轮廓的面积  
cout << "【筛选前总共轮廓个数为】:" << (int)contours.size() << endl;
for (int i = 0; i < (int)contours.size(); i++)
{
double g_dConArea = contourArea(contours[i], true);
cout << "【用轮廓面积计算函数计算出来的第" << i << "个轮廓的面积为:】" << g_dConArea << endl;
}

//筛选剔除掉面积小于100的轮廓
vector <vector<Point>>::iterator iter = contours.begin();
for (; iter != contours.end();)
{
double g_dConArea = contourArea(*iter);
if (g_dConArea < 100)
{
iter = contours.erase(iter);
}
else
{
++iter;
}
}
cout << "【筛选后总共轮廓个数为:" << (int)contours.size() << endl;
for (int i = 0; i < (int)contours.size(); i++)
{
double g_dConArea = contourArea(contours[i], true);
cout << "【用轮廓面积计算函数计算出来的第" << i << "个轮廓的面积为:】" << g_dConArea << endl;
}
Mat result(srcImage.size(), CV_8U, Scalar(0));
drawContours(result, contours, -1, Scalar(255), 1);   // -1 表示所有轮廓  
namedWindow("result");
imshow("result", result);
waitKey(0);
return 0;

}

筛选前和筛选后的面积对比:

控制台输出数据:第一次轮廓面积个数为295,第二次筛选后面积个数为145,注意这里轮廓面积有正有负。

这里重点是2个算子,findcontours和drawcontours

//! retrieves contours and the hierarchical information from black-n-white image.
CV_EXPORTS_W void findContours( InputOutputArray image, OutputArrayOfArrays contours,
                              OutputArray hierarchy, int mode,
                              int method, Point offset=Point());

Image必须为二值图,可以通过compare(),inRange(),threshold(),adaptiveThreshold(),Canny()这些算子来实现对原图的二值化。

contours为输出的轮廓数组,每一个轮廓用Point类型的vector容器表示。

hierarchy参数和轮廓个数相同,每一个轮廓contour[i]都包含着hieracrchy[i][0],hieracrchy[i][1],hieracrchy[i][2],hieracrchy[i][3],分别表示前一个轮廓,后一个轮廓,父轮廓,内嵌轮廓的索引编号。

mode 表示轮廓的检索模式;

RETR_EXTERNAL表示只检索最外延的轮廓。

RETR_LIST表示检测的轮廓不建立等级关系

RETR_CCOMP建立两个等级的轮廓,上面一层为外边界,里面一层为内孔边界信息,如果孔内还有一个联通物体,这个物体的边界也在顶上,

RETR_TREE建立一个等级树的轮廓,这个实例中采用这种方法。

method表示轮廓的逼近方法

CHAIN_APPROX_NONE存储所有的轮廓点,相邻两个轮廓点的位置差不超过1,

CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形只保留4个点来保存轮廓信息。

CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法 offset表示轮廓的偏移数据,可以设定任何值,在ROI中寻找轮廓,并要在这个图像中分析时,还是很有用的。

//! draws contours in the image

CV_EXPORTS_W void drawContours( InputOutputArray image, InputArrayOfArrays contours,
                              int contourIdx, const Scalar& color,
                              int thickness=1, int lineType=8,
                              InputArray hierarchy=noArray(),
                              int maxLevel=INT_MAX, Point offset=Point() );

contouridx指明画第几个轮廓,如果该参数为负数,-1,则画全部轮廓,

color为轮廓的颜色

thickness为轮廓的线宽,如果为负数或者CV_FILLED表示轮廓内部填充。

linetype表示线型

//绘制轮廓  
for (int i = 0; i < (int)contours.size(); i++)
{
drawContours(cannyImage, contours, i, Scalar(255), 1, 8);
}
imshow("【处理后的图像】", cannyImage);

等效于以下代码:

Mat result(srcImage.size(), CV_8U, Scalar(0));
drawContours(result, contours, -1, Scalar(255), 1);   // -1 表示所有轮廓  
--------------------- 
作者:RobotHeartGo  
原文:https://blog.csdn.net/wuguanghao/article/details/69941598

opencv绘制图形轮廓并筛选面积操作相关推荐

  1. opencv 绘制图像轮廓

    图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用 ...

  2. OpenCV-Python实战(3)——OpenCV中绘制图形与文本

    OpenCV-Python实战(3)--OpenCV中绘制图形与文本 0. 前言 1. OpenCV 绘图基础 2. OpenCV绘制图形 2.1 基本图形的绘制 2.1.1 直线 2.1.2 矩形 ...

  3. OpenCV-Python实战(番外篇)——OpenCV中利用鼠标事件动态绘制图形

    OpenCV-Python实战(番外篇)--OpenCV中利用鼠标事件动态绘制图形 使用鼠标事件动态绘制 动态绘制图形 动态绘制图形和文本 相关链接 使用鼠标事件动态绘制 我们已经在<OpenC ...

  4. 如何使用OpenCV绘制简单的几何图形?

    要使用OpenCV绘制图形,除了cv2库之外,我们还需要便于进行矩阵操作的numpy库: import cv2 as cv import numpy as np 空白窗口 先展示代码: blank = ...

  5. opencv 利用图像轮廓函数填充圆环内部 图像轮廓函数应用小例子

    实验: import cv2 as cv import numpy as np# 1.读入圆环 img = cv.imread('circle_ring.jpg') img_gray = cv.cvt ...

  6. 基于OpenCV实战:绘制图像轮廓(附代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高 ...

  7. 【opencv图像处理】--2. 颜色空间,绘制图形,绘制(中文)文本

    "人群里敞着一扇门" 1. 颜色空间的基础知识 1.1 色彩空间转换 2. mat数据结构的深浅拷贝 ndarray的常见属性 3.颜色通道的分离和合并 4. 绘制图形 5. 绘制 ...

  8. OpenCV:02基础知识和绘制图形

    文章目录 OpenCV的色彩空间 RGB和BGR `HSV`,`HSL`和`YUV` `HSV(HSB)` `HSL` `YUV` 颜色空间的转化 OpenCV的一种重要数据结构--Mat Mat介绍 ...

  9. opencv——图像中关于轮廓的一些操作

    背景: vs2015+opencv3.4.14 图像中斑点的轮廓提取.轮廓信息自定义保存和对于提取出的轮廓的连接操作. //寻找轮廓findContours(); //绘制每个轮廓的最小外接矩形Rot ...

  10. 02- OpenCV绘制图形及图像算术变换 (OpenCV系列) (机器视觉)

    知识重点 OpenCV用的最多的色彩空间是HSV. 方便OpenCV做图像处理 img2 = img.view()     # 浅拷贝 img3 = img.copy()    # 深拷贝 split ...

最新文章

  1. String spilt时转义特殊字符【转】
  2. vue中 静态文件引用注意事项
  3. Postfix的bcc邮件备份
  4. WP8.1学习系列(第二十五章)——控件样式
  5. 3.1 Tensorflow: 批标准化(Batch Normalization)
  6. (解题思路)Entity Framework 如动态创建表或者列
  7. 【linux】 redhat中设置时区
  8. matlab练习程序(各向异性扩散)
  9. Node.js webpack Vue单文件
  10. uniapp 开发踩坑记录
  11. 父子页面iframe相互调用方法详解
  12. java对象的序列化和反序列化_Java对对象的序列化和反序列化详解
  13. js高程读书笔记(1-3章)
  14. STM32F103ZET6+ADF4351+HMI串口屏
  15. 网上开店,网店系统选择的那些事
  16. html 超链接下载文件问题 如何修改文件名称
  17. 海尔计算机天越Y3的配置,海尔天越Y3S 拉近你与梦想的距离!
  18. GJM : AlloyTouch实战--60行代码搞定QQ看点资料卡
  19. Unity功能点---模拟枪械射击时的后坐力
  20. arm嵌入式web服务器 性能,arm嵌入式web服务器

热门文章

  1. 如何实现chrome谷歌浏览器多开(独立环境 独立cookie)
  2. PxCook的基本使用
  3. mac android studio keymap,Android Studio keymap for Mac
  4. Java参数校验工具validation
  5. 桌面的计算机图标误删了怎么恢复,删除桌面图标-如何恢复桌面图标不小心将某个程序的桌面图标给删了,怎么恢复呢 爱问知识人...
  6. 2012“第四届云计算中国峰会”倒计时
  7. shell日志分析脚本
  8. [DataAnalysis]基于统计假设检验的机器学习模型性能评估——泛化误差率的统计检验
  9. Windows套接字I/O模型(3) -- WSAAsyncSelect模型
  10. 200道Java灵魂考题:全部掌握拿下阿里P7腾讯T3.2