【OpenCV基础】物体轮廓检测和面积计算

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处


1.轮廓检测

分为四个流程:
(1)输入图像转为灰度图像cvtColor

(2)使用Canny进行边缘提取,得到二值图像

(3)使用findContours寻找轮廓
在这里插入图片描述
(4)使用drawContours绘制轮廓
在这里插入图片描述

2.部分代码

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main() {
	Mat src, Gau_src, gray_src, binary_src;
	src = imread("D:/images/hand.jpg"); 
	if (src.empty()) {
		cout << "Could not load the image ...." << endl;
		return -1;
	}
	imshow("input_image", src);

	GaussianBlur(src, Gau_src, Size(3, 3), 0, 0,4);
	cvtColor(Gau_src, gray_src, COLOR_BGR2GRAY);
	threshold(gray_src, binary_src, 80, 255,THRESH_BINARY);
	imshow(" binary_src", binary_src);

	vector<vector<Point>>contours;
	findContours(binary_src, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point());
	for (int t = 0; t < contours.size(); t++) {
		drawContours(src, contours, t, Scalar(0, 0, 255), 1, 8);
	double	a = contourArea(contours[t]);
	cout << "第" << t << "轮廓面积" << a<<endl;
	}
	imshow("Circle_image", src);
	waitKey(0);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

3.全部代码

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat src, dst;
const char* input_win = "【输入图像】";
const char* output_win = "【输出图像】";
int threshold_value = 100;
int threshold_max = 255;
RNG rng;

void Demo_Contours(int, void*);

int main()
{
	src = imread("D:/images/lena.png");
	if (!src.data)
	{
		cout << "could not load image !";
		return -1;
	}
	namedWindow(input_win, WINDOW_AUTOSIZE);
	namedWindow(output_win, WINDOW_AUTOSIZE);
	imshow(input_win, src);
	cvtColor(src, src, COLOR_BGR2GRAY);

//创建滑动条
	const char* trackbar_title = "Threshold Value:";
	createTrackbar(trackbar_title, output_win, &threshold_value, threshold_max, Demo_Contours);
	Demo_Contours(0, 0);

	waitKey(0);
	return 0;
}

void Demo_Contours(int, void*) {
	Mat canny_output;
	vector<vector<Point>> contours;
	vector<Vec4i> hierachy;
	Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);
	findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

	dst = Mat::zeros(src.size(), CV_8UC3);
	RNG rng(12345);
	for (size_t i = 0; i < contours.size(); i++) {
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));
	}
	imshow(output_win, dst);
}

4.效果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌小超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值