- 操作系统: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)