opencv_c++学习(二十一)

这篇具有很好参考价值的文章主要介绍了opencv_c++学习(二十一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、图像的轮廓检测

opencv_c++学习(二十一)
轮廓检测函数:

findContours(lnputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode, int method, Point offset = Point())

image:输入图像,数据类型为CV_8U的单通道灰度图像或者二值化图像。contours:检测到的轮廓,每个轮廓中存放着像素的坐标。
mode:轮廓检测模式标志。
method:轮廓逼近方法标志。
offset:每个轮廓点移动的可选偏移量。这个函数主要用在从ROI图像中找出的轮廓并基于整个图像分析轮廓的场景中。
轮廓绘制函数:

drawContours(InputoutputArray image, lnputArrayOfArrays contours,int contourldx, const Scalar & color, int thickness = 1, int lineType = LINE_8,hierarchy =, lnputArray noArray (), int maxLevel = INT_PAX, Point offset = Point())

image:绘制轮廓的目标图像。
contours:所有将要绘制的轮廓。
contourldx:要绘制的轮廓的参数,如果是负数,则绘制所有的轮廓。
color:绘制轮廓的颜色。
应用案例代码如下:

int main() {

	//更改输出界面的颜色
	system("color F0");

	//读取图片
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat gray, binary;
	//转化为灰度图
	cvtColor(src, gray, COLOR_BGR2GRAY);
	//高斯平滑滤波
	GaussianBlur(gray, gray, Size(13, 13), 4, 4);
	//自适应二值化
	threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);

	//轮廓检测
	vector<vector<Point>>contours;
	//存放轮廓结构变量
	vector<Vec4i>hierarchy;

	findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//绘制轮廓
	for (int i = 0; i < hierarchy.size(); i++)
	{
		cout << hierarchy[i] << endl;
	}

	for (int t = 0; t < contours.size(); t++)
	{
		drawContours(src, contours, -1, Scalar(0, 0, 255), 2, 6);
		imshow("q", src);
		waitKey(0);
	}

	//输出轮廓结构描述

	return 0;
}

二、轮廓信息统计

轮廓面积计算函数:

contourArea(lnputArray contour, bool oriented = false)

contour:轮廓的像素点。
oriented:区域面积是否具有方向的标志,true表示面积具有方向性,false表示不具有方向性,默认值为不具有方向性的false。
轮廓长度计算函数:

arcLength(InputArray curve, bool closed)

curve:轮廓或者曲线的2D像素点。
closed:轮廓或者曲线是否闭合标志,true表示闭合。
应用案例如下:

int main() {

	//更改输出界面的颜色
	system("color F0");

	//读取图片
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat gray, binary;
	//转化为灰度图
	cvtColor(src, gray, COLOR_BGR2GRAY);
	//高斯平滑滤波
	GaussianBlur(gray, gray, Size(13, 13), 4, 4);
	//自适应二值化
	threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);

	//轮廓检测
	vector<vector<Point>>contours;
	//存放轮廓结构变量
	vector<Vec4i>hierarchy;

	findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//输出轮廓面积
	for (int i = 0; i < contours.size(); i++)
	{
		double area1 = contourArea(contours[i]);
		cout << area1 << endl;
	}

	//输出轮廓长度
	for (int i = 0; i < contours.size(); i++)
	{
		double length1 = arcLength(contours[i], true);
		cout << length1 << endl;
	}

	return 0;
}

三、轮廓外接多边形拟合

轮廓外接矩形函数:

boundingRect(lnputArray array)

轮廓最小面积外界矩形:

minAreaRect(lnputArray points)

array:输入的灰度图像或者2D点集,数据类型为vector或者Mat。

轮廓多边形拟合:

approxPolyDP(InputArray curve, OutputArray approxCurve,double epsilon, bool closed)

curve:输入轮廓像素点。
approxCurve:多边形逼近结果,以多边形顶点坐标的形式给出。
epsilon:逼近的精度,即原始曲线和逼近曲线之间的最大距离。
closed:逼近曲线是否为封闭曲线的标志,true表示曲线封闭,即最后一个顶点与第一个顶点相连。
轮廓外接矩形函数、轮廓最小面积外界矩形应用案例:

int main() {

	//读取图片
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//深拷贝两张图像,用来做不同的外接图形操作
	Mat img1, img2;
	src.copyTo(img1);
	src.copyTo(img2);
	
	//canny的边缘检测
	Mat canny;
	Canny(src, canny, 80, 160, 3, false);

	//膨胀运算,去除细小缝隙
	Mat kernel = getStructuringElement(0, Size(3, 3));
	dilate(canny, canny, kernel);

	//轮廓检测
	vector<vector<Point>>contours;
	//存放轮廓结构变量
	vector<Vec4i>hierarchy;

	findContours(canny, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//寻找轮廓的外接矩形
	for (int n = 0; n < contours.size(); n++)
	{
		//最大外接矩形
		Rect rect = boundingRect(contours[n]);
		rectangle(img1, rect, Scalar(0, 0, 255), 2, 8, 0);

		//最小外接矩形
		RotatedRect rrect = minAreaRect(contours[n]);
		Point2f points[4];
		
		//读取最小外接矩形的四个顶点
		rrect.points(points);

		//最小外接矩形中心
		Point2f cpt = rrect.center;

		//绘制转转矩形与中心位置
		for (int i = 0; i < 4; i++)
		{
			if (i == 3)
			{
				line(img2, points[i], points[0], Scalar(0, 255, 0), 2, 8, 0);
				break;
			}
			line(img2, points[i], points[i+1], Scalar(0, 255, 0), 2, 8, 0);
		}
		//绘制矩形中心
		circle(img2, cpt, 4, Scalar(255, 0, 0), -1, 8, 0);

		imshow("q", img1);
		imshow("w", img2);
		waitKey(0);
		return 0;
	}
}

轮廓多边形拟合应用案例:文章来源地址https://www.toymoban.com/news/detail-457994.html

void drawapp(Mat result, Mat img2)
{
	for (int n = 0; n < result.rows; n++)
	{
		//将第一个点与最后一个点相连
		if (n == result.rows - 1)
		{
			Vec2i point1 = result.at<Vec2i>(n);
			Vec2i point2 = result.at<Vec2i>(0);
			line(img2, point1, point2, Scalar(0, 255, 0), 2, 8, 0);
			break;
		}

		Vec2i point1 = result.at<Vec2i>(n);
		Vec2i point2 = result.at<Vec2i>(n + 1);
		line(img2, point1, point2, Scalar(0, 255, 0), 2, 8, 0);

	}
}

int main() {

	//读取图片
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	
	//canny的边缘检测
	Mat canny;
	Canny(src, canny, 80, 160, 3, false);

	//膨胀运算,去除细小缝隙
	Mat kernel = getStructuringElement(0, Size(3, 3));
	dilate(canny, canny, kernel);

	//轮廓检测
	vector<vector<Point>>contours;
	//存放轮廓结构变量
	vector<Vec4i>hierarchy;

	findContours(canny, contours, hierarchy, 0, 2, Point());

	//绘制多边形
	for (int i = 0; i < contours.size(); i++)
	{
		//用最小外接矩形求取轮廓中心
		RotatedRect rrect = minAreaRect(contours[i]);

		//最小外接矩形中心
		Point2f cpt = rrect.center;

		circle(src, cpt, 2, Scalar(255, 0, 0), 2, 8, 0);

		Mat result;
		//进行多边形拟合
		approxPolyDP(contours[i], result, 4, true);

		//绘制多边形
		drawapp(result, src);

	}

	imshow("q", src);
	waitKey(0);
	return 0;
}

到了这里,关于opencv_c++学习(二十一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv_c++学习(二十五)

    1、海瑞斯角点不可能出现在图像平滑的区域(上图1); 2、图像边缘的支线出不可能出现海瑞斯角点(上图2); 3、海瑞斯角点会出现在顶点处。(上图3); 上图中的下半部分红色圆圈内就是海瑞斯角点常出现的地方。 如上图第一个式子,海瑞斯角点就是将窗口移动后的数

    2024年02月07日
    浏览(29)
  • opencv 基础50-图像轮廓学习03-Hu矩函数介绍及示例-cv2.HuMoments()

    Hu 矩(Hu Moments)是由计算机视觉领域的科学家Ming-Kuei Hu于1962年提出的一种图像特征描述方法。这些矩是用于描述图像形状和几何特征的不变特征,具有平移、旋转和尺度不变性,适用于图像识别、匹配和形状分析等任务。 Ming-Kuei Hu在其论文中提出了七个用于形状描述的独特

    2024年02月13日
    浏览(42)
  • OpenCV 图像轮廓检测

            本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式、轮廓逼近算子等操作。         图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检测和识别中很有用。图像轮廓的作用

    2024年01月25日
    浏览(39)
  • opencv图像轮廓检测

    效果展示: 代码部分:

    2024年02月12日
    浏览(38)
  • OpenCV图像处理——轮廓检测

    2024年02月13日
    浏览(34)
  • 【Python】OpenCV-图像轮廓检测初学

    在图像处理领域中,轮廓检测是一项重要的任务,用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测,并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。 图像轮廓检测是图像处理中的一项关键技术,可用于检测物体的形状、

    2024年02月21日
    浏览(35)
  • opencv(七)Canny边缘检测和图像轮廓检测

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 1、检测步骤 1)使用高斯滤波器,以平滑图像,滤掉噪声。 2)计算图像中每个像素点的梯度强度和方向 3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应 4)应用双阈值(

    2024年02月04日
    浏览(41)
  • 如何在OpenCV中实现图像的边缘检测和轮廓提取?opencv教程

    在OpenCV中,可以使用边缘检测算法和轮廓提取函数来实现图像的边缘检测和轮廓提取。以下是一种常用的方法: 边缘检测: 在OpenCV中,常用的边缘检测算法包括Canny边缘检测和Sobel算子。 Canny边缘检测: Canny边缘检测是一种广泛使用的边缘检测算法,它能够有效地检测出图像

    2024年02月15日
    浏览(26)
  • opencv中轮廓检测以及轮廓近似的分析——轮廓近似原理,所有代码开源,所有函数的参数。

            对于轮廓检测的步骤可简述为:读取图像 - 图像二值化 - 找出轮廓 - 在原图像上画出轮廓这么四个步骤。 下面先是讲每个步骤的代码,步骤后会写关键步骤的原理。         首先是读取图像,在本次实验中是将获取到的轮廓画在原图像上所以需要获取原图像和

    2024年02月20日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包