OpenCV4.9的点多边形测试(65)

79 篇文章 0 订阅
78 篇文章 0 订阅
返回:OpenCV系列文章目录(持续更新中......)
上一篇:OpenCV的图像矩(64)
下一篇:OpenCV4.9的基于距离变换和分水岭算法的图像分割(66)

Point Polygon Test(点多边形测试)是 OpenCV 库中的一个功能,用于判断一个点是否在一个多边形内部。它可以接受多种类型的多边形,例如凸多边形和非凸多边形,并且可以在 2D 或 3D 空间中使用。

Point Polygon Test 的工作原理很简单,它通过计算测试点到多边形边缘的距离,确定测试点与多边形之间的关系。如果测试点与多边形重合,则返回零。如果测试点在多边形内部,则返回正值。反之,如果测试点在多边形外部,则返回负值。

在计算机视觉和图像处理领域中,点多边形测试常用于对图像中的特定区域进行选取和分割,例如对目标物体的轮廓进行细分和拟合等。通过 Point Polygon Test,我们可以检测一个点是否在一个区域内,从而实现分割和细分等操作。

目标

在本教程中,您将学习如何:

C++代码
 

本教程代码如下所示。您也可以从这里下载

#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
 
using namespace cv;
using namespace std;
 
int main( void )
{
 const int r = 100;
 Mat src = Mat::zeros( Size( 4*r, 4*r ), CV_8U );
 
 vector<Point2f> vert(6);
 vert[0] = Point( 3*r/2, static_cast<int>(1.34*r) );
 vert[1] = Point( 1*r, 2*r );
 vert[2] = Point( 3*r/2, static_cast<int>(2.866*r) );
 vert[3] = Point( 5*r/2, static_cast<int>(2.866*r) );
 vert[4] = Point( 3*r, 2*r );
 vert[5] = Point( 5*r/2, static_cast<int>(1.34*r) );
 
 for( int i = 0; i < 6; i++ )
 {
 line( src, vert[i], vert[(i+1)%6], Scalar( 255 ), 3 );
 }
 
 vector<vector<Point> > contours;
 findContours( src, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);
 
 Mat raw_dist( src.size(), CV_32F );
 for( int i = 0; i < src.rows; i++ )
 {
 for( int j = 0; j < src.cols; j++ )
 {
 raw_dist.at<float>(i,j) = (float)pointPolygonTest( contours[0], Point2f((float)j, (float)i), true );
 }
 }
 
 double minVal, maxVal;
 Point maxDistPt; // inscribed circle center
 minMaxLoc(raw_dist, &minVal, &maxVal, NULL, &maxDistPt);
 minVal = abs(minVal);
 maxVal = abs(maxVal);
 
 Mat drawing = Mat::zeros( src.size(), CV_8UC3 );
 for( int i = 0; i < src.rows; i++ )
 {
 for( int j = 0; j < src.cols; j++ )
 {
 if( raw_dist.at<float>(i,j) < 0 )
 {
 drawing.at<Vec3b>(i,j)[0] = (uchar)(255 - abs(raw_dist.at<float>(i,j)) * 255 / minVal);
 }
 else if( raw_dist.at<float>(i,j) > 0 )
 {
 drawing.at<Vec3b>(i,j)[2] = (uchar)(255 - raw_dist.at<float>(i,j) * 255 / maxVal);
 }
 else
 {
 drawing.at<Vec3b>(i,j)[0] = 255;
 drawing.at<Vec3b>(i,j)[1] = 255;
 drawing.at<Vec3b>(i,j)[2] = 255;
 }
 }
 }
 circle(drawing, maxDistPt, (int)maxVal, Scalar(255,255,255));
 
 imshow( "Source", src );
 imshow( "Distance and inscribed circle", drawing );
 
 waitKey();
 return 0;
}

结果

在这里:


参考文献:

1、《Point Polygon Test》-----Ana Huamán

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

愚梦者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值