首页 > 其他分享 >【OpenCV】-查找并绘制轮廓

【OpenCV】-查找并绘制轮廓

时间:2023-02-14 17:02:28浏览次数:37  
标签:vector hierarchy Point int OpenCV 查找 参数 轮廓 绘制


文章目录

  • ​​1 寻找轮廓:findContours()函数​​
  • ​​2 绘制轮廓:drawContours()函数​​
  • ​​3 示例程序​​

1 寻找轮廓:findContours()函数

说明:findContours()函数是在二值图像中寻找轮廓

void findContours(InputArray image,OutArrayofArray contours,OutputArray hierarchy,int mode,int method,Point offset=Point())
  • 第一个参数:输入图像,Mat类的二值图像。可以使用compare()、inrange()、threshold()、adaptivethreshold()、canny()等函数把灰度图或者彩色图创建成二值图。
  • 第二个参数:OutArrayofArray类型的contours,检测到的轮廓、函数调用后的运算结果存在这里。每个轮廓存储为一个点向量
  • 第三个参数:输出向量,包含图像的拓扑信息。其作为轮廓数量的表示,包含了许多元素。每个轮廓contours[i]对应4个hierarchy元素:hierarchy[i] [0]~ hierarchy[i] [3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果没有对应项,对应的hierarchy[i]值设为负数
  • 第四个参数:轮廓检索模式
  • 【OpenCV】-查找并绘制轮廓_#include

  • 第五个参数:int类型的method,为轮廓的近似办法
  • 【OpenCV】-查找并绘制轮廓_默认值_02

  • 第六个参数:Point类型的offset,每个轮廓点的可选偏移量,有默认值Point()。对ROI图像中找出的轮廓,并要在整个图像中进行分析时,这个参数便可有用

2 绘制轮廓:drawContours()函数

说明:drawContours()函数用于在图像中绘制外部或内部轮廓

void drawContours(InputOutputArray image,InputArrayOfArrays contours,int contourIdx,const Scalar & color,int thickness=1,int lineType=8,InputArrayhierarchy=noArray(),int maxLevel=INT_MAX,Point offset=Point())
  • 第一个参数:目标图像
  • 第二个参数:所有的输入轮廓。每个轮廓存储一个点向量,即用Point类型的vector表示
  • 第三个参数:int 类型的contourIdx,轮廓绘制的指示变量。如果为负数,则绘制所有轮廓
  • 第四个参数:轮廓颜色
  • 第五个参数:int thickness,轮廓线条的粗细度,默认值1.如果为负数值(如thickness=cv_filled),便绘制在轮廓的内部
  • 第六个参数:线条的类型,默认值8
  • 【OpenCV】-查找并绘制轮廓_#include_03

  • 第七个参数:可选的层次结构信息,默认值noArray()
  • 第八个参数:int类型的maxLevel,表示用于绘制轮廓的最大等级,有默认值INT_MAX
  • 第九个参数:Point类型的offset,可选的轮廓偏移参数,用指定的偏移量offset=(dx,dy)偏移需要绘制的轮廓。默认值Point()

补充:

opencv中vector类的用法:
1、文件包含:
首先在程序开头处加上#include<vector>以包含所需要的类文件vector,还有一定要加上using namespace std。
2、变量声明:
(1) 例:声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。
(2)例:用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector <int *> a。同理想用向量代替三维数组也是一样,vector <int**>a。

3 示例程序

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("E:\\Pec\\lunk.jpg", 0);
imshow("【原始图】", srcImage);
//初始化结果图
Mat dstImage = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC3);
//srcImage取大于阈值119的部分,取二值图
srcImage = srcImage > 190;
imshow("【取阈值后的原始图】", srcImage);
//定义轮廓和层次结构
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
//查找轮廓
findContours(srcImage, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
//遍历所有顶层的轮廓,以随机颜色绘制出每个连接组件颜色
int index = 0;
for (; index >= 0; index = hierarchy[index][0])
{
Scalar color(rand() % 255, rand() % 255, rand() % 255);
//Scalar color(0, 255, 0);
//外轮廓
drawContours(dstImage, contours, index, color, 2, 8, hierarchy);
}
imshow("【轮廓图】", dstImage);
waitKey(0);
}

【OpenCV】-查找并绘制轮廓_计算机视觉_04

绘制内轮廓:

for (; index >= 0; index = hierarchy[index][0])
{
Scalar color(rand() % 255, rand() % 255, rand() % 255);
//Scalar color(0, 255, 0);
//内轮廓
drawContours(dstImage, contours, index, color, FILLED, 8, hierarchy);
}

【OpenCV】-查找并绘制轮廓_人工智能_05


标签:vector,hierarchy,Point,int,OpenCV,查找,参数,轮廓,绘制
From: https://blog.51cto.com/u_14935708/6057325

相关文章

  • 【OpenCV】- 分水岭算法
    文章目录​​什么是图像分割​​​​分水岭算法​​​​1、实现分水岭算法:watershed()函数​​​​2、处理流程(视频)​​​​3、示例程序(书中)​​什么是图像分割将图像中像素......
  • 查找数组中指定的元素
    indexOfconstarr=[1,2,3,4,5,1]console.log(arr.indexOf(1))//0`indexOf只能查找数组中简单数据类型且返回对应元素的索引,如果没有则返回-1,如果存在多......
  • 雷达图的绘制(绘制圆的拓展)
    usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Linq;usingUnityEngine;usingUnityEngine.UI;///<summary>///雷达图And圆///提示:///1......
  • 【opencv c++】实现yolov5部署onnx模型完成目标检测
    总代码#include<fstream>#include<sstream>#include<iostream>#include<opencv2/dnn.hpp>#include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>usin......
  • 二维数组中的查找
    问题:矩阵从左至右、从上至下非递减顺序,查找target是否在数组中剑指Offer04.二维数组中的查找-力扣(LeetCode)方法一:标志数flag:选择左下角或者右上角为标志数;选择左下......
  • 使用 Kitten 编程猫绘制一个 Y 方向平铺的立方体集合
    效果如下图所示:我们实际上使用了2D来模拟3D效果。应用程序启动时,默认只绘制一个立方体,因此我们在初始绘制的函数里,只执行动态绘制X方向的立方体这一个逻辑。因为默......
  • 二分查找
    二分查找思路:找到最后一个小于等于IP的元素找到第一个大于等于IP的元素前提条件:数据有序随机访问实现:递归实现非递归(循环实现)注意事项:循环退出条件mid......
  • 数组的排序和查找
    1.数组156注意数组知识点double[]hens={3,5,1,3.4,2,50};1.double[]表示是double类型的数组,数组名hens2.{3,5,1,3.4,2,50}表示数组的值/元素,依次表示数......
  • OpenCV连续显示类似视频一样
    cv::VideoCapturevideo=VideoCapture(); video.open("D:\\Temp\\Videos\\黄原胶.mp4");//读取视频 if(!video.isOpened()){ printf("couldnotreadthisvideofil......
  • OpenCV-Python扩充数据集
    在深度学习中,数据集规模直接影响模型训练后的性能。当我们数据集较少的时候可以通过不同的手段对现有的数据进行扩充。比如裁切,翻转,旋转,加入噪点,调整亮度等手段进行数据集......