43#include <opencv2/opencv_modules.hpp>
45#ifdef HAVE_OPENCV_FEATURES2D
57static const char* keys =
58{
"{@image_path | | Image path }" };
62 cout <<
"\n此示例演示了BinaryDescriptor类提供的线段提取功能\n"
63 <<
"请使用以下形式的命令运行此示例:\n" <<
"./example_line_descriptor_lines_extraction <path_to_input_image>" << endl;
66int main(
int argc,
char** argv )
72 if( image_path.empty() )
80 if( imageMat.
data == NULL )
82 std::cout <<
"错误,图像无法加载。请检查其路径" << std::endl;
93 vector<KeyLine> lines;
97 bd->detect( imageMat, lines, 2, 1, mask );
101 cvtColor( output, output, COLOR_GRAY2BGR );
102 for (
size_t i = 0; i < lines.size(); i++ )
108 int R = ( rand() % (int) ( 255 + 1 ) );
109 int G = ( rand() % (int) ( 255 + 1 ) );
110 int B = ( rand() % (int) ( 255 + 1 ) );
117 line( output, pt1, pt2,
Scalar( B, G, R ), 3 );
123 imshow(
"LSD lines", output );
131 std::cerr <<
"OpenCV 构建时未包含 features2d 模块" << std::endl;
用于命令行解析。
定义 utility.hpp:890
CV_NODISCARD_STD Mat clone() const
创建数组及其底层数据的完整副本。
MatSize size
定义 mat.hpp:2177
uchar * data
指向数据的指针
定义 mat.hpp:2157
int channels() const
返回矩阵通道数。
std::string String
定义 cvstd.hpp:151
std::shared_ptr< _Tp > Ptr
定义 cvstd_wrapper.hpp:23
#define CV_8UC1
定义 interface.h:88
GMat mask(const GMat &src, const GMat &mask)
将掩码应用于矩阵。
void imshow(const String &winname, InputArray mat)
在指定的窗口中显示图像。
int waitKey(int delay=0)
等待按键按下。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
从文件中加载图像。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
将图像从一个颜色空间转换为另一个颜色空间。
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
绘制连接两点的线段。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
表示一条线的类。
定义 descriptor.hpp:105
float endPointY
定义 descriptor.hpp:131
float startPointX
定义 descriptor.hpp:128
float endPointX
定义 descriptor.hpp:130
float startPointY
定义 descriptor.hpp:129
int octave
定义 descriptor.hpp:114
43#include <opencv2/opencv_modules.hpp>
45#ifdef HAVE_OPENCV_FEATURES2D
53#define MATCHES_DIST_THRESHOLD 25
58static const char* keys =
59{
"{@image_path1 | | 图像路径 1 }"
60 "{@image_path2 | | 图像路径 2 }" };
64 std::cout <<
"\n此示例演示了 BinaryDescriptor 类提供的线提取和描述符计算功能\n"
65 <<
"请使用以下形式的命令运行此示例:\n" <<
"./example_line_descriptor_compute_descriptors <输入图像路径 1>"
66 <<
"<输入图像路径 2>" << std::endl;
70int main(
int argc,
char** argv )
77 if( image_path1.empty() || image_path2.empty() )
87 if( imageMat1.
data == NULL || imageMat2.
data == NULL )
89 std::cout <<
"错误,图像无法加载。请检查路径" << std::endl;
100 std::vector<KeyLine> keylines1, keylines2;
103 ( *bd )( imageMat1, mask1, keylines1, descr1,
false, false );
104 ( *bd )( imageMat2, mask2, keylines2, descr2,
false, false );
107 std::vector<KeyLine> lbd_octave1, lbd_octave2;
108 Mat left_lbd, right_lbd;
109 for (
int i = 0; i < (int) keylines1.size(); i++ )
111 if( keylines1[i].octave == 0 )
113 lbd_octave1.push_back( keylines1[i] );
118 for (
int j = 0; j < (int) keylines2.size(); j++ )
120 if( keylines2[j].octave == 0 )
122 lbd_octave2.push_back( keylines2[j] );
131 std::vector<DMatch> matches;
132 bdm->match( left_lbd, right_lbd, matches );
135 std::vector<DMatch> good_matches;
136 for (
int i = 0; i < (int) matches.size(); i++ )
138 if( matches[i].distance < MATCHES_DIST_THRESHOLD )
139 good_matches.push_back( matches[i] );
145 std::vector<char>
mask( matches.size(), 1 );
146 drawLineMatches( imageMat1, lbd_octave1, imageMat2, lbd_octave2, good_matches, outImg, Scalar::all( -1 ), Scalar::all( -1 ), mask,
147 DrawLinesMatchesFlags::DEFAULT );
149 imshow(
"Matches", outImg );
151 imwrite(
"/home/ubisum/Desktop/images/env_match/matches.jpg", outImg);
156 `std::vector<KeyLine> klsd1, klsd2;`
157 `cv::Mat lsd_descr1, lsd_descr2;`
158 `lsd->detect(imageMat1, klsd1, 2, 2, mask1);`
159 `lsd->detect(imageMat2, klsd2, 2, 2, mask2);`
162 `bd->compute(imageMat1, klsd1, lsd_descr1);`
163 `bd->compute(imageMat2, klsd2, lsd_descr2);`
166 `std::vector<KeyLine> octave0_1, octave0_2;`
167 `cv::Mat leftDEscr, rightDescr;`
168 `for (int i = 0; i < (int)klsd1.size(); i++)`
170 `if (klsd1[i].octave == 1)`
172 `octave0_1.push_back(klsd1[i]);`
173 `leftDEscr.push_back(lsd_descr1.row(i));`
177 `for (int j = 0; j < (int)klsd2.size(); j++)`
179 `if (klsd2[j].octave == 1)`
181 `octave0_2.push_back(klsd2[j]);`
182 `rightDescr.push_back(lsd_descr2.row(j));`
187 `std::vector<DMatch> lsd_matches;`
188 `bdm->match(leftDEscr, rightDescr, lsd_matches);`
191 `good_matches.clear();`
192 `for (int i = 0; i < (int)lsd_matches.size(); i++)`
194 `if (lsd_matches[i].distance < MATCHES_DIST_THRESHOLD)`
195 `good_matches.push_back(lsd_matches[i]);`
199 `cv::Mat lsd_outImg;`
200 `resize(imageMat1, imageMat1, cv::Size(imageMat1.cols / 2, imageMat1.rows / 2), 0, 0, INTER_LINEAR_EXACT);`
201 `resize(imageMat2, imageMat2, cv::Size(imageMat2.cols / 2, imageMat2.rows / 2), 0, 0, INTER_LINEAR_EXACT);`
202 `std::vector<char> lsd_mask(matches.size(), 1);`
203 `drawLineMatches(imageMat1, octave0_1, imageMat2, octave0_2, good_matches, lsd_outImg, cv::Scalar::all(-1), cv::Scalar::all(-1), lsd_mask,`
204 `DrawLinesMatchesFlags::DEFAULT);`
206 `imshow("LSD matches", lsd_outImg);`
216 `std::cerr << "OpenCV was built without features2d module" << std::endl;`
`Mat row(int y) const`
创建指定矩阵行的矩阵头。
`void push_back(const _Tp &elem)`
在矩阵底部添加元素。
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
`CV_EXPORTS_W bool imwrite(const String &filename, InputArray img, const std::vector< int > ¶ms=std::vector< int >())`
将图像保存到指定文件。
`void drawLineMatches(const Mat &img1, const std::vector< KeyLine > &keylines1, const Mat &img2, const std::vector< KeyLine > &keylines2, const std::vector< DMatch > &matches1to2, Mat &outImg, const Scalar &matchColor=Scalar::all(-1), const Scalar &singleLineColor=Scalar::all(-1), const std::vector< char > &matchesMask=std::vector< char >(), int flags=DrawLinesMatchesFlags::DEFAULT)`
绘制两幅图像中找到的关键线匹配结果。
43#include <opencv2/opencv_modules.hpp>
45#ifdef HAVE_OPENCV_FEATURES2D
58static const std::string images[] =
59{
"cameraman.jpg",
"church.jpg",
"church2.png",
"einstein.jpg",
"stuff.jpg" };
61static const char* keys =
62{
"{@image_path | | Image path }" };
66 std::cout <<
"\n此示例演示了半径匹配的功能,请使用以下格式的命令运行此示例:\n"
67 <<
"./example_line_descriptor_radius_matching <输入图像路径>/" << std::endl;
70int main(
int argc,
char** argv )
77 int num_elements =
sizeof ( images ) /
sizeof ( images[0] );
78 std::vector < Mat > descriptorsMat;
79 std::vector < std::vector<KeyLine> > linesMat;
82 Ptr < BinaryDescriptor > bd = BinaryDescriptor::createBinaryDescriptor();
85 for (
int i = 0; i < num_elements; i++ )
88 std::stringstream image_path;
89 image_path << pathToImages << images[i];
90 std::cout << image_path.str().c_str() << std::endl;
93 Mat loadedImage =
imread( image_path.str().c_str(), 1 );
94 if( loadedImage.
data == NULL )
96 std::cout <<
"无法加载图像。" << std::endl;
102 std::vector < KeyLine > lines;
104 bd->detect( loadedImage, lines );
105 bd->compute( loadedImage, lines, computedDescr );
107 descriptorsMat.push_back( computedDescr );
108 linesMat.push_back( lines );
114 for (
size_t j = 0; j < descriptorsMat.size(); j++ )
116 if( descriptorsMat[j].rows >= 5 )
117 queries.
push_back( descriptorsMat[j].rowRange( 0, 5 ) );
119 else if( descriptorsMat[j].rows > 0 && descriptorsMat[j].rows < 5 )
126 Ptr < BinaryDescriptorMatcher > bdm = BinaryDescriptorMatcher::createBinaryDescriptorMatcher();
129 bdm->add( descriptorsMat );
132 std::vector < std::vector<DMatch> > matches;
133 bdm->radiusMatch( queries, matches, 30 );
134 std::cout <<
"匹配样本大小 " << matches.size() << std::endl;
136 for (
int i = 0; i < (int) matches.size(); i++ )
138 for (
int j = 0; j < (int) matches[i].size(); j++ )
140 std::cout <<
"匹配:" << matches[i][j].queryIdx <<
" " << matches[i][j].trainIdx <<
" " << matches[i][j].distance << std::endl;
151 std::cerr <<
"OpenCV 构建时未包含 features2d 模块" << std::endl;
int rows
行数和列数,当矩阵维度超过2维时为(-1, -1)
定义 mat.hpp:2155