OpenCV 4.11.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 || 输入图像文件名}"
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}
用于命令行解析。
定义 utility.hpp:890
OpenCV基本数据类型的模板“特性”类。
定义 traits.hpp:113
n维密集数组类
定义 mat.hpp:829
用于测量时间流逝的类。
定义 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
定义 cvstd_wrapper.hpp:23
#define CV_Error(code, msg)
调用错误处理器。
定义 base.hpp:335
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:107

说明

  1. 加载源彩色图像

    Mat image = imread(inFilename, IMREAD_COLOR);
    if ( image.empty() )
    CV_Error(Error::StsError, String("无法读取图像文件: ") + inFilename);
  2. 将源图像转换为浮点数[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);

参考文献

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