首页 > 其他分享 >OpenCV图像处理——判断轮廓是否在圆环内

OpenCV图像处理——判断轮廓是否在圆环内

时间:2024-07-14 21:01:17浏览次数:13  
标签:center point double Point contour OpenCV 图像处理 cv 圆环

要判断一个轮廓是否在圆环内,可以将问题分解为两个步骤:

  1. 确保轮廓的所有点都在外圆内。
  2. 确保轮廓的所有点都在内圆外。

下面是一个完整的示例代码,展示如何实现这一点:

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

using namespace cv;
using namespace std;

// 检查一个点是否在圆内
bool point_inside_circle(const Point& point, const Point& center, double radius) 
{
	double distance = norm(point - center);
	return distance <= radius;
}

// 检查一个点是否在圆外
bool point_outside_circle(const Point& point, const Point& center, double radius) 
{
	double distance = norm(point - center);
	return distance >= radius;
}

// 检查轮廓是否在圆环内
bool contour_inside_annulus(const vector<Point>& contour, const Point& center, double innerRadius, double outerRadius) 
{
	for (const auto& point : contour)
	 {
		if (!point_inside_circle(point, center, outerRadius) || !point_outside_circle(point, center, innerRadius)) 
		{
			return false; // 如果任何点不在圆环内,返回 false
		}
	}
	return true; // 所有点都在圆环内,返回 true
}

int main() 
{
	// 定义圆心和半径
	Point center(200, 200);
	double innerRadius = 40.0;
	double outerRadius = 180.0;

	cv::Mat cv_src(cv::Size(640, 640), CV_8UC3, cv::Scalar(255, 255, 255));
	cv::circle(cv_src, center, innerRadius, cv::Scalar(0, 0, 0), 1, cv::LINE_AA);
	cv::circle(cv_src, center, outerRadius, cv::Scalar(0, 0, 0), 1, cv::LINE_AA);
	cv::imshow("src", cv_src);

	// 创建一个轮廓
	vector<Point> contour = { Point(80, 100), Point(200, 100), Point(120, 240), Point(100, 200) };

	cv::drawContours(cv_src, std::vector<std::vector<cv::Point>>{contour}, -1, cv::Scalar(255, 0, 0), 1);

	// 检查轮廓是否在圆环内
	if (contour_inside_annulus(contour, center, innerRadius, outerRadius)) 
	{
		cout << "Contour inside annulus!" << endl;
	}
	else 
	{
		cout << "Contour no inside annulus!" << endl;
	}

	cv::imshow("dst", cv_src);
	cv::waitKey(0);

	return 0;
}

演示结果:
在这里插入图片描述
可以调整内圆的圆心,来演示不包含轮廓点:

double innerRadius = 100.0;
double outerRadius = 180.0;

在这里插入图片描述

代码说明

  1. point_inside_circle 函数

    • 该函数检查一个点是否在指定圆内。计算点到圆心的距离,如果距离小于等于半径,则点在圆内。
  2. point_outside_circle 函数

    • 该函数检查一个点是否在指定圆外。计算点到圆心的距离,如果距离大于等于半径,则点在圆外。
  3. contour_inside_annulus 函数

    • 该函数检查一个轮廓的所有点是否都在指定的圆环内。轮廓的每个点必须在外圆内且在内圆外。

标签:center,point,double,Point,contour,OpenCV,图像处理,cv,圆环
From: https://blog.csdn.net/matt45m/article/details/140408956

相关文章

  • 失败笔记本--OPENCV--001--202407
    失败笔记本-OPENCV篇-001项目场景:今天研究一下用OPENCV基于轮廓分析查找数字,参考地址为:OpenCV案例|基于轮廓分析查找数字实现的效果如下:1.打开一张图片步骤:首先呢还是丝滑小连招,打开图片,灰度化,二值化在opencv中使用imread打开图片,使用imshow展示图片,不过要注意在ims......
  • OpenCV MEI相机模型(全向模型)
    文章目录一、简介二、实现代码三、实现效果参考文献一、简介对于针孔相机模型,由于硬件上的限制(如进光量等),他的视野夹角往往有效区域只有140度左右,因此就有研究人员为每个针孔相机前面再添加一个镜片,如下所示:通过折射的方式增加了相机成像的视野,虽然仍然......
  • opencv—常用函数学习_“干货“_总
    同样内容将拆解为一份份,发在我个人博客中如http://t.csdnimg.cn/icOfX(非VIP文章),整理不易、感谢你的点赞收藏目录一、图像文件1.imread:读取图像文件2.imwrite:写入图像文件3.imshow:显示图像4.VideoCapture:捕获视频二、创建Mat1、创建Mat对象2、操作Mat对象三、矩......
  • opencv中 在特征点匹配代码举例,以及queryIdx和trainIdx的用法
    一、用法在特征点匹配中,queryIdx和trainIdx是匹配对中的两个索引,用于指示匹配点在不同图像或特征向量中的位置。1.假设我们有两幅图像A和B,并使用特征点提取算法(如SIFT)从它们中提取出特征点和对应的描述子。2.在进行特征点匹配时,我们得到了一个匹配对,其中包含了两个特征点:特征点A......
  • 使用Python配合OpenCV,非常简洁的来识别出银行卡号
        Opencv(OpenSourceComputerVisionLibrary)是一个基于开源发行的跨平台计算机视觉库。OpenCV用C++语言编写,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和MacOS。本篇是使用python配合opencv来做图片识别,以识别银行卡上的卡号为例。   安装......
  • 【版面有限,早投稿早录用】第三届图像处理、目标检测与跟踪国际学术会议(IPODT 2024)
    第三届图像处理、目标检测与跟踪国际学术会议(IPODT2024)将于2024年8月9-11日在中国南京召开。本次会议旨在为全球的研究人员、工程师、学者和业界专家提供一个展示和讨论图像处理、目标检测与跟踪最新进展的平台,促进这些领域的科研与技术发展。会议内容涵盖从基础研究到应用开......
  • OpenCV一个简单的摄像头调用与关闭
    在使用OpenCV(OpenSourceComputerVisionLibrary)进行摄像头调用与关闭时,通常使用cv2.VideoCapture()函数来调用摄像头,并通过适当的方式关闭它。调用摄像头首先,需要导入OpenCV库(通常简写为cv2),并使用cv2.VideoCapture()函数来启动摄像头。这个函数可以接收一个整数作为参......
  • C#+OpenCV实战(三)_玉米粒计数
    ///<summary>///标注物体-物体计数标注///比如玉米粒计数并标注每个玉米///</summary>///<paramname="imgFile1"></param>///<returns>物体位置;数量=contours.Length</returns>publicstaticPoint[][]ImageDetector_CountAndLabel(MatsrcMa......
  • C#+OpenCV实战(四)_特定钢板缺陷检测
    ///<summary>///板材瑕疵检测(凹凸坑、划痕、颜料瑕疵)///</summary>///<paramname="mat">图片</param>///<paramname="resultMat">结果图片</param>///<paramname="minArcLength">最小有效斑弧长;默认为5</param>......
  • C#+OpenCV进阶(一)_人体识别
      效果排名:Lbp<Haar<CNN1、Lbp///<summary>///Lbp人脸识别///</summary>publicstaticMatFaceDetection_Lbp(Matmat){varlbpCascade=newCascadeClassifier("model/lbpcascade_frontalface.xml");MatoutMat=newMat();......