图像轮廓提取算法(Opencv基于C++实现)

本文主要实现了图像的轮廓提取,首先先给出直观的轮廓实现结果:

0. 实现结果如下:

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

1. 打开图像代码

注意图片存放路径不能出现中文,不然会报错!

	CString defaultDir = _T("请选择路径"); //设置默认打开文件夹
	CString fileFilter = _T("文件(*.jpg;*.bmp)|*.jpg;*.bmp|All File (*.*)|*.*||"); //设置文件过滤
	CFileDialog fileDlg(true, defaultDir, _T(""), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, fileFilter, NULL);
	//弹出选择文件对话框

	if (fileDlg.DoModal() == IDOK)
	{
		filePath = fileDlg.GetPathName();//得到完整的文件名和目录名拓展名  
		CString filename = fileDlg.GetFileName();
	}
	char * A = CStringToChar(filePath); //CString转换Char
	Mat image = imread(A, 1);
	imshow("image", image);

2. 轮廓提取函数

寻找轮廓函数:findContours()

//函数原型:
void findContours//提取轮廓,用于提取图像的轮廓
(
InputOutputArray image,//输入图像,必须是8位单通道图像,并且应该转化成二值的
OutputArrayOfArrays contours,//检测到的轮廓,每个轮廓被表示成一个point向量
OutputArray hierarchy,//可选的输出向量,包含图像的拓扑信息。其中元素的个数和检测到的轮廓的数量相等
int mode,//说明需要的轮廓类型和希望的返回值方式
int method,//轮廓近似方法
Point offset = Point()
)

绘制轮廓函数: drawContours()

//函数原型:
void drawContours//绘制轮廓,用于绘制找到的图像轮廓
(
 InputOutputArray image,//要绘制轮廓的图像
 InputArrayOfArrays contours,//所有输入的轮廓,每个轮廓被保存成一个point向量
 int contourIdx,//指定要绘制轮廓的编号,如果是负数,则绘制所有的轮廓
 const Scalar& color,//绘制轮廓所用的颜色
 int thickness = 1, //绘制轮廓的线的粗细,如果是负数,则轮廓内部被填充
 int lineType = 8, /绘制轮廓的线的连通性
 InputArray hierarchy = noArray(),//关于层级的可选参数,只有绘制部分轮廓时才会用到
 int maxLevel = INT_MAX,//绘制轮廓的最高级别,这个参数只有hierarchy有效的时候才有效
                                          //maxLevel=0,绘制与输入轮廓属于同一等级的所有轮廓即输入轮廓和与其相邻的轮廓
                                          //maxLevel=1, 绘制与输入轮廓同一等级的所有轮廓与其子节点。
                                          //maxLevel=2,绘制与输入轮廓同一等级的所有轮廓与其子节点以及子节点的子节点
 Point offset = Point()
)

3. 代码实现

完整的C++与Opencv代码实现如下:

#include "opencv/highgui.h"
#include "opencv/cv.h"
using namespace cv;

void main()
{
	// TODO:  在此添加控件通知处理程序代码
	CString defaultDir = _T("请选择路径"); //设置默认打开文件夹
	CString fileFilter = _T("文件(*.jpg;*.bmp)|*.jpg;*.bmp|All File (*.*)|*.*||"); //设置文件过滤
	CFileDialog fileDlg(true, defaultDir, _T(""), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, fileFilter, NULL);
	//弹出选择文件对话框

	if (fileDlg.DoModal() == IDOK)
	{
		filePath = fileDlg.GetPathName();//得到完整的文件名和目录名拓展名  
		CString filename = fileDlg.GetFileName();
	}
	char * A = CStringToChar(filePath); //CString转换Char
	Mat image = imread(A, 1);
	imshow("image", image);

	Mat gray;
	cvtColor(image, gray, CV_BGR2GRAY);
	GaussianBlur(gray, gray, Size(3, 3), 3, 3);
	Mat img;
	threshold(gray, img, 100, 255, THRESH_BINARY);
	imshow("二值", img);
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(img, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
	Mat resultImage = Mat::zeros(img.size(), CV_8UC3);
	drawContours(resultImage, contours, -1, CV_RGB(0, 20, 180),3);
	imshow("resultImage", resultImage);

}
  • 2
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
质心跟踪(Centroid Tracking)是一种目标跟踪的算法,它可以通过连续的图像帧来跟踪目标的运动轨迹。在 OpenCV 中,可以通过以下步骤来实现质心跟踪算法: 1. 读取视频或摄像头采集的视频帧。 2. 对每一帧进行预处理,例如使用高斯模糊、二值化等方式来减少噪声干扰。 3. 对预处理后的图像进行轮廓检测,找到目标的轮廓。 4. 对每个轮廓计算质心,即该轮廓的重心坐标。 5. 将每个质心与上一帧的质心进行匹配,以确定目标的运动轨迹。 下面是一个简单的 C++ 代码示例,演示如何实现质心跟踪算法: ```cpp #include <opencv2/opencv.hpp> // 引入 OpenCV 库 using namespace cv; int main() { VideoCapture cap(0); // 打开摄像头 if (!cap.isOpened()) // 摄像头打开失败 return -1; Mat frame, gray, blur, thresh; std::vector<std::vector<Point>> contours; std::vector<Point2f> centroids; namedWindow("Frame", WINDOW_NORMAL); while (waitKey(1) != 'q') // 按 'q' 键退出 { cap >> frame; // 读取视频帧 if (frame.empty()) // 视频结束 break; cvtColor(frame, gray, COLOR_BGR2GRAY); // 转为灰度图 GaussianBlur(gray, blur, Size(5, 5), 0); // 高斯模糊 threshold(blur, thresh, 100, 255, THRESH_BINARY); // 二值化 findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 轮廓检测 centroids.clear(); for (const auto& contour : contours) { Moments m = moments(contour); Point2f c = Point2f(m.m10 / m.m00, m.m01 / m.m00); centroids.push_back(c); circle(frame, c, 3, Scalar(0, 0, 255), -1); // 在质心处画一个圆 } imshow("Frame", frame); // 显示结果 } return 0; } ``` 这段代码中,我们使用了 OpenCV 的 VideoCapture 类来打开摄像头,并循环读取视频帧。然后,我们将每一帧图像转换为灰度图,并进行高斯模糊和二值化处理,以减少噪声干扰和提取目标的轮廓。接着,我们使用 findContours 函数来检测轮廓,然后计算每个轮廓的质心坐标。最后,我们将每个质心坐标绘制在原图上,并显示结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LV小猪精

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

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

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

打赏作者

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

抵扣说明:

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

余额充值