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

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

算法描述

测试轮廓的凸性。

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

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

函数原型

cpp 复制代码
bool cv::isContourConvex	
(
	InputArray 	contour
)	

参数

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

代码示例

cpp 复制代码
#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;
}

运行结果

bash 复制代码
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)
相关推荐
打工仔折腾 AI1 分钟前
Linux 网络编程:从零掌握 TCP Socket 编程与 C++ 实战落地
linux·网络·人工智能·后端·python·tcp/ip·性能优化
科威网络1 分钟前
RAG 系统落地:向量库、文档切片与检索效果优化实践
人工智能·软件需求
QuZhengRong10 分钟前
【News】2026.10.16 – 10.21 AI 科技周报
人工智能·科技·openai·谷歌·新闻
IT枫斗者枫哥10 分钟前
Spring AI文档更新后仍命中旧内容:核对分片ID、来源和版本
java·人工智能
qq_252941316821 分钟前
不同成熟度番茄果实多模态图像数据集 | 番茄成熟度 多模态检测 可见光深度红外 智慧农业 语义分割 目标检测9233期
人工智能·yolo·目标检测·目标跟踪·番茄多模态
matlab代码25 分钟前
基于BP神经网络手写字母识别(单一)【源码79期】
人工智能·深度学习·神经网络
skywalk816328 分钟前
FreeBSD linuxulator 跑小浣熊客户端:登录页一直转不回来的完整排查记录 10.22
人工智能·freebsd·小浣熊
江屿风29 分钟前
【Plain Language Large Model】【大语言模型底层原理全解析:从Token生成到智能体演进】流食般投喂
人工智能·笔记·语言模型·llm·json·token·聊天模板
码流子32 分钟前
高速公路视频AI分析,算力该放哪:边缘、中心还是云边协同?
大数据·数据库·人工智能·物联网·音视频
碧海银沙音频科技研究院33 分钟前
基于炬芯ATS308X的MLP DNN深度学习KWS语音识别实现(单唤醒词版本-谷歌mini Speech Commands数据集)
人工智能·深度学习