当前位置: 首页 > article >正文

OpenCV结构分析与形状描述符(17)判断轮廓是否为凸多边形的函数isContourConvex()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

测试轮廓的凸性。
该函数测试输入的轮廓是否为凸的。轮廓必须是简单的,即没有自相交。否则,函数的输出是不确定的。

cv::isContourConvex 函数是 OpenCV 提供的一个用于判断轮廓是否为凸多边形的函数。这个函数可以用来验证一个给定的轮廓是否是凸的,这对于后续处理(如使用 intersectConvexConvex 来寻找两个凸多边形的交集)是非常有用的。

函数原型

bool cv::isContourConvex	
(
	InputArray 	contour
)	

参数

  • 参数contour 输入的二维点向量,存储在 std::vector<> 或 Mat 中

代码示例


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

int main()
{
    // 定义两个矩形的顶点
    cv::Mat p1 = ( cv::Mat_< float >( 4, 2 ) << 0, 0,  // 左上角
                   2, 0,                               // 右上角
                   2, 2,                               // 右下角
                   0, 2 );                             // 左下角

    cv::Mat p2 = ( cv::Mat_< float >( 4, 2 ) << 1, 1,  // 左上角
                   3, 1,                               // 右上角
                   3, 3,                               // 右下角
                   1, 3 );                             // 左下角

    // 验证轮廓是否为凸多边形
    bool isP1Convex = cv::isContourConvex( p1 );
    bool isP2Convex = cv::isContourConvex( p2 );

    std::cout << "Polygon p1 is convex: " << std::boolalpha << isP1Convex << std::endl;
    std::cout << "Polygon p2 is convex: " << std::boolalpha << isP2Convex << std::endl;

    // 如果两个多边形都是凸的,才继续进行交集计算
    if ( isP1Convex && isP2Convex )
    {
        cv::Mat p12;
        bool intersect = cv::intersectConvexConvex( p1, p2, p12, true );

        if ( intersect )
        {
            std::cout << "Polygons intersect." << std::endl;
            std::cout << "Intersection vertices:" << std::endl;
            for ( int i = 0; i < p12.rows; ++i )
            {
                cv::Point2f pt = p12.at< cv::Point2f >( i );
                std::cout << "Vertex " << i << ": (" << pt.x << ", " << pt.y << ")" << std::endl;
            }
        }
        else
        {
            std::cout << "Polygons do not intersect." << std::endl;
        }
    }
    else
    {
        std::cout << "One or both polygons are not convex." << std::endl;
    }

    return 0;
}

运行结果

Polygon p1 is convex: true
Polygon p2 is convex: true
Polygons intersect.
Intersection vertices:
Vertex 0: (2, 1)
Vertex 1: (2, 2)
Vertex 2: (1, 2)
Vertex 3: (1, 1)


http://www.kler.cn/a/298442.html

相关文章:

  • 【大数据基础】大数据概述
  • Idea-离线安装SonarLint插件地址
  • MT6706BL 同步整流 规格书
  • 在 macOS 中,设置自动将文件夹排在最前
  • 比较procfs 、 sysctl和Netlink
  • Python中的可变对象与不可变对象;Python中的六大标准数据类型哪些属于可变对象,哪些属于不可变对象
  • vue3项目中如何动态循环设置ref并获取使用
  • STM32看门狗
  • 2.1ceph集群部署准备-硬件及拓扑
  • 如何压缩pdf?2024帮助你轻松压缩pdf软件
  • 【自用14】C++俄罗斯方块-思路复盘4-此游戏更新完结
  • c++的静态成员
  • 诗风秦韵诗词学习画廊发展“1+6步走”
  • 详解BMP图片格式以及关于Verilog图像处理的仿真环境搭建
  • HTTP 三、http在springboot中得应用
  • 华为 HCIP-Datacom H12-821 题库 (12)
  • Retrieval-based-Voice-Conversion-WebUI模型构建指南
  • 【Hadoop|HDFS篇】HDFS的读写流程
  • AI对未来教育领域的改变!如何使用ChatGPT,一个高效提问的指令构建模型,通过ChatGPT有效提高学习效率
  • 启明云端WT0132C5-S6模组乐鑫ESP32-C5芯片应用,设备联网开发新选择
  • 负载均衡调度器--LVS
  • ElasticSearch精要
  • 有效寻找潜在客户的五个方法
  • 完整的数仓能力,ByConity 1.0 版本发布!
  • 如何实现过滤器、拦截器和全局异常捕获?
  • 低代码平台中的统一认证与单点登录(SSO):实现简化与安全的用户管理