OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
用于快速边缘检测的结构化森林

简介

在本教程中,您将学习如何使用结构化森林来检测图像中的边缘。

示例

image
image
image
image
image
image
image
image
image
image
image
image
注意
像 Canny 边缘检测器这样的二值化技术适用于由两种算法(Sobel 和 StructuredEdgeDetection::detectEdges)产生的边缘。

源代码

1/**************************************************************************************
2用于快速边缘检测的结构化森林演示需要您提供一个模型。
3可以在 Github 上的 opencv_extra 存储库中找到此模型,链接如下:
4https://github.com/opencv/opencv_extra/blob/master/testdata/cv/ximgproc/model.yml.gz
5***************************************************************************************/
6
8#include "opencv2/highgui.hpp"
9#include <iostream>
10
11using namespace cv;
12using namespace cv::ximgproc;
13
14const char* keys =
15{
16 "{i || 输入图像文件名}"
17 "{m || 模型文件名}"
18 "{o || 输出图像文件名}"
19};
20
21int main( int argc, const char** argv )
22{
23 CommandLineParser parser(argc, argv, keys);
24 parser.about("此示例演示了使用结构化森林进行快速边缘检测");
25 parser.printMessage();
26
27 if ( !parser.check() )
28 {
29 parser.printErrors();
30 return -1;
31 }
32
33 String modelFilename = parser.get<String>("m");
34 String inFilename = parser.get<String>("i");
35 String outFilename = parser.get<String>("o");
36
38 Mat image = imread(inFilename, IMREAD_COLOR);
39 if ( image.empty() )
40 CV_Error(Error::StsError, String("无法读取图像文件:") + inFilename);
42
43 if ( modelFilename.size() == 0)
44 CV_Error(Error::StsError, String("空的模型名称"));
45
47 image.convertTo(image, DataType<float>::type, 1/255.0);
49
50 TickMeter tm;
51 tm.start();
54 createStructuredEdgeDetection(modelFilename);
56
57 tm.stop();
58 std::cout << "createStructuredEdgeDetection() 时间: " << tm << std::endl;
59
60 tm.reset();
61 tm.start();
63 Mat edges;
64 pDollar->detectEdges(image, edges);
66 tm.stop();
67 std::cout << "detectEdges() 时间: " << tm << std::endl;
68
69 tm.reset();
70 tm.start();
72 // 从边缘图计算方向
73 Mat orientation_map;
74 pDollar->computeOrientation(edges, orientation_map);
75
76 // 抑制边缘
77 Mat edge_nms;
78 pDollar->edgesNms(edges, orientation_map, edge_nms, 2, 0, 1, true);
80
81 tm.stop();
82 std::cout << "nms 时间: " << tm << std::endl;
83
85 if ( outFilename.size() == 0 )
86 {
87 imshow("edges", edges);
88 imshow("edges nms", edge_nms);
89 waitKey(0);
90 }
91 else
92 imwrite(outFilename, 255*edges);
94
95 return 0;
96}
如果数组没有元素,则返回 true。
int64_t int64
OpenCV 原始数据类型的模板“特征”类。
定义 traits.hpp:113
n 维密集数组类
定义 mat.hpp:830
一个用于测量流逝时间的类。
定义 utility.hpp:326
void start()
开始计时。
定义 utility.hpp:335
void stop()
停止计时。
定义 utility.hpp:341
void reset()
重置内部值。
定义 utility.hpp:430
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
#define CV_Error(code, msg)
调用错误处理程序。
定义 base.hpp:399
CV_EXPORTS_W bool imwrite(const String &filename, InputArray img, const std::vector< int > &params=std::vector< int >())
将图像保存到指定文件。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
◆ detect()

说明

  1. 加载源彩色图像

    Mat image = imread(inFilename, IMREAD_COLOR);
    if ( image.empty() )
    CV_Error(Error::StsError, String("无法读取图像文件:") + inFilename);
  2. 将源图像转换为 float [0;1] 范围

    image.convertTo(image, DataType<float>::type, 1/255.0);
  3. 运行主要算法

    Mat edges;
    pDollar->detectEdges(image, edges);
    // 从边缘图计算方向
    Mat orientation_map;
    pDollar->computeOrientation(edges, orientation_map);
    // 抑制边缘
    Mat edge_nms;
    pDollar->edgesNms(edges, orientation_map, edge_nms, 2, 0, 1, true);
  4. 显示结果

    if ( outFilename.size() == 0 )
    {
    imshow("edges", edges);
    imshow("edges nms", edge_nms);
    waitKey(0);
    }
    else
    imwrite(outFilename, 255*edges);

文献

有关更多信息,请参阅以下论文:[72] [171]