0034-使用OpenCV的函数findContours提取轮廓并绘制轮廓

### C++ OpenCV `findContours` 函数计算最大内接矩形 在计算机视觉应用中,检测物体轮廓找到其最大内接矩形是一项常见任务。通过使用OpenCV库中的`cv::findContours`函数可以轻松完成此工作。 为了获取给定图像中对象的最大内切矩形,通常需要经过几个阶段: #### 预处理 首先加载源图像,将其转换为灰度图以便后续处理[^1]。 ```cpp // 加载原始彩色图像 cv::Mat src = cv::imread("path_to_image"); if (src.empty()) { std::cerr << "无法打开或找不到图像\n"; return -1; } // 将输入图像转换成灰度模式 cv::cvtColor(src, grayImage, cv::COLOR_BGR2GRAY); ``` 接着对灰度图像执行二值化操作以突出显示前景目标与背景之间的差异[^2]: ```cpp // 对灰度图像施加固定阈值分割法得到二值图像 cv::threshold(grayImage, binaryImage, 215, 235, cv::THRESH_BINARY); // 定义结构元素用于形态学变换 cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3)); // 执行开运算消除细小干扰物 cv::morphologyEx(binaryImage, cleanedBinaryImage, cv::MORPH_OPEN, kernel); ``` #### 轮廓发现 利用清理后的二值图像调用`cv::findContours()`提取所有封闭边界上的像素点集合形成多边形表示形式的形状轮廓列表: ```cpp std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; // 查找外部轮廓 cv::findContours(cleanedBinaryImage.clone(), contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); ``` #### 寻找最小面积外接矩形 遍历每一个获得的轮廓,在其中寻找能够完全包围该图形且具有最小表面积直角平行四边形作为近似解之一——即所谓的“最大内部矩形”。这里采用`minAreaRect()`方法返回一个旋转角度下的矩形描述子[^3]. ```cpp for(size_t i=0;i<contours.size(); ++i){ // 获取当前轮廓对应的最小面积矩形 cv::RotatedRect minRect = cv::minAreaRect(contours[i]); // 绘制矩形到原图上 cv::Point2f rectPoints[4]; minRect.points(rectPoints); for(int j = 0; j < 4; j++) line(src, rectPoints[j], rectPoints[(j+1)%4], cv::Scalar(0,255,0), 2); } ``` 上述过程展示了如何基于C++编程语言以及OpenCV框架来识别描绘出任意复杂程度的对象轮廓内的最优拟合矩形框体。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值