OpenCV  4.10.0
开放源代码计算机视觉
正在加载...
正在搜索...
无匹配项
用于快速边缘检测的结构化森林

简介

在本教程中,你将了解如何使用结构森林在图像中检测边缘。

示例

图像
图像
图像
图像
图像
图像
图像
图像
图像
图像
图像
图像
注意
二值化技术,如 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 || input image file name}"
17 "{m || model file name}"
18 "{o || output image file name}"
19};
20
21int main( int argc, const char** argv )
22{
23 CommandLineParser parser(argc, argv, keys);
24 parser.about("此样本演示了如何使用用于快速边缘检测的结构化森林");
25 parser.printMessage();
26
27 如果 ( !parser.check() )
28 {
29 parser.printErrors();
30 返回 -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 如果 ( image.empty() )
40 CV_Error(Error::StsError, String("无法读取图像文件: ") + inFilename);
42
43 如果 ( 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() time : " << tm << std::endl;
68
69 tm.reset();
70 tm.start();
72 // computes orientation from edge map
73 Mat orientation_map;
74 pDollar->computeOrientation(edges, orientation_map);
75
76 // suppress edges
77 Mat edge_nms;
78 pDollar->edgesNms(edges, orientation_map, edge_nms, 2, 0, 1, true);
80
81 tm.stop();
82 std::cout << "nms time : " << 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}
用于命令行解析。
定义 utility.hpp:820
OpenCV 原始数据类型的模板“特征”类。
定义 traits.hpp:113
n 维密集数组类
定义 mat.hpp:812
用于测量经过时间的类。
定义 utility.hpp:295
void start()
开始计数刻度。
定义 utility.hpp:304
void stop()
停止计数刻度。
定义 utility.hpp:310
void reset()
重置内部值。
定义 utility.hpp:374
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
#define CV_Error(code, msg)
调用错误处理程序。
定义 base.hpp:320
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
定义 ximgproc.hpp:125
与一个文件系统上的文件关联的文件存储的“黑匣子”表示。
定义 core.hpp:102

说明

  1. 加载源彩色图像

    Mat image = imread(inFilename, IMREAD_COLOR);
    if ( image.empty() )
    CV_Error(Error::StsError, String("Cannot read image file: ") + inFilename);
    bool empty() const
    如果数组没有元素,则返回真。
  2. 将源图像转换为浮点数 [0;1] 范围

    image.convertTo(image, DataType<float>::type, 1/255.0);
    void convertTo(OutputArray m, int rtype, double alpha=1, double beta=0) const
    将数组转换为另一种数据类型(可选缩放)。
  3. 运行主算法

    createStructuredEdgeDetection(modelFilename);
    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);

文献

更多信息,参考以下论文:[70] [168]