C++OpenCV凸包检测实战

本文介绍了如何利用C++和OpenCV进行凸包检测。首先概述了凸包的概念,接着详细阐述了实现流程,包括将图像转为灰度和二值图像,寻找轮廓点,再通过OpenCV的凸包API找出最优轮廓点并连接,形成最终的凸包轮廓。

1.概述

凸包作为计算几何入门必学的知识非常重要,那么什么是凸包呢?

凸包的定义可以理解为给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。在找凸包的时候需要使用向量,因为两向量的叉积的正负可以判断两个向量所处的方位。向量以及相应的操作建议写成结构体的形式封装起来,包括运算符重载。

2.实现流程

  1. 先将图像转化为灰度图像
  2. 转为二值图像
  3. 找到图像全部轮廓点
  4. 使用凸包API从全部轮廓点中找到最优轮廓点
  5. 连接凸包轮廓点

3.完整实验程序

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

using namespace cv;
using namespace std;

// 声明 原始图片,灰度图片,和 canny边缘图片
Mat image, gray_image;

int threshold_value = 100;
int threshold_max = 255;

void convexhull(int, void*);
int main(int argc, char** argv)
{
	// 载入图片
	image = imread("F:/testImage/hand.png");
	// 判断载入图片是否成功
	if (image.empty())
	{
		printf("miss the image file: %d \n", argv[1]);
		return -1;
	}
	imshow("image", ima
### OpenCV中的凸包检测与图像分割 #### 使用OpenCV进行凸包检测OpenCV中,`cv2.convexHull()` 是用于计算给定轮廓的凸包的主要函数。该函数接受一个轮廓作为输入并返回其对应的凸包点集[^1]。这些点可以用 `cv2.polylines()` 绘制出来以便可视化。 以下是实现凸包检测的一个简单示例: ```python import cv2 import numpy as np # 创建一个空白画布 image = np.zeros((500, 500, 3), dtype=np.uint8) # 定义一些随机点 points = np.array([[200, 10], [250, 50], [300, 10], [275, 100], [225, 90]], dtype=np.int32) # 计算凸包 hull = cv2.convexHull(points) # 将点和凸包绘制到图像上 for point in points: cv2.circle(image, (point[0], point[1]), 5, (0, 0, 255), -1) # 蓝色圆圈标记原始点 cv2.polylines(image, [hull], isClosed=True, color=(0, 255, 0), thickness=2) # 绿线连接凸包 # 显示结果 cv2.imshow('Convex Hull', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码展示了如何通过一组二维坐标来找到它们的凸包,并将其显示在一个窗口中[^2]。 #### 基于OTSU阈值化与凸包检测的图像分割 对于更复杂的场景,比如粘连对象的分离,可以结合 OTSU 阈值法和凸包检测技术完成图像分割。下面提供了一个完整的流程实例: ```python import cv2 import numpy as np # 加载灰度图片 img_gray = cv2.imread('rice.jpg', cv2.IMREAD_GRAYSCALE) # 应用 Otsu 方法自动获取最佳阈值 _, img_binary = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 查找外部轮廓 contours, _ = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 初始化绘图变量 result_img = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2BGR) # 对每个轮廓执行操作 for contour in contours: hull = cv2.convexHull(contour) # 获取当前轮廓的凸包 area = cv2.contourArea(hull) # 测量区域大小 if area > 50: # 过滤掉过小的对象 cv2.drawContours(result_img, [hull], -1, (0, 255, 0), 2) # 绘制绿色边界框 # 展示最终效果 cv2.imshow("Segmented Image", result_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此脚本首先加载一张灰度图像,接着利用 Otsu 的自适应阈值得到二值化版本,最后遍历所有发现的轮廓并仅保留那些具有较大面积的目标[^3]。 #### 结论 凸包检测不仅能够帮助识别目标物周围的最小包围多边形,而且还能与其他算法相结合解决实际应用问题,例如物体计数或者形态分析等领域都有重要作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI炮灰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值