[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;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scapy修改TCP标志位

文章目录 TCP标志位scapy修改标志位设置标志位清除标志位示例 TCP标志位 TCP报文段结构如图所示 下面介绍一些重要的标志位&#xff1a; URG (Urgent): 紧急指针&#xff08;Urgent Pointer&#xff09;有效。当URG标志位设置为1时&#xff0c;表示TCP报文段中有紧急数据需要处…

你好,复变函数1.0

输入时用后缀&#xff0c;开头空格 #include <easyx.h> #include <stdio.h> #define PI 3.141592653589793 #define E 2.718281828459045 #define K (1.0 / 256.0) #define K_1 256.0 //#define LINE//决定函数是用线画还是用点画 struct C {double i;double r;…

apache activeMq

https://blog.csdn.net/qq_29651203/article/details/108487924 游览器输入地址: http://127.0.0.1:8161/admin/ 访问activemq管理台 账号和密码默认为: admin/admin# yml配置的密码也是如下的密码 activemq:url: failover:(tcp://localhost:61616)username: adminpassword: ad…

手撕排序2--选择排序(直接选择+堆排序

目录&#xff1a; 1.直接选择排序 的实现及分析 2.堆排序 的实现及分析 1.直接选择排序 1.1基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完…

【启明智显产品介绍】Model3C工业级HMI芯片详解专题(三)通信接口

Model3C 是一款基于 RISC-V 的高性能、国产自主、工业级高清显示与智能控制 MCU, 集成了内置以太网控制器&#xff0c;配备2路CAN、4路UART、5组GPIO、2路SPI等多种通信接口&#xff0c;能够轻松与各种显示设备连接&#xff0c;实现快速数据传输和稳定通信&#xff0c;可以与各…

R语言——类与对象

已知2024年4月23日是星期五&#xff0c;编写一个函数day.in.a.week (x, y,z)&#xff0c;参数x和y和z分别代表年月日&#xff0c;判断这一天是否存在&#xff08;例如&#xff0c;2018年没有2月29日&#xff0c;也没有11月31日&#xff09;&#xff0c;如果不存在&#xff0c;返…

Howtrader在服务器上安装后遇到的问题

response:{"code":-1021,"msg":"Timestamp for this request is outside of the recvWindow."} 1.安装 NTP 服务 如果你的系统还没有安装 NTP&#xff0c;可以通过以下命令安装&#xff1a; sudo apt update sudo apt install ntp2.配置 NTP …

ELK+Filebeat+kafka+zookeeper构建海量日志分析平台

ELK是什么&#xff08;What&#xff09;&#xff1f; ELK组件介绍 ELK 是ElasticSearch开源生态中提供的一套完整日志收集、分析以及展示的解决方案&#xff0c;是三个产品的首字母缩写&#xff0c;分别是ElasticSearch、Logstash 和 Kibana。除此之外&#xff0c;FileBeat也是…

【面试干货】抽象类的意义与应用

【面试干货】抽象类的意义与应用 1、为其他子类提供一个公共的类型2、封装子类中重复定义的内容3、定义抽象方法&#xff0c;子类虽然有不同的实现&#xff0c;但是定义时一致的4、示例代码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在…

kettle从入门到精通 第七十二课 ETL之kettle 三谈http post(含文件上传),彻底掌握参数传递

场景&#xff1a;群里有个小伙伴在使用http post步骤调用接口时遇到问题&#xff0c;postman调用正常&#xff0c;但是kettle中调用异常。 解决方案&#xff1a;既然postman调用接口正常&#xff0c;肯定是http post步骤中某些参数设置的不正确导致的。那就把常用的方式都梳理下…

探索AI前沿:本地部署GPT-4o,打造专属智能助手!

目录 1、获取API_key 2、开始调用 3、openai连接异常 4、解决方法&#xff1a; 5、调用GPT-4o 1、获取API_key 这里就不多赘述了&#xff0c;大家可以参考下面这篇博客 怎么获取OpenAI的api-key【人工智能】https://blog.csdn.net/qq_51625007/article/details/13763274…

Open WebUI的SearXNG网络搜索配置【403报错解决方法】

1.拉取SearXNG镜像 docker pull searxng/searxng 2.在Docker Desktop的Images界面中启动searxng容器 3.查看searxng是否部署成功 在Docker Desktop的Containers界面中&#xff0c;查看searxgn暴露的端口。 http://localhost:31292/ 4.修改settings.yml配置参数 在Docker De…

[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码

国内每年都会发生大大小小的火灾&#xff0c;造成生命、财产的损失。但是很多火灾如果能够早期发现&#xff0c;并及时提供灭火措施&#xff0c;将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码&#xff0c;当检测到火灾时&#xff0c;能否发出…

链式二叉树

链式二叉树 链式二叉树结构二叉树的遍历二叉树前序遍历二叉树中续遍历二叉树后续遍历二叉树层序遍历 二叉树节点个数和高度等二叉树节点个数二叉树叶子节点个数二叉树第k层节点个数单值二叉树对称二叉树相同的二叉树二叉树的前序遍历二叉树的中序遍历二叉树的后序遍历另一棵树的…

SpringCloud 基于Nacos和Eureka 实现双注册双订阅

一、使用场景/原因 过渡期迁移: 当系统从一个服务注册中心迁移到另一个时&#xff0c;例如从 Eureka 迁移到 Nacos&#xff0c;可以在过渡期内同时使用两个注册中心&#xff0c;确保服务平稳迁移&#xff0c;逐步过渡&#xff0c;避免一次性切换带来的风险。 兼容性考虑: 不同的…

ASP.NET Core 6.0 使用 Log4Net 和 Nlog日志中间件

前言 两年前,浅浅的学过 .NET 6,为啥要记录下来,大概是为了以后搭架子留下引线,还有抛砖引玉。 1. 环境准备 下载 建议使用 Visual Studio 2022 开发版 官网的下载地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具借助 Visual Studio 设计,具有自动完成…

支付宝推出NFC(近场通信)碰一碰支付功能

近日&#xff0c;支付宝推出NFC&#xff08;近场通信&#xff09;碰一碰支付功能&#xff0c;支持iPhone、安卓手机。NFC支付早已不是新事物&#xff0c;从二维码支付重回NFC支付&#xff0c;支付宝能撬动市场吗&#xff1f; 根据网友反馈&#xff0c;目前支付宝正在上海静安大…

海外社媒网站抓取经验总结:如何更高效实现网页抓取?

有效的网络抓取需要采取战略方法来克服挑战并确保最佳数据提取。让我们深入研究一些关键实践&#xff0c;这些实践将使您能够掌握复杂的网络抓取。 一、了解 Web 抓取检测 在深入探讨最佳实践之前&#xff0c;让我们先了解一下网站如何识别和抵御网络爬虫。了解您在这一过程中…

2-12 基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪

基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪。输出跟踪轨迹及其误差。程序已调通&#xff0c;可直接运行。 2-12 CV模型卡尔曼滤波 CT模型卡尔曼滤波 - 小红书 (xiaohongshu.com)

千年古城的味蕾传奇-平凉锅盔

在甘肃平凉这片古老而神秘的土地上&#xff0c;有一种美食历经岁月的洗礼&#xff0c;依然散发着独特的魅力&#xff0c;那便是平凉锅盔。平凉锅盔&#xff0c;那可是甘肃平凉的一张美食名片。它外表金黄&#xff0c;厚实饱满&#xff0c;就像一轮散发着诱人香气的金黄月亮。甘…