使用广义巴拉德变换和 Guil Hough 变换进行目标检测

目标

在本教程中,您将学习如何:

这个程序是做什么的?

  1. 加载图像和模板

generalized_hough_mini_image.jpg

图像

generalized_hough_mini_template.jpg

模板

  1. 实例化 cv::GeneralizedHoughBallard 借助createGeneralizedHoughBallard()
  2. createGeneralizedHoughGuil()
  3. 为两个 GeneralizedHough 变体设置所需的参数
  4. 检测并显示发现的结果
  • 注意

    这两个变体都不能直接实例化。需要使用 create 方法。Guil Hough 很慢。计算本教程中使用的“迷你”文件的结果只需几秒钟。使用更高分辨率的图像和模板,如下所示,我的笔记本大约需要 5 分钟来计算结果。

generalized_hough_image.jpg

图像

generalized_hough_template.jpg

模板

法典

本教程的完整代码如下所示。

#include “opencv2/highgui.hpp

#include“opencv2/imgproc.hpp

使用命名空间 CV;

使用命名空间 std;

int main() {

加载源图像和灰度模板

示例::addSamplesDataSearchSubDirectory(“doc/tutorials/imgproc/generalized_hough_ballard_guil”);

Mat 图像 = imreadsamples::findFile(“images/generalized_hough_mini_image.jpg”));

Mat templ = imreadsamples::findFile(“images/generalized_hough_mini_template.jpg”), IMREAD_GRAYSCALE);

创建灰度图像

灰色图像;

cvtColor(image, grayImage, COLOR_RGB2GRAY);

为检测到的模板的位置、比例和旋转创建变量

vector positionBallard, positionGuil;

模板宽度和高度

​ int w = 模板。科尔斯;

​ int h = 模板。;

创建巴拉德并设置选项

Ptr ballard = createGeneralizedHoughBallard();

巴拉德->setMinDist(10);

巴拉德->setLevels(360);

巴拉德->setDp(2);

巴拉德->setMaxBufferSize(1000);

巴拉德->setVotesThreshold(40);

巴拉德->setCannyLowThresh(30);

ballard->setCannyHighThresh(110);

ballard->setTemplate(模板);

创建 guil 并设置选项

Ptr guil = createGeneralizedHoughGuil();

guil->setMinDist(10);

guil->setLevels(360);

guil->setDp(3);

guil->setMaxBufferSize(1000);

guil->setMinAngle(0);

guil->setMaxAngle(360);

guil->setAngleStep(1);

guil->setAngleThresh(1500);

guil->setMinScale(0.5);

guil->setMaxScale(2.0);

guil->setScaleStep(0.05);

guil->setScaleThresh(50);

guil->setPosThresh(10);

guil->setCannyLowThresh(30);

guil->setCannyHighThresh(110);

guil->setTemplate(templ);

执行巴拉德检测

ballard->detect(grayImage, position巴拉德);

执行 guil 检测

guil->detect(grayImage, positionGuil);

拉扯巴拉德

​ for (vector::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) {

​ RotatedRect rRect = RotatedRectPoint2f((*iter)[0], (*iter)[1]),

尺寸2f(w * (*iter)[2], h * (*iter)[2]),

(*国际搜索委员会)[3]);

Point2f 顶点[4];

rRect 中。(顶点);

​ for (int i = 0; i < 4; i++)

line(image, vertices[i], vertices[(i + 1) % 4], Scalar(255, 0, 0), 6);

​ }

画出guil

​ for (vector::iterator iter = positionGuil.begin(); iter != positionGuil.end(); ++iter) {

​ RotatedRect rRect = RotatedRectPoint2f((*iter)[0], (*iter)[1]),

尺寸2f(w * (*iter)[2], h * (*iter)[2]),

(*国际搜索委员会)[3]);

Point2f 顶点[4];

rRect 中。(顶点);

​ for (int i = 0; i < 4; i++)

line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2);

​ }

imshow(“result_img”, 图像);

等待键();

​ 返回EXIT_SUCCESS;

}

解释

加载图像、模板和设置变量

加载源图像和灰度模板

示例::addSamplesDataSearchSubDirectory(“doc/tutorials/imgproc/generalized_hough_ballard_guil”);

Mat 图像 = imreadsamples::findFile(“images/generalized_hough_mini_image.jpg”));

Mat templ = imreadsamples::findFile(“images/generalized_hough_mini_template.jpg”), IMREAD_GRAYSCALE);

创建灰度图像

垫灰色图像;

cvtColor(image, grayImage, COLOR_RGB2GRAY);

为检测到的模板的位置、比例和旋转创建变量

vector positionBallard, positionGuil;

模板宽度和高度

​ int w = templ.cols;

​ int h = templ.rows;

位置向量将包含检测器将找到的匹配项。每个条目包含四个浮点值:位置向量

  • [0]:中心点的 x 坐标
  • [1]:中心点的 y 坐标
  • [2]:检测到的对象与模板的比例比较
  • [3]:检测到的物体相对于模板的旋转度数

示例如下所示:[200, 100, 0.9, 120]

设置参数

创建巴拉德并设置选项

Ptr ballard = createGeneralizedHoughBallard();

巴拉德->setMinDist(10);

巴拉德->setLevels(360);

巴拉德->setDp(2);

巴拉德->setMaxBufferSize(1000);

巴拉德->setVotesThreshold(40);

巴拉德->setCannyLowThresh(30);

ballard->setCannyHighThresh(110);

ballard->setTemplate(模板);

创建 guil 并设置选项

Ptr guil = createGeneralizedHoughGuil();

guil->setMinDist(10);

guil->setLevels(360);

guil->setDp(3);

guil->setMaxBufferSize(1000);

guil->setMinAngle(0);

guil->setMaxAngle(360);

guil->setAngleStep(1);

guil->setAngleThresh(1500);

guil->setMinScale(0.5);

guil->setMaxScale(2.0);

guil->setScaleStep(0.05);

guil->setScaleThresh(50);

guil->setPosThresh(10);

guil->setCannyLowThresh(30);

guil->setCannyHighThresh(110);

guil->setTemplate(templ);

找到最佳值可能最终需要反复试验,并且取决于许多因素,例如图像分辨率。

运行检测

执行巴拉德检测

ballard->detect(grayImage, position巴拉德);

执行 guil 检测

guil->detect(grayImage, positionGuil);

如上所述,此步骤将需要一些时间,尤其是在使用较大的图像和使用 Guil 时。

绘制结果并显示图像

拉扯巴拉德

​ for (vector::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) {

RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]),

尺寸2f(w * (*iter)[2], h * (*iter)[2]),

(*国际搜索委员会)[3]);

Point2f 顶点[4];

rRect.points(顶点);

​ for (int i = 0; i < 4; i++)

line(image, vertices[i], vertices[(i + 1) % 4], Scalar(255, 0, 0), 6);

​ }

画出guil

​ for (vector::iterator iter = positionGuil.begin(); iter != positionGuil.end(); ++iter) {

RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]),

尺寸2f(w * (*iter)[2], h * (*iter)[2]),

(*国际搜索委员会)[3]);

Point2f 顶点[4];

rRect.points(顶点);

​ for (int i = 0; i < 4; i++)

line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2);

​ }

imshow(“result_img”, 图像);

等待键();

结果

generalized_hough_result_img.jpg

结果图像

蓝色矩形显示 cv::GeneralizedHoughBallard 的结果,绿色矩形显示 cv::GeneralizedHoughGuil 的结果。

如果参数不能完全适应样品,则不太可能获得像本例中那样的完美结果。下面显示了一个参数不太完美的示例。对于巴拉德变体,在此图像上,只有结果的中心被标记为黑点。矩形将与上一张图像上的矩形相同。

generalized_hough_less_perfect_result_img.jpg

在线教程

请添加图片描述

人工智能书籍

第一阶段:零基础入门(3-6个月)

新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。

第二阶段:基础进阶(3-6个月)

熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。

第三阶段:工作应用

这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。

有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值