OPENCV例子opencv-4.5.5\samples\gpu\generalized_hough.cpp的代码分析

2023-12-29 16:50

本文主要是介绍OPENCV例子opencv-4.5.5\samples\gpu\generalized_hough.cpp的代码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该程序演示了使用广义霍夫变换进行任意对象查找,仅检测位置,无需平移和旋转。

相关类的继承关系如下图:

示例的调用关系如下图:

 

main的调用关系如下图:

 

main的流程图如下图:

 

main的UML逻辑图如下图:

 

示例源代码:

#include <vector>

#include <iostream>

#include <string>

#include "opencv2/core.hpp"

#include "opencv2/core/utility.hpp"

#include "opencv2/imgproc.hpp"

#include "opencv2/cudaimgproc.hpp"

#include "opencv2/highgui.hpp"

using namespace std;

using namespace cv;

static Mat loadImage(const string& name)

{

    Mat image = imread(name, IMREAD_GRAYSCALE);

    if (image.empty())

    {

        cerr << "Can't load image - " << name << endl;//无法载入图片

        exit(-1);

    }

    return image;

}

int main(int argc, const char* argv[])

{

    CommandLineParser cmd(argc, argv,

        "{ image i        | ../data/pic1.png  | input image }"           //图片i

        "{ template t     | templ.png | template image }"                //模板        

        "{ full           |           | estimate scale and rotation }"        //估计尺度和旋转        

        "{ gpu            |           | use gpu version }"        //使用GPU

        "{ minDist        | 100       | minimum distance between the centers of the detected objects }"//最小的距离(被检测物体的中心之间)

        "{ levels         | 360       | R-Table levels }"//RTable的层级

        "{ votesThreshold | 30        | the accumulator threshold for the template centers at the detection stage. The smaller it is, the more false positions may be detected }"//检测阶段模板中心的累加器阈值。它越小,可能检测到的错误位置越多

        "{ angleThresh    | 10000     | angle votes threshold }"//角度门槛

        "{ scaleThresh    | 1000      | scale votes threshold }"//尺度门槛

        "{ posThresh      | 100       | position votes threshold }"//位置门槛

        "{ dp             | 2         | inverse ratio of the accumulator resolution to the image resolution }"//累加器分辨率与图像分辨率的反比

        "{ minScale       | 0.5       | minimal scale to detect }"//检测的最小尺度

        "{ maxScale       | 2         | maximal scale to detect }"//检测的最大尺度

        "{ scaleStep      | 0.05      | scale step }"//尺度步长

        "{ minAngle       | 0         | minimal rotation angle to detect in degrees }"//以度为单位检测的最小旋转角度

        "{ maxAngle       | 360       | maximal rotation angle to detect in degrees }"//以度为单位检测的最大旋转角度

        "{ angleStep      | 1         | angle step in degrees }"//角度步长

        "{ maxBufSize     | 1000      | maximal size of inner buffers }"//内部缓冲区的最大大小

        "{ help h ?       |           | print help message }"//打印帮助信息

    );

    cmd.about("This program demonstrates arbitrary object finding with the Generalized Hough transform.");

    if (cmd.has("help"))

    {

        cmd.printMessage();

        return 0;

    }

    const string templName = cmd.get<string>("template");

    const string imageName = cmd.get<string>("image");

    const bool full = cmd.has("full");

    const bool useGpu = cmd.has("gpu");

    const double minDist = cmd.get<double>("minDist");

    const int levels = cmd.get<int>("levels");

    const int votesThreshold = cmd.get<int>("votesThreshold");

    const int angleThresh = cmd.get<int>("angleThresh");

    const int scaleThresh = cmd.get<int>("scaleThresh");

    const int posThresh = cmd.get<int>("posThresh");

    const double dp = cmd.get<double>("dp");

    const double minScale = cmd.get<double>("minScale");

    const double maxScale = cmd.get<double>("maxScale");

    const double scaleStep = cmd.get<double>("scaleStep");

    const double minAngle = cmd.get<double>("minAngle");

    const double maxAngle = cmd.get<double>("maxAngle");

    const double angleStep = cmd.get<double>("angleStep");

    const int maxBufSize = cmd.get<int>("maxBufSize");

    if (!cmd.check())

    {

        cmd.printErrors();

        return -1;

    }

    Mat templ = loadImage(templName);

    Mat image = loadImage(imageName);

    Ptr<GeneralizedHough> alg;

    if (!full)

    {

        Ptr<GeneralizedHoughBallard> ballard = useGpu ? cuda::createGeneralizedHoughBallard() : createGeneralizedHoughBallard();

        ballard->setMinDist(minDist);

        ballard->setLevels(levels);

        ballard->setDp(dp);

        ballard->setMaxBufferSize(maxBufSize);

        ballard->setVotesThreshold(votesThreshold);

        alg = ballard;

    }

    else

    {

        Ptr<GeneralizedHoughGuil> guil = useGpu ? cuda::createGeneralizedHoughGuil() : createGeneralizedHoughGuil();

        guil->setMinDist(minDist);

        guil->setLevels(levels);

        guil->setDp(dp);

        guil->setMaxBufferSize(maxBufSize);

        guil->setMinAngle(minAngle);

        guil->setMaxAngle(maxAngle);

        guil->setAngleStep(angleStep);

        guil->setAngleThresh(angleThresh);

        guil->setMinScale(minScale);

        guil->setMaxScale(maxScale);

        guil->setScaleStep(scaleStep);

        guil->setScaleThresh(scaleThresh);

        guil->setPosThresh(posThresh);

        alg = guil;

    }

    vector<Vec4f> position;

    TickMeter tm;

    if (useGpu)

    {

        cuda::GpuMat d_templ(templ);

        cuda::GpuMat d_image(image);

        cuda::GpuMat d_position;

        alg->setTemplate(d_templ);

        tm.start();

        alg->detect(d_image, d_position);

        d_position.download(position);

        tm.stop();

    }

    else

    {

        alg->setTemplate(templ);

        tm.start();

        alg->detect(image, position);

        tm.stop();

    }

    cout << "Found : " << position.size() << " objects" << endl;

    cout << "Detection time : " << tm.getTimeMilli() << " ms" << endl;

    Mat out;

    cv::cvtColor(image, out, COLOR_GRAY2BGR);

    for (size_t i = 0; i < position.size(); ++i)

    {

        Point2f pos(position[i][0], position[i][1]);

        float scale = position[i][2];

        float angle = position[i][3];

        RotatedRect rect;

        rect.center = pos;

        rect.size = Size2f(templ.cols * scale, templ.rows * scale);

        rect.angle = angle;

        Point2f pts[4];

        rect.points(pts);

        line(out, pts[0], pts[1], Scalar(0, 0, 255), 3);

        line(out, pts[1], pts[2], Scalar(0, 0, 255), 3);

        line(out, pts[2], pts[3], Scalar(0, 0, 255), 3);

        line(out, pts[3], pts[0], Scalar(0, 0, 255), 3);

    }

    imshow("out", out);

    waitKey();

    return 0;

}

这篇关于OPENCV例子opencv-4.5.5\samples\gpu\generalized_hough.cpp的代码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

如何用GPU算力卡P100玩黑神话悟空?

精力有限,只记录关键信息,希望未来能够有助于其他人。 文章目录 综述背景评估游戏性能需求显卡需求CPU和内存系统需求主机需求显式需求 实操硬件安装安装操作系统Win11安装驱动修改注册表选择程序使用什么GPU 安装黑神话悟空其他 综述 用P100 + PCIe Gen3.0 + Dell720服务器(32C64G),运行黑神话悟空画质中等流畅运行。 背景 假设有一张P100-

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在