上一篇教程: 霍夫圆变换
下一篇教程: 重新映射
| |
原作者 | Markus Heck |
兼容性 | OpenCV >= 3.4 |
目标
在本教程中,您将学习如何:
示例
程序功能
- 加载图像和模板
- 使用 `createGeneralizedHoughBallard()` 实例化 cv::GeneralizedHoughBallard
- 使用 `createGeneralizedHoughGuil()` 实例化 cv::GeneralizedHoughGuil
- 为两种广义Hough变换设置所需的参数
- 检测并显示检测结果
- 注意
- 两种变换都不能直接实例化。必须使用create方法。
- Guil Hough 速度非常慢。在本教程中使用的“mini”文件计算结果只需几秒钟。对于更高分辨率的图像和模板(如下所示),我的笔记本电脑需要大约5分钟才能计算出结果。
代码
本教程的完整代码如下所示。
samples::addSamplesDataSearchSubDirectory("doc/tutorials/imgproc/generalized_hough_ballard_guil");
Mat image = 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<Vec4f> positionBallard, positionGuil;
ballard->setMinDist(10);
ballard->setLevels(360);
ballard->setDp(2);
ballard->setMaxBufferSize(1000);
ballard->setVotesThreshold(40);
ballard->setCannyLowThresh(30);
ballard->setCannyHighThresh(110);
ballard->setTemplate(templ);
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, positionBallard);
guil->detect(grayImage, positionGuil);
for (vector<Vec4f>::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) {
Size2f(w * (*iter)[2], h * (*iter)[2]),
(*iter)[3]);
for (int i = 0; i < 4; i++)
line(image, vertices[i], vertices[(i + 1) % 4],
Scalar(255, 0, 0), 6);
}
for (vector<Vec4f>::iterator iter = positionGuil.begin(); iter != positionGuil.end(); ++iter) {
Size2f(w * (*iter)[2], h * (*iter)[2]),
(*iter)[3]);
for (int i = 0; i < 4; i++)
line(image, vertices[i], vertices[(i + 1) % 4],
Scalar(0, 255, 0), 2);
}
imshow("result_img", image);
waitKey();
return EXIT_SUCCESS;
}
int rows
行和列的数量,当矩阵维度超过2维时为(-1, -1)
定义 mat.hpp:2155
此类表示平面上的旋转矩形(即非正矩形)。
定义 types.hpp:538
void points(Point2f pts[]) const
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
解释
加载图像、模板和设置变量
samples::addSamplesDataSearchSubDirectory("doc/tutorials/imgproc/generalized_hough_ballard_guil");
Mat image = 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<Vec4f> positionBallard, positionGuil;
位置向量将包含检测器找到的匹配项。每个条目包含四个浮点值:位置向量
- [0]:中心点的x坐标
- [1]:中心点的y坐标
- [2]:检测到的目标相对于模板的比例
- [3]:检测到的目标相对于模板的旋转角度(度)
例如:[200, 100, 0.9, 120]
参数设置
Ptr<GeneralizedHoughBallard> ballard = createGeneralizedHoughBallard();
ballard->setMinDist(10);
ballard->setLevels(360);
ballard->setDp(2);
ballard->setMaxBufferSize(1000);
ballard->setVotesThreshold(40);
ballard->setCannyLowThresh(30);
ballard->setCannyHighThresh(110);
ballard->setTemplate(templ);
Ptr<GeneralizedHoughGuil> 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, positionBallard);
guil->detect(grayImage, positionGuil);
如上所述,此步骤将花费一些时间,尤其是在处理较大的图像以及使用Guil时。
绘制结果并显示图像
for (vector<Vec4f>::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) {
Size2f(w * (*iter)[2], h * (*iter)[2]),
(*iter)[3]);
for (int i = 0; i < 4; i++)
line(image, vertices[i], vertices[(i + 1) % 4], Scalar(255, 0, 0), 6);
}
for (vector<Vec4f>::iterator iter = positionGuil.begin(); iter != positionGuil.end(); ++iter) {
Size2f(w * (*iter)[2], h * (*iter)[2]),
(*iter)[3]);
for (int i = 0; i < 4; i++)
line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2);
}
imshow("result_img", image);
结果
结果图像
蓝色矩形显示了cv::GeneralizedHoughBallard的结果,绿色矩形显示了cv::GeneralizedHoughGuil的结果。
如果参数没有完美地适应样本,则不太可能获得像此示例中那样的完美结果。下面显示了一个参数不太完美的结果示例。对于Ballard变体,仅用黑点标记结果的中心。矩形将与上一图像中的相同。
不太完美的结果