Skip to content

Commit ce9cc9c

Browse files
committed
threading is managed by context passed to functions
1 parent 98f6579 commit ce9cc9c

File tree

12 files changed

+146
-134
lines changed

12 files changed

+146
-134
lines changed

src/autorectify.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,20 @@ void draw_lines(II first, II last, Mat & image)
100100
else
101101
{
102102
clr = colors[(g)%12];
103-
w = 3;
103+
w = 1;
104104
}
105105
line(image, cv::Point(l.x1, l.y1), cv::Point(l.x2, l.y2), clr, w);
106-
circle(image, cv::Point(l.x1, l.y1), 7, clr, -1);
107-
circle(image, cv::Point(l.x2, l.y2), 7, clr, -1);
106+
circle(image, cv::Point(l.x1, l.y1), 3, clr, -1);
107+
circle(image, cv::Point(l.x2, l.y2), 3, clr, -1);
108108
++first;
109109
}
110110
}
111111

112112
// Wrapper for find_line_segment_groups accepting OpenCV images of any size
113-
LineSegment * detect_line_groups(const Mat & image, int max_size, bool refine, int * n_lines)
113+
LineSegment * detect_line_groups(
114+
const Mat & image, int max_size, bool refine,
115+
int num_threads,
116+
int * n_lines)
114117
{
115118
Mat image_f = image;
116119
image.convertTo(image_f, CV_32F, 1/256.0);
@@ -124,7 +127,7 @@ LineSegment * detect_line_groups(const Mat & image, int max_size, bool refine, i
124127
int stride = w;
125128
int min_length = float(max(h,w)) / 100.0f;
126129

127-
LineSegment * lines = find_line_segment_groups(buffer, w, h, stride, min_length, refine, n_lines);
130+
LineSegment * lines = find_line_segment_groups(buffer, w, h, stride, min_length, refine, num_threads, n_lines);
128131

129132
// Scale lines back to the original image
130133
for (size_t i = 0; i < *n_lines; ++i)
@@ -322,14 +325,11 @@ int main(int argc, char ** argv)
322325

323326
///////////////////////////////////////////////////////////////////////////
324327

325-
// Set number of threads for parallelization
326-
set_num_threads(opts.num_threads);
327-
328328
// Detect lines in image
329329

330330
std::chrono::steady_clock::time_point t0 = std::chrono::steady_clock::now();
331-
int n_lines = 0;
332-
LineSegment * lines = detect_line_groups(image_8uc, opts.max_image_size, opts.refine_lines, &n_lines);
331+
int n_lines = 0;
332+
LineSegment * lines = detect_line_groups(image_8uc, opts.max_image_size, opts.refine_lines, opts.num_threads, &n_lines);
333333
// Now we have n_lines segments lines[0] .. lines[n_lines-1]
334334
// We can modify them, e.g. add user defined lines (remember to assign them to the correct group)
335335
std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();

src/filter.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,33 @@ using namespace std;
2626
namespace librectify {
2727

2828

29-
void maximum_filter(const Image & image, Image & out, int size)
29+
void maximum_filter(
30+
const Image & image, Image & out, int size,
31+
const ThreadContext & ctx
32+
)
3033
{
3134
int n = 2*size+1;
3235
out.resizeLike(image);
3336
out.setZero();
3437
#ifdef _OPENMP
35-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
38+
#pragma omp parallel for num_threads(ctx.get_num_threads()) if (ctx.enabled())
3639
#endif
3740
for (int i = 0; i < image.rows()-n+1; ++i)
3841
for (int j = 0; j < image.cols()-n+1; ++j)
3942
out(i+size,j+size) = image.block(i,j,n,n).maxCoeff();
4043
}
4144

4245

43-
void binary_dilate(const Mask & image, Mask & out)
46+
void binary_dilate(
47+
const Mask & image, Mask & out,
48+
const ThreadContext & ctx
49+
)
4450
{
4551
int n = 3;
4652
out.resizeLike(image);
4753
out.setZero();
4854
#ifdef _OPENMP
49-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
55+
#pragma omp parallel for num_threads(ctx.get_num_threads()) if (ctx.enabled())
5056
#endif
5157
for (int i = 0; i < image.rows()-n+1; ++i)
5258
for (int j = 0; j < image.cols()-n+1; ++j)
@@ -72,7 +78,10 @@ ArrayXXf gauss_deriv_kernel(int size, float sigma, bool dir_x)
7278
}
7379

7480

75-
void conv_2d(const Image & image, const Image & kernel, Image & out)
81+
void conv_2d(
82+
const Image & image, const Image & kernel, Image & out,
83+
const ThreadContext & ctx
84+
)
7685
{
7786
auto nr = kernel.rows();
7887
auto nc = kernel.cols();
@@ -81,7 +90,7 @@ void conv_2d(const Image & image, const Image & kernel, Image & out)
8190
out.setZero();
8291

8392
#ifdef _OPENMP
84-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
93+
#pragma omp parallel for num_threads(ctx.get_num_threads()) if (ctx.enabled())
8594
#endif
8695
for (int i = 0; i < image.rows()-nr+1; ++i)
8796
for (int j = 0; j < image.cols()-nc+1; ++j)
@@ -149,17 +158,20 @@ struct PeakPoint {
149158
float v;
150159
};
151160

152-
void find_peaks(const Image & image, int size, float min_value, MatrixX2i & loc)
161+
void find_peaks(
162+
const Image & image, int size, float min_value, MatrixX2i & loc,
163+
const ThreadContext & ctx
164+
)
153165
{
154166
Image max_im;
155-
maximum_filter(image, max_im, size);
167+
maximum_filter(image, max_im, size, ctx);
156168
auto peaks = ((max_im == image) && (image > min_value)).eval();
157169

158170
vector<PeakPoint> res;
159171
res.reserve(1024);
160172

161173
#ifdef _OPENMP
162-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
174+
#pragma omp parallel for num_threads(ctx.get_num_threads()) if (ctx.enabled())
163175
#endif
164176
for (int i = 0; i < peaks.rows(); ++i)
165177
for (int j = 0; j < peaks.cols(); ++j)

src/filter.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,19 @@
77
#include <Eigen/Core>
88

99
#include "image.h"
10+
#include "threading.h"
1011

1112
namespace librectify {
1213

1314
Eigen::ArrayXXf gauss_deriv_kernel(int size, float sigma, bool dir_x);
1415

15-
void maximum_filter(const Image & image, Image & out, int size);
16+
void maximum_filter(const Image & image, Image & out, int size, const ThreadContext &);
1617

17-
void binary_dilate(const Mask & image, Mask & out);
18+
void binary_dilate(const Mask & image, Mask & out, const ThreadContext &);
1819

19-
void conv_2d(const Image & image, const Image & kernel, Image & out);
20+
void conv_2d(const Image & image, const Image & kernel, Image & out, const ThreadContext &);
2021

21-
void find_peaks(const Image & image, int size, float min_value, Eigen::MatrixX2i & loc);
22+
void find_peaks(const Image & image, int size, float min_value, Eigen::MatrixX2i & loc, const ThreadContext &);
2223

2324
void flood_init_mask(Mask & mask);
2425

src/geometry.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ float length(const LineSegment & l)
9696
Vector4f bounding_box(const vector<LineSegment> & lines)
9797
{
9898
MatrixX2f coords(2*lines.size(), 2);
99-
#ifdef _OPENMP
100-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
101-
#endif
99+
// #ifdef _OPENMP
100+
// #pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
101+
// #endif
102102
for (int i = 0; i < int(lines.size()); ++i)
103103
{
104104
const LineSegment & l = lines[i];
@@ -115,9 +115,9 @@ Vector4f bounding_box(const vector<LineSegment> & lines)
115115
MatrixX3f homogeneous(const vector<LineSegment> & lines)
116116
{
117117
MatrixX3f h(lines.size(), 3);
118-
#ifdef _OPENMP
119-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
120-
#endif
118+
// #ifdef _OPENMP
119+
// #pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
120+
// #endif
121121
for (int i = 0; i < int(lines.size()); ++i)
122122
{
123123
h.row(i) = homogeneous(lines[i]);
@@ -129,9 +129,9 @@ MatrixX3f homogeneous(const vector<LineSegment> & lines)
129129
MatrixX2f anchor_point(const vector<LineSegment> & lines)
130130
{
131131
MatrixX2f h(lines.size(), 2);
132-
#ifdef _OPENMP
133-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
134-
#endif
132+
// #ifdef _OPENMP
133+
// #pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
134+
// #endif
135135
for (int i = 0; i < int(lines.size()); ++i)
136136
{
137137
h.row(i) = anchor_point(lines[i]);
@@ -143,9 +143,9 @@ MatrixX2f anchor_point(const vector<LineSegment> & lines)
143143
MatrixX2f direction_vector(const vector<LineSegment> & lines)
144144
{
145145
MatrixX2f d(lines.size(), 2);
146-
#ifdef _OPENMP
147-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
148-
#endif
146+
// #ifdef _OPENMP
147+
// #pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
148+
// #endif
149149
for (int i = 0; i < int(lines.size()); ++i)
150150
{
151151
d.row(i) = direction_vector(lines[i]);
@@ -157,9 +157,9 @@ MatrixX2f direction_vector(const vector<LineSegment> & lines)
157157
VectorXf reprojection_error(const vector<LineSegment> & lines)
158158
{
159159
VectorXf err(lines.size());
160-
#ifdef _OPENMP
161-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
162-
#endif
160+
// #ifdef _OPENMP
161+
// #pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
162+
// #endif
163163
for (int i = 0; i < int(lines.size()); ++i)
164164
{
165165
err(i) = std::max(lines[i].err, 0.1f);
@@ -171,9 +171,9 @@ VectorXf reprojection_error(const vector<LineSegment> & lines)
171171
ArrayXi group_id(const vector<LineSegment> & lines)
172172
{
173173
ArrayXi group(lines.size());
174-
#ifdef _OPENMP
175-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
176-
#endif
174+
// #ifdef _OPENMP
175+
// #pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
176+
// #endif
177177
for (int i = 0; i < int(lines.size()); ++i)
178178
{
179179
group(i) = lines[i].group_id;
@@ -185,9 +185,9 @@ ArrayXi group_id(const vector<LineSegment> & lines)
185185
VectorXf weigths(const vector<LineSegment> & lines)
186186
{
187187
VectorXf w(lines.size());
188-
#ifdef _OPENMP
189-
#pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
190-
#endif
188+
// #ifdef _OPENMP
189+
// #pragma omp parallel for num_threads(get_num_threads()) if (is_omp_enabled())
190+
// #endif
191191
for (int i = 0; i < int(lines.size()); ++i)
192192
{
193193
w(i) = lines[i].weight;

src/interface.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "geometry.h"
1515
#include "transform.h"
1616
#include "utils.h"
17+
#include "threading.h"
1718

1819

1920
using namespace Eigen;
@@ -23,14 +24,6 @@ using namespace std;
2324
namespace librectify {
2425

2526

26-
static vector<LineSegment> _find_line_segment_on_buffer(InputPixelType * buffer, int width, int height, int stride)
27-
{
28-
Image im = image_from_buffer(buffer, width, height, stride);
29-
// Detect the lines
30-
return find_line_segments(im, SEED_DIST, SEED_RATIO, TRACE_TOLERANCE);
31-
}
32-
33-
3427
template<class InputIterator, class OutputIterator>
3528
static void _filter_lines(InputIterator first, InputIterator last, OutputIterator dst, float min_length)
3629
{
@@ -44,22 +37,27 @@ LineSegment * find_line_segment_groups(
4437
InputPixelType * buffer, int width, int height, int stride,
4538
float min_length, // filtering
4639
bool refine,
40+
int num_threads,
4741
int * n_lines
4842
)
4943
{
44+
ThreadContext ctx(num_threads);
45+
5046
// Init image from buffer
51-
auto lines = _find_line_segment_on_buffer(buffer, width, height, stride);
47+
Image im = image_from_buffer(buffer, width, height, stride);
48+
// Detect the lines
49+
auto lines = find_line_segments(im, SEED_DIST, SEED_RATIO, TRACE_TOLERANCE, ctx);
5250

5351
if (refine)
5452
{
55-
lines = postprocess_lines_segments(lines);
53+
lines = postprocess_lines_segments(lines, ctx);
5654
}
5755

5856
vector<LineSegment> filtered;
5957
filtered.reserve(lines.size());
6058
_filter_lines(lines.begin(), lines.end(), back_inserter(filtered), min_length);
6159

62-
vector<LineSegment> groupped = group_lines(filtered);
60+
vector<LineSegment> groupped = group_lines(filtered, ctx);
6361

6462
// Construct resulting array and copy data
6563
LineSegment * res = new LineSegment[groupped.size()];

src/librectify.h

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,6 @@ struct ImageTransform
8686
};
8787

8888

89-
/*
90-
Set number of threads to be used by the library.
91-
By default, the value set by OpenMP library is used. This behaviour
92-
can be restored by set_num_threads(0). When negative value is set,
93-
threading is disabled.
94-
*/
95-
extern "C" void DLL_PUBLIC set_num_threads(int t);
96-
97-
98-
/*
99-
Get the number of threads
100-
*/
101-
extern "C" int DLL_PUBLIC get_num_threads();
102-
103-
10489
/*
10590
Detect line segments in image.
10691
@@ -124,6 +109,7 @@ extern "C" DLL_PUBLIC LineSegment * find_line_segment_groups(
124109
InputPixelType * buffer, int width, int height, int stride,
125110
float min_length,
126111
bool refine,
112+
int num_threads,
127113
int * n_lines);
128114

129115

0 commit comments

Comments
 (0)