[19] Opencv_CUDA应用之 基于形状的对象检测与跟踪

2024-06-22 10:04

本文主要是介绍[19] Opencv_CUDA应用之 基于形状的对象检测与跟踪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Opencv_CUDA应用之 基于形状的对象检测与跟踪

  • 形状可以用作全局特征检测具有不同形状的物体,可以是直线、多边形、圆形或者任何其他不规则形状
  • 利用对象边界、边缘和轮廓可以检测具有特定形状的对象
  • 本文将使用Canny边缘检测算法和Hough变换来检测两个规则形状,即线和圆

1. Canny 边缘检测

  • Canny 结合了高斯滤波、梯度寻找、非极大值抑制和滞后阈值处理

  • 高通滤波器对噪声非常敏感,在Canny边缘检测中,检测边缘之前完成高斯平滑,在检测到边缘后从结果中移除不必要的边缘之后,还具有非极大值抑制阶段

  • 算法代码如下:

#include <cmath>
#include <iostream>
#include "opencv2/opencv.hpp"
#include<opencv2/cudaimgproc.hpp>using namespace std;
using namespace cv;
using namespace cv::cuda;int main()
{Mat h_image = imread("images/drawing.JPG", 0);if (h_image.empty()){cout << "can not open image" << endl;return -1;}GpuMat d_edge, d_image;Mat h_edge;d_image.upload(h_image);cv::Ptr<cv::cuda::CannyEdgeDetector> canny_edge = cv::cuda::createCannyEdgeDetector(2.0, 100.0, 3, false);canny_edge->detect(d_image, d_edge);d_edge.download(h_edge);imshow("source", h_image);imshow("detected edges", h_edge);waitKey(0);return 0;
}

在这里插入图片描述

2. 使用 Hough 变换进行直线检测

  • hough变换常用于直线检测、圆检测
  • 直线检测函数解析:
/*
cv::cuda::createCannyEdgeDetector 函数参数:
第一个r表示在Hough变换中参数的分辨率,通常为1像素
第二个参数是theta在弧度中的分辨率,取1弧度或者pi/180
第三个参数是形成一条线所需点的最小数量
第四个参数是两点之间的最大间隙被视为同一条直线*/Ptr<cuda::HoughSegmentDetector> hough = cuda::createHoughSegmentDetector(1.0f, (float)(CV_PI / 180.0f), 50, 5);
  • 实现代码如下:
#include <cmath>
#include <iostream>
#include "opencv2/opencv.hpp"
#include<opencv2/cudaimgproc.hpp>using namespace std;
using namespace cv;
using namespace cv::cuda;int main()
{Mat h_image = imread("images/drawing.JPG", 0);resize(h_image, h_image, h_image.size());if (h_image.empty()){cout << "can not open image" << endl;return -1;}Mat h_edge;cv::Canny(h_image, h_edge, 100, 200, 3);Mat h_imagec;cv::cvtColor(h_edge, h_imagec, COLOR_GRAY2BGR);Mat h_imageg = h_imagec.clone();vector<Vec4i> h_lines;{const int64 start = getTickCount();HoughLinesP(h_edge, h_lines, 1, CV_PI / 180, 50, 60, 5);const double time_elapsed = (getTickCount() - start) / getTickFrequency();cout << "CPU Time : " << time_elapsed * 1000 << " ms" << endl;cout << "CPU FPS : " << (1 / time_elapsed) << endl;}for (size_t i = 0; i < h_lines.size(); ++i){Vec4i line_point = h_lines[i];line(h_imagec, Point(line_point[0], line_point[1]), Point(line_point[2], line_point[3]), Scalar(0, 0, 255), 2, LINE_AA);}GpuMat d_edge, d_lines;d_edge.upload(h_edge);{const int64 start = getTickCount();Ptr<cuda::HoughSegmentDetector> hough = cuda::createHoughSegmentDetector(1.0f, (float)(CV_PI / 180.0f), 50, 5);hough->detect(d_edge, d_lines);const double time_elapsed = (getTickCount() - start) / getTickFrequency();cout << "GPU Time : " << time_elapsed * 1000 << " ms" << endl;cout << "GPU FPS : " << (1 / time_elapsed) << endl;}//取出直线两个点vector<Vec4i> lines_g;if (!d_lines.empty()){lines_g.resize(d_lines.cols);Mat h_lines(1, d_lines.cols, CV_32SC4, &lines_g[0]);d_lines.download(h_lines);}for (size_t i = 0; i < lines_g.size(); ++i){Vec4i line_point = lines_g[i];line(h_imageg, Point(line_point[0], line_point[1]), Point(line_point[2], line_point[3]), Scalar(0, 0, 255), 2, LINE_AA);}imshow("source", h_image);imshow("detected lines [CPU]", h_imagec);imshow("detected lines [GPU]", h_imageg);imwrite("hough_source.png", h_image);imwrite("hough_cpu_line.png", h_imagec);imwrite("hough_gpu_line.png", h_imageg);waitKey(0);return 0;
}

在这里插入图片描述

3. 对圆形进行检测

  • 球检测或者硬币检测
  • 圆检测函数解析:
/*
cv::cuda::createHoughCirclesDetector 参数
第一个参数是dp,表示累加器分辨率与图像分辨率的反比
第二个参数是检测到的圆中心之间的最小距离,调小会检测出其他错误圆,调大则可能丢失圆
第三个参数是Canny 阈值
第四个参数是累加器阈值
第五个和第六个参数是要检测的圆的最小和最大半径,不确定可以取0
*/
cv::Ptr<cv::cuda::HoughCirclesDetector> detector = 
cv::cuda::createHoughCirclesDetector(1, 100, 122, 50, 1, max(h_image.size().width, h_image.size().height));
  • 算法实现如下:
#include <iostream>
#include "opencv2/opencv.hpp"
#include<opencv2/cudaimgproc.hpp>using namespace cv;
using namespace std;int main(int argc, char** argv)
{Mat h_image = imread("images/eight.tif", IMREAD_COLOR);Mat h_gray;cvtColor(h_image, h_gray, COLOR_BGR2GRAY);cuda::GpuMat d_gray, d_result;std::vector<cv::Vec3f> d_Circles;medianBlur(h_gray, h_gray, 5);cv::Ptr<cv::cuda::HoughCirclesDetector> detector = cv::cuda::createHoughCirclesDetector(1, 100, 122, 50, 1, max(h_image.size().width, h_image.size().height));d_gray.upload(h_gray);detector->detect(d_gray, d_result);d_Circles.resize(d_result.size().width);if (!d_Circles.empty())d_result.row(0).download(cv::Mat(d_Circles).reshape(3, 1));cout << "No of circles: " << d_Circles.size() << endl;for (size_t i = 0; i < d_Circles.size(); i++){Vec3i cir = d_Circles[i];circle(h_image, Point(cir[0], cir[1]), cir[2], Scalar(255, 0, 0), 2, LINE_AA);}imshow("detected circles", h_image);waitKey(0);return 0;
}

在这里插入图片描述

这篇关于[19] Opencv_CUDA应用之 基于形状的对象检测与跟踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083975

相关文章

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java