Opecv检测多个圆形(霍夫圆检测,轮廓面积筛选,C/C++)

2023-10-27

主要是利用霍夫圆检测、面积筛选等完成多个圆形检测,具体代码及结果如下。
第一部分是头文件(common.h):

#pragma once
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include<iostream>

using namespace std;
using namespace cv;

extern Mat src;
void imageBasicInformation(Mat& src);//图像基本信息

const Mat houghCirclePre(Mat& srcPre);//霍夫圆检测预处理
void  houghCircle(Mat& srcPreHough);//霍夫圆检测
const Mat RectCirclePre(Mat& srcPre);//面积筛选拟合圆的预处理
void AreaCircles(Mat& AreaInput);//面积筛选拟合圆检测

第二部分是主函数:

#include"common.h"
Mat src;
int main()
{
    src = imread("1.jpg",1);
    if (src.empty())
    {
        cout << "图像不存在!" << endl;
    }
    else
    {
        namedWindow("原图", 1);
        imshow("原图", src);
        imageBasicInformation(src);
        Mat srcPreHough = houghCirclePre(src);
        houghCircle(srcPreHough);

        Mat RectCir = RectCirclePre(src);
        AreaCircles(RectCir);
        waitKey(0);
        destroyAllWindows();
    }
    return 0}

第三部分为霍夫圆检测函数(hough.cpp)
主要包括输出图像的基本信息函数:void imageBasicInformation(Mat& src)
霍夫圆检测预处理函数:const Mat houghCirclePre(Mat& srcPre)
霍夫圆检测函数:void houghCircle(Mat& srcPreHough)

#include"common.h"

Mat graySrc, srcPre;//灰度图,霍夫检测预处理,
Mat threshold_grayaSrc;//二值化图
Mat erode_threshold_graySrc, dilate_threshold_graySrc;//二值化后腐蚀,二值化后膨胀

void imageBasicInformation(Mat& src)
{
    int cols = src.cols;
    int rows = src.rows;
    int channels = src.channels();
    cout << "图像宽为:" << cols << endl;
    cout << "图像高为:" << rows << endl;
    cout << "图像通道数:" << channels << endl;
}

const Mat houghCirclePre(Mat& srcPre)
{
    double houghCirclePreTime = static_cast<double>(getTickCount());

    cvtColor(srcPre, graySrc, COLOR_BGR2GRAY);
    GaussianBlur(graySrc, graySrc, Size(3, 3), 2, 2);//滤波
    threshold(graySrc, threshold_grayaSrc, 150, 255, 1);//二值化
   
    Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
    dilate(threshold_grayaSrc, dilate_threshold_graySrc, element);//膨胀
    erode(dilate_threshold_graySrc, erode_threshold_graySrc, element);//腐蚀
    houghCirclePreTime = ((double)getTickCount() - houghCirclePreTime) / getTickFrequency();
    cout << "霍夫圆预处理时间为:" << houghCirclePreTime << "秒" << endl;
    return erode_threshold_graySrc;
}

void houghCircle(Mat& srcPreHough)
{
    cout << "进入霍夫圆检测" << endl;
    vector<Vec3f> circles;
    HoughCircles(srcPreHough, circles, HOUGH_GRADIENT, 1, 60, 1, 35, 0, 0);
    cout << "圆的个数" << circles.size() << endl;
    for (size_t i = 0;i < circles.size();i++)
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);
        circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);//画圆心
        circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);//画圆
    }
    namedWindow("霍夫检测结果", 0);
    imshow("霍夫检测结果", src);
    imwrite("霍夫圆检测结果.jpg", src);//保存检测结果
}

第四部分为利用面积筛选拟合圆检测(AreaCircle.cpp)
主要包括预处理函数:const Mat RectCirclePre(Mat& srcPre)
面积筛选拟合圆检测函数:void AreaCircles(Mat& AreaInput)

#include"common.h"

Mat graySrcArea, thresholdGraySrc;//灰度图像,二值化图像
Mat dilateThresholdGraySrc, erodeThresholdGraySrc;//二值化后膨胀图像,膨胀之后的腐蚀图像

const Mat RectCirclePre(Mat& srcPre)
{ 
	cvtColor(srcPre, graySrcArea, COLOR_BGR2GRAY);
	GaussianBlur(graySrcArea, graySrcArea, Size(3, 3), 2, 2);
	threshold(graySrcArea, thresholdGraySrc, 100, 255, 1);//二值化,阈值要根据自己的图像自己调整
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
	dilate(thresholdGraySrc, dilateThresholdGraySrc, element);//膨胀
	erode(dilateThresholdGraySrc, erodeThresholdGraySrc, element);//腐蚀
	
	return erodeThresholdGraySrc;
}

void AreaCircles(Mat& AreaInput)
{
	vector<vector<Point>> RectContours;
	vector<Vec4i> Hierarchy;
	findContours(AreaInput, RectContours, Hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
	Mat drawing = Mat::zeros(src.size(), CV_8UC3);

	for (int i = 0;i < RectContours.size();i++)
	{
		double area = contourArea(RectContours[i]);
		cout << area << endl;//输出所有计算出来的面积,方便下一步设置阈值
		if (area > 15000 && area < 100000)//根据上一步计算的阈值设置范围
		{
			drawContours(drawing, RectContours, i, Scalar(0, 255, 0), 2,8, Hierarchy, 0, Point());
			RotatedRect Rect = fitEllipse(RectContours[i]);
			circle(src, Rect.center, 2, Scalar(0, 255, 0), 2, 8, 0);//在原图画出圆心
			ellipse(src, Rect, Scalar(0, 0, 255), 2);//在原图画出轮廓
		}
	}
	namedWindow("面积筛选拟合圆", 0);
	imshow("面积筛选拟合圆", src);
	imwrite("面积筛选拟合圆.jpg", src);//保存检测结果
}

结果如下(自己画的两个圆):
原图:
在这里插入图片描述

以下为霍夫圆检测结果:
在这里插入图片描述
以下为面积筛选拟合圆结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opecv检测多个圆形(霍夫圆检测,轮廓面积筛选,C/C++) 的相关文章

随机推荐

  • C#开发之——GetType方法(6.5)

    一 概述 C 中GetType方法用于获取当前实例的类型 返回值为System Type类型 C 中GetType方法不含有任何参数 是非静态方法 使用任何对象都能直接调用该方法 二 实例 创建字符串类型的变量 整数类型的变量以及Stude
  • 傻瓜式3分钟理解:工厂模式(简单工厂+工厂方法+抽象工厂)

    一 给我一句话概括 简单工厂 工厂类中 根据条件决定一个接口由哪个具体产品类来实现 工厂方法 创建多个工厂类 各个工厂类中 都对应一个获得接口A实例的方法 用户决定使用哪个工厂 抽象工厂 对工厂方法进行扩展 各个工厂类中 再增加一个获得接口
  • 移位运算

    div class markdown views div
  • python中dict数据转DataFrame,pandas实现类似sql查询语句

    目的 将一组dict字典数据转为pandas的DataFrame格式 然后用pandas实现类似sql语句中select from xxx where condition的功能 一 python中将dict格式数据转为DataFrame格式
  • 4.4.2 中文标点符号验证

    英文标点符号比较多 如 逗号 点号 问号 冒号 分号 单引号 感叹号 双引号 连接号 破折号 省略号 小括号 中括号 大括号 顿号 书名号等 以下正则表达式能够验证英文标点符号 2 64 正则表达式 64 解释 匹配 符号 2 匹配破折号
  • Java 添加背景图片

    import java awt import javax swing public class TestBackgroundColor extends JFrame public static void main String args T
  • IF语句例题(一)

    石头剪刀布 需求 1 从控制台输入要出的拳 石头 1 剪刀 2 布 3 2 电脑随机出拳 先假定电脑会出石头 完成代码功能 3 比较正负 解题 首先我们先会议一些input函数 在input函数中内部都是字符串 所以说要把字符串变成整数 p
  • k8s安全管理:认证、授权、准入控制概述

    概述信息 k8s对我们整个系统的认证 授权 访问控制做了精密的设置 对于k8s集群来说 apiserver是整个集群访问控制的唯一入口 我们在k8s集群之上部署应用程序的时候 也可以通过宿主机的NodePort暴露的端口访问里面的程序 用户
  • linux备份工具

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 经常备份计算机上的数据是个好的做法 它可以手动完成 也可以设置成自动执行 许多备
  • Java____西财大图书管理系统 代码实现

    西财大图书管理项目代码 book类 1 book 2 bookist operation类 1 AddOperation 2 BorrowOperation 3 DisplayOperation 4 FindOperation 5 Remo
  • 信号与系统matlab心得体会,实验五 Matlab在信号与系统分析中的应用

    实验五Matlab在信号与系统分析中的应用 08电子 3 班E08610308 陈建能 一 实验目的 1 学会用MATLAB进行Laplace正 反变换及Z正 反变换 2 掌握利用MATLAB画出系统的幅频响应 相频响应的方法 3 掌握利用
  • 【C语言】N 阶矩阵的转置

    非主对角线元素的调换 只需要将蓝色虚线左边的元素进行调换 include
  • u盘装系统

    1 用ultraiso将ios写入u盘 2 U盘插入电脑 3 开机狂按某键进入 boot启动页面 4 选择该u盘 enter回车确认安装
  • ag-grid表格基本使用方法-React版本

    AG表格基本用法及Api 在要使用的项目中 首次使用需要引入相关组件包 注 项目中所有组件都是封装之后的 引入方式如下 import Table from pkg common table 引入完成后 在view层需要用到表格的地方直接放入
  • Vue3的filter过滤器代替方法

    Vue3的过滤器代替方法 前言 一 使用步骤 1 vue2的filter 2 vue3的computed 总结 前言 最近博主从vue2转到vue3 惊奇的发现vue2里面的filter在vue3中不再支持 官方建议用计算属性或方法代替过滤
  • 现代博弈论与多智能体强化学习系统

    如今 大多数人工智能 AI 系统都是基于处理任务的单个代理 或者在对抗模型的情况下 是一些相互竞争以改善系统整体行为的代理 然而 现实世界中的许多认知问题是大群人建立的知识的结果 以自动驾驶汽车场景为例 任何座席的决策都是场景中许多其他座席
  • 遭遇难缠的病毒群ntldr.exe和c0nime.exe等,可杀

    据当事人说中毒后就上不了网了 我没有确认 每个硬盘分区下都有 Autorun inf和ntldr exe C Windows System 目录 下有 c0nime exe 那是数字0不是字母o 等若干个可疑的可执行文件 硬盘上N多exe可
  • Vue模板语法

    Vue js使用了基于HTML的模板语法 允许开发者声明式地将DOM绑定至底层Vue实例的数据 所有Vue js的模板都是合法的HTML 所以能够被遵循规范的浏览器和HTML解析器解析 在底层的实现上 Vue将模板编译成虚拟DOM渲染函数
  • Andorid与其他操作系统的知识

    安卓用的是LINUX的内核 利用LINUX的几个库 应用层运行JAVA虚拟机上 这点和iPhone很想 只不过 iphone是基于unix系统 是微内核结构 同样运行在java虚拟机上 所以 安卓只是一个linux的衍生系统 是LINUX的
  • Opecv检测多个圆形(霍夫圆检测,轮廓面积筛选,C/C++)

    主要是利用霍夫圆检测 面积筛选等完成多个圆形检测 具体代码及结果如下 第一部分是头文件 common h pragma once include