• c++处理图像---绘制物体的凸包:cv::convexHull


    绘制物体的凸包cv::convexHull

    cv::convexHullOpenCV中用于计算点集的凸包(convex hull)的函数。凸包是包围点集的最小凸多边形,该多边形的所有内部角都小于或等于 180 度。

    cv::convexHull 函数的基本用法如下:

    cv::convexHull(points, hull, clockwise, returnPoints);
    
    • 1
    • points: 输入的点集,通常是一个 std::vector
    • hull: 函数的输出参数,用于存储计算得到的凸包。
    • clockwise: 布尔值,指定是否按照顺时针方向计算凸包。
    • returnPoints: 布尔值,指定是否返回凸包的点坐标,如果设置为 true,则 hull 将包含点的坐标;如果设置为 false,则 hull 将包含点在原始点集中的索引。

    寻找和绘制物体的凸包

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    #include 
    #include 
    using namespace cv; //包含cv命名空间
    #include 
    #define WINDOW_NAME1 "【原始图窗口】" //为窗口标题定义
    
    #define WINDOW_NAME2 "【效果图窗口】" //为窗口标题定义
    
    //【全局变量声明部分】
    // 描述: 全局变量的声明
    //
    Mat g_srcImage; Mat g_grayImage;
    int g_nThresh = 50;
    int g_maxThresh = 255;
    RNG g_rng(12345);
    Mat srcImage_copy = g_srcImage.clone();
    Mat g_thresholdImage_output;
    vector<vector<Point> > g_vContours;
    vector<Vec4i> g_vHierarchy;
    //- --- --------------------【全局函数声明部分】-----------------------
    // 描述:全局函数的声明
    //-
    static void ShowHelpText();
    void on_ThreshChange(int, void*);
    //----------------------------【main()函数】--------------------------
    // 描述: 控制台应用程序的入口函数, 我们的程序从这里开始执行
    //-----
    int main()
    {
    	// 加载源图像
    	g_srcImage = imread("111.jpg", 1);
    	// 将原图转换成灰度图并进行模糊降噪
    	cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);
    	blur(g_grayImage, g_grayImage, Size(3, 3));
    	// 创建原图窗口并显示
    	namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);
    	imshow(WINDOW_NAME1, g_srcImage);
    	//创建滚动条
    	createTrackbar(" 闳值:", WINDOW_NAME1, &g_nThresh, g_maxThresh, on_ThreshChange);
    	on_ThreshChange(0, 0);//调用一次进行初始化
    	waitKey(0);
    	return(0);
    }
    //. --- --- -【thresh_callback()函数】----------------------
    // 描述: 回调函数
    //
    void on_ThreshChange(int, void*)
    {
    	// 对图像进行二值化, 控制阈值
    	threshold(g_grayImage, g_thresholdImage_output, g_nThresh, 255, THRESH_BINARY);
    	// 寻找轮廓
    	findContours(g_thresholdImage_output, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
    	//遍历每个轮廓, 寻找其凸包
    	vector<vector<Point> >hull(g_vContours.size());
    	for (unsigned int i = 0; i < g_vContours.size(); i++)
    	{
    		convexHull(Mat(g_vContours[i]), hull[i], false);
    	}
    	// 绘出轮廓及其凸包
    	Mat drawing = Mat::zeros(g_thresholdImage_output.size(), CV_8UC3);
    	for (unsigned int i = 0; i < g_vContours.size(); i++)
    	{
    		Scalar color = Scalar(g_rng.uniform(0, 255),
    			g_rng.uniform(0, 255), g_rng.uniform(0, 255));
    		drawContours(drawing, g_vContours, i, color, 1, 8,
    			vector<Vec4i>(), 0, Point());
    		drawContours(drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point());
    	}
    	// 显示效果图
    	imshow(WINDOW_NAME2, drawing);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    在这里插入图片描述

  • 相关阅读:
    2039: [蓝桥杯2022初赛] 李白打酒加强版 (动态规划)
    MacOS怎么安装Nacos(附带:Windows系统)
    报错AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘
    08 JUC 之 Semaphore
    【Java】查找jdk步骤
    基于Java电动车上牌管理系统计实现(源码+lw+部署文档+讲解等)
    LabVIEW 应用程序视窗始终置于顶层
    conda中的jupyter notebook无法重命名,无法正确打开文件
    MySQL 如何使用离线模式维护服务器
    原装芯片现货,价格优惠,实单可谈
  • 原文地址:https://blog.csdn.net/qq_46107892/article/details/133771217