目标
在本教程中,您将学习如何:
- 使用 cv::GeneralizedHoughBallard 和 cv::GeneralizedHoughGuil 检测对象
例
这个程序是做什么的?
- 加载图像和模板
图像
模板
- 实例化 cv::GeneralizedHoughBallard 借助
createGeneralizedHoughBallard()
- 在
createGeneralizedHoughGuil()
- 为两个 GeneralizedHough 变体设置所需的参数
- 检测并显示发现的结果
-
注意
这两个变体都不能直接实例化。需要使用 create 方法。Guil Hough 很慢。计算本教程中使用的“迷你”文件的结果只需几秒钟。使用更高分辨率的图像和模板,如下所示,我的笔记本大约需要 5 分钟来计算结果。
图像
模板
法典
本教程的完整代码如下所示。
#include “opencv2/highgui.hpp”
#include“opencv2/imgproc.hpp”
使用命名空间 CV;
使用命名空间 std;
int main() {
加载源图像和灰度模板
示例::addSamplesDataSearchSubDirectory(“doc/tutorials/imgproc/generalized_hough_ballard_guil”);
Mat 图像 = imread(samples::findFile(“images/generalized_hough_mini_image.jpg”));
Mat templ = imread(samples::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 = RotatedRect(Point2f((*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 = RotatedRect(Point2f((*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 图像 = imread(samples::findFile(“images/generalized_hough_mini_image.jpg”));
Mat templ = imread(samples::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”, 图像);
等待键();
结果
结果图像
蓝色矩形显示 cv::GeneralizedHoughBallard 的结果,绿色矩形显示 cv::GeneralizedHoughGuil 的结果。
如果参数不能完全适应样品,则不太可能获得像本例中那样的完美结果。下面显示了一个参数不太完美的示例。对于巴拉德变体,在此图像上,只有结果的中心被标记为黑点。矩形将与上一张图像上的矩形相同。
在线教程
- 麻省理工学院人工智能视频教程 – 麻省理工人工智能课程
- 人工智能入门 – 人工智能基础学习。Peter Norvig举办的课程
- EdX 人工智能 – 此课程讲授人工智能计算机系统设计的基本概念和技术。
- 人工智能中的计划 – 计划是人工智能系统的基础部分之一。在这个课程中,你将会学习到让机器人执行一系列动作所需要的基本算法。
- 机器人人工智能 – 这个课程将会教授你实现人工智能的基本方法,包括:概率推算,计划和搜索,本地化,跟踪和控制,全部都是围绕有关机器人设计。
- 机器学习 – 有指导和无指导情况下的基本机器学习算法
- 机器学习中的神经网络 – 智能神经网络上的算法和实践经验
- 斯坦福统计学习
有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
人工智能书籍
- OpenCV(中文版).(布拉德斯基等)
- OpenCV+3计算机视觉++Python语言实现+第二版
- OpenCV3编程入门 毛星云编著
- 数字图像处理_第三版
- 人工智能:一种现代的方法
- 深度学习面试宝典
- 深度学习之PyTorch物体检测实战
- 吴恩达DeepLearning.ai中文版笔记
- 计算机视觉中的多视图几何
- PyTorch-官方推荐教程-英文版
- 《神经网络与深度学习》(邱锡鹏-20191121)
- …
第一阶段:零基础入门(3-6个月)
新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。
第二阶段:基础进阶(3-6个月)
熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。
第三阶段:工作应用
这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。
有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓