Skip to content

Commit 9239cd4

Browse files
committed
OpenCV comparison
1 parent 1910800 commit 9239cd4

File tree

2 files changed

+140
-63
lines changed

2 files changed

+140
-63
lines changed

appveyor.yml

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ platform:
77
install:
88
- cmd: echo "compile OpenCV"
99
- cmd: git clone --depth=1 --branch=4.x https://github.com/opencv/opencv.git
10-
- cmd: git clone --depth=1 --branch=4.x https://github.com/sturkmen72/opencv_contrib.git
10+
- cmd: git clone --depth=1 --branch=edcolor https://github.com/sturkmen72/opencv_contrib.git
1111
- cmd: md build-opencv
1212
- cmd: cd build-opencv
1313
- cmd: cmake -DWITH_JASPER=OFF -DWITH_WEBP=OFF -DBUILD_IPP_IW=OFF -DBUILD_ITT=OFF -DWITH_OPENEXR=OFF -DWITH_OPENJPEG=OFF -DBUILD_PROTOBUF=OFF -DWITH_TIFF=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF -DBUILD_opencv_dnn=OFF -DBUILD_opencv_gapi=OFF -DBUILD_opencv_ml=OFF -DBUILD_opencv_objdetect=OFF -DBUILD_opencv_photo=OFF -DBUILD_opencv_stitching=OFF -DBUILD_opencv_aruco=OFF -DBUILD_opencv_bioinspired=OFF -DBUILD_opencv_fuzzy=OFF -DBUILD_opencv_hfs=OFF -DBUILD_opencv_img_hash=OFF -DBUILD_opencv_surface_matching=OFF -DBUILD_opencv_bgsegm=OFF -DBUILD_opencv_intensity_transform=OFF -DBUILD_opencv_optflow=OFF -DBUILD_opencv_phase_unwrapping=OFF -DBUILD_opencv_plot=OFF -DBUILD_opencv_rapid=OFF -DBUILD_opencv_reg=OFF -DBUILD_opencv_rgbd=OFF -DBUILD_opencv_saliency=OFF -DBUILD_opencv_shape=OFF -DBUILD_opencv_stereo=OFF -DBUILD_opencv_structured_light=OFF -DBUILD_opencv_superres=OFF -DBUILD_opencv_tracking=OFF -DBUILD_opencv_videostab=OFF -DBUILD_opencv_xfeatures2d=OFF -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ../opencv -G "Visual Studio 16 2019"
@@ -35,25 +35,25 @@ test_script:
3535
artifacts:
3636
- path: .\build\CIRCLES_AND_ELLIPSES_RESULT_IMAGE.jpg
3737
name: CIRCLES_AND_ELLIPSES_RESULT_IMAGE.jpg
38-
- path: .\build\diff0.png
39-
name: diff0.png
40-
- path: .\build\edgeImg0.png
41-
name: Edge Image ( Original )
42-
- path: .\build\edgeImg1.png
43-
name: Edge Image ( OpenCV )
44-
- path: .\build\diff1.png
45-
name: diff1.png
46-
- path: .\build\lineImg0.png
47-
name: Line Image ( Original )
48-
- path: .\build\lineImg1.png
49-
name: Line Image ( OpenCV )
50-
- path: .\build\diff2.png
51-
name: diff2.png
52-
- path: .\build\edgePFImage0.png
53-
name: PF Edge Image ( Original )
54-
- path: .\build\edgePFImage1.png
55-
name: PF Edge Image ( OpenCV )
56-
- path: .\build\ellipsImg0.png
38+
- path: .\build\GradImage.png
39+
name: GradImage.png
40+
- path: .\build\AnchorImage.png
41+
name: AnchorImage.png
42+
- path: .\build\EdgeImage.png
43+
name: Edge Image
44+
- path: .\build\EdgeImage-Color.png
45+
name: Edge Image (color)
46+
- path: .\build\LinesImage.png
47+
name: Lines Image
48+
- path: .\build\LinesImage-Color.png
49+
name: Lines Image (color)
50+
- path: .\build\EdgeImage-PF.png
51+
name: Edge Image (PF)
52+
- path: .\build\EllipsImage-Original.png
5753
name: Ellipses Image ( Original )
58-
- path: .\build\ellipsImg1.png
54+
- path: .\build\EllipsImage-OpenCV.png
5955
name: Ellipses Image ( OpenCV )
56+
- path: .\build\EllipsImageColor-Original.png
57+
name: Ellipses Image ( color Original )
58+
- path: .\build\EllipsImageColor-OpenCV.png
59+
name: Ellipses Image ( color OpenCV )

test_ED.cpp

Lines changed: 119 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,51 @@ int main(int argc, char** argv)
1515
else
1616
filename = "billiard.jpg";
1717

18-
Mat testImg = imread(filename, 0);
19-
TickMeter tm;
18+
Mat testImg, ellipsImg0, ellipsImg1;
19+
Mat colorImg = imread(filename);
20+
cvtColor(colorImg, testImg, COLOR_BGR2GRAY);
21+
22+
Ptr<EdgeDrawing> ed = createEdgeDrawing();
23+
vector<Vec6d> ellipses;
24+
vector<Vec4f> lines;
2025

21-
for (int i = 1; i < 5; i++)
26+
TickMeter tm;
27+
for (int i = 0; i < 3; i++)
2228
{
2329
cout << "\n#################################################";
2430
cout << "\n####### ( " << i << " ) ORIGINAL & OPENCV COMPARISON ######";
2531
cout << "\n#################################################\n";
26-
Ptr<EdgeDrawing> ed = createEdgeDrawing();
32+
2733
ed->params.EdgeDetectionOperator = EdgeDrawing::SOBEL;
2834
ed->params.GradientThresholdValue = 36;
2935
ed->params.AnchorThresholdValue = 8;
30-
vector<Vec6d> ellipses;
31-
vector<Vec4f> lines;
36+
ed->params.Sigma = 1.0;
3237

3338
//Detection of edge segments from an input image
3439
tm.start();
3540
//Call ED constructor
3641
ED testED = ED(testImg, SOBEL_OPERATOR, 36, 8, 1, 10, 1.0, true);
3742
tm.stop();
38-
std::cout << "\ntestED.getEdgeImage() (Original) : " << tm.getTimeMilli() << endl;
43+
std::cout << "testED.getEdgeImage() (Original) : " << tm.getTimeMilli() << " ms." << endl;
3944

4045
tm.reset();
4146
tm.start();
4247
ed->detectEdges(testImg);
4348
tm.stop();
44-
std::cout << "detectEdges() (OpenCV) : " << tm.getTimeMilli() << endl;
49+
std::cout << "detectEdges() (OpenCV) : " << tm.getTimeMilli() << " ms." << endl;
50+
51+
Mat anchImg = testED.getAnchorImage();
52+
Mat gradImg = testED.getGradImage();
53+
imwrite("GradImage.png", gradImg);
54+
imwrite("AnchorImage.png", anchImg);
4555

46-
Mat edgeImg0 = testED.getEdgeImage();
47-
Mat anchImg0 = testED.getAnchorImage();
48-
Mat gradImg0 = testED.getGradImage();
4956
Mat edgeImg1, diff;
57+
Mat edgeImg0 = testED.getEdgeImage();
5058
ed->getEdgeImage(edgeImg1);
5159
absdiff(edgeImg0, edgeImg1, diff);
5260
cout << "different pixel count : " << countNonZero(diff) << endl;
53-
imwrite("gradImg0.png", gradImg0);
54-
imwrite("anchImg0.png", anchImg0);
55-
imwrite("edgeImg0.png", edgeImg0);
56-
imwrite("edgeImg1.png", edgeImg1);
57-
imwrite("diff0.png", diff);
61+
62+
imwrite("EdgeImage.png", edgeImg1);
5863

5964
//***************************** EDLINES Line Segment Detection *****************************
6065
//Detection of lines segments from edge segments instead of input image
@@ -64,15 +69,14 @@ int main(int argc, char** argv)
6469
EDLines testEDLines = EDLines(testED);
6570
tm.stop();
6671
cout << "-------------------------------------------------\n";
67-
cout << "testEDLines.getLineImage() : " << tm.getTimeMilli() << endl;
72+
cout << "testEDLines.getLineImage() : " << tm.getTimeMilli() << " ms." << endl;
6873
Mat lineImg0 = testEDLines.getLineImage(); //draws on an empty image
69-
imwrite("lineImg0.png", lineImg0);
7074

7175
tm.reset();
7276
tm.start();
7377
ed->detectLines(lines);
7478
tm.stop();
75-
cout << "detectLines() (OpenCV) : " << tm.getTimeMilli() << endl;
79+
cout << "detectLines() (OpenCV) : " << tm.getTimeMilli() << " ms." << endl;
7680

7781
Mat lineImg1 = Mat(lineImg0.rows, lineImg0.cols, CV_8UC1, Scalar(255));
7882

@@ -81,8 +85,7 @@ int main(int argc, char** argv)
8185

8286
absdiff(lineImg0, lineImg1, diff);
8387
cout << "different pixel count : " << countNonZero(diff) << endl;
84-
imwrite("lineImg1.png", lineImg1);
85-
imwrite("diff1.png", diff);
88+
imwrite("LinesImage.png", lineImg1);
8689

8790
//***************************** EDCIRCLES Circle Segment Detection *****************************
8891
//Detection of circles from already available EDPF or ED image
@@ -91,20 +94,21 @@ int main(int argc, char** argv)
9194
EDCircles testEDCircles = EDCircles(testEDLines);
9295
tm.stop();
9396
cout << "-------------------------------------------------\n";
94-
cout << "EDCircles(testEDLines) : " << tm.getTimeMilli() << endl;
97+
cout << "EDCircles(testEDLines) : " << tm.getTimeMilli() << " ms." << endl;
9598

9699
tm.reset();
97100
tm.start();
98101
ed->detectEllipses(ellipses);
99102
tm.stop();
100-
cout << "detectEllipses() (OpenCV) : " << tm.getTimeMilli() << endl;
103+
cout << "detectEllipses() (OpenCV) : " << tm.getTimeMilli() << " ms." << endl;
101104
cout << "-------------------------------------------------\n";
102105

103106
vector<mCircle> found_circles = testEDCircles.getCircles();
104107
vector<mEllipse> found_ellipses = testEDCircles.getEllipses();
105-
Mat ellipsImg0 = Mat(lineImg0.rows, lineImg0.cols, CV_8UC3, Scalar::all(0));
106-
Mat ellipsImg1 = Mat(lineImg0.rows, lineImg0.cols, CV_8UC3, Scalar::all(0));
107108

109+
cvtColor(testImg, ellipsImg0, COLOR_GRAY2BGR);
110+
cvtColor(testImg, ellipsImg1, COLOR_GRAY2BGR);
111+
108112
for (int i = 0; i < found_circles.size(); i++)
109113
{
110114
Point center((int)found_circles[i].center.x, (int)found_circles[i].center.y);
@@ -135,59 +139,132 @@ int main(int argc, char** argv)
135139
ellipse(ellipsImg1, center, axes, angle, 0, 360, color, 1, LINE_AA);
136140
}
137141

138-
imwrite("ellipsImg0.png", ellipsImg0);
139-
imwrite("ellipsImg1.png", ellipsImg1);
142+
imwrite("EllipsImage-Original.png", ellipsImg0);
143+
imwrite("EllipsImage-OpenCV.png", ellipsImg1);
140144

141145
//************************** EDPF Parameter-free Edge Segment Detection **************************
142146
// Detection of edge segments with parameter free ED (EDPF)
143147
tm.reset();
144148
tm.start();
145149
EDPF testEDPF = EDPF(testImg);
146150
tm.stop();
147-
cout << "testEDPF.getEdgeImage() : " << tm.getTimeMilli() << endl;
151+
cout << "testEDPF.getEdgeImage() : " << tm.getTimeMilli() << " ms." << endl;
148152

149-
Ptr<EdgeDrawing> ed1 = createEdgeDrawing();
150-
ed1->params.EdgeDetectionOperator = EdgeDrawing::PREWITT;
151-
ed1->params.GradientThresholdValue = 11;
152-
ed1->params.AnchorThresholdValue = 3;
153-
ed1->params.PFmode = true;
153+
ed->params.EdgeDetectionOperator = EdgeDrawing::PREWITT;
154+
ed->params.GradientThresholdValue = 11;
155+
ed->params.AnchorThresholdValue = 3;
156+
ed->params.PFmode = true;
154157

155158
tm.reset();
156159
tm.start();
157-
ed1->detectEdges(testImg);
160+
ed->detectEdges(testImg);
158161
tm.stop();
159-
std::cout << "detectEdges() PF (OpenCV) : " << tm.getTimeMilli() << endl;
162+
std::cout << "detectEdges() PF (OpenCV) : " << tm.getTimeMilli() << " ms." << endl;
160163

161164
edgeImg0 = testEDPF.getEdgeImage();
162165
ed->getEdgeImage(edgeImg1);
163166
absdiff(edgeImg0, edgeImg1, diff);
164167
cout << "different pixel count : " << countNonZero(diff) << endl;
165-
imwrite("edgePFImage0.png", edgeImg0);
166-
imwrite("edgePFImage1.png", edgeImg1);
167-
imwrite("diff2.png", diff);
168+
imwrite("EdgeImage-PF.png", edgeImg1);
169+
168170
//*********************** EDCOLOR Edge Segment Detection from Color Images **********************
169171

170-
Mat colorImg = imread(filename);
171172
tm.reset();
172173
tm.start();
173174
EDColor testEDColor = EDColor(colorImg, 36);
175+
edgeImg0 = testEDColor.getEdgeImage();
174176
tm.stop();
175177
cout << "-------------------------------------------------\n";
176-
cout << "testEDColor : " << tm.getTimeMilli() << endl;
178+
cout << "testEDColor.getEdgeImage() : " << tm.getTimeMilli() << " ms." << endl;
179+
180+
ed->params.EdgeDetectionOperator = EdgeDrawing::PREWITT;
181+
ed->params.GradientThresholdValue = 36;
182+
ed->params.AnchorThresholdValue = 4;
183+
ed->params.Sigma = 1.5;
184+
ed->params.PFmode = false;
185+
tm.reset();
186+
tm.start();
187+
ed->detectEdges(colorImg);
188+
tm.stop();
189+
cout << "detectEdges() (OpenCV) : " << tm.getTimeMilli() << " ms." << endl;
190+
191+
ed->getEdgeImage(edgeImg1);
192+
absdiff(edgeImg0, edgeImg1, diff);
193+
cout << "different pixel count : " << countNonZero(diff) << endl;
194+
imwrite("EdgeImage-Color.png", edgeImg0);
177195

178196
tm.reset();
179197
tm.start();
180198
// get lines from color image
181199
EDLines colorLine = EDLines(testEDColor);
182200
tm.stop();
183-
cout << "get lines from color image : " << tm.getTimeMilli() << endl;
201+
cout << "-------------------------------------------------\n";
202+
cout << "get lines from color image : " << tm.getTimeMilli() << " ms." << endl;
203+
lineImg0 = colorLine.getLineImage();
204+
imwrite("LinesImage-Color.png", lineImg0);
205+
tm.reset();
206+
tm.start();
207+
ed->detectLines(lines);
208+
tm.stop();
209+
cout << "detectLines() (OpenCV) : " << tm.getTimeMilli() << " ms." << endl;
184210

211+
lineImg1 = Mat(lineImg0.rows, lineImg0.cols, CV_8UC1, Scalar(255));
212+
213+
for (int i = 0; i < lines.size(); i++)
214+
line(lineImg1, Point2d(lines[i][0], lines[i][1]), Point2d(lines[i][2], lines[i][3]), Scalar(0), 1, LINE_AA);
215+
216+
absdiff(lineImg0, lineImg1, diff);
217+
cout << "different pixel count : " << countNonZero(diff) << endl;
218+
cout << "-------------------------------------------------\n";
185219
tm.reset();
186220
tm.start();
187221
// get circles from color image
188222
EDCircles colorCircle = EDCircles(testEDColor);
189223
tm.stop();
190-
cout << "get circles from color image : " << tm.getTimeMilli() << endl;
224+
cout << "get circles from color image : " << tm.getTimeMilli() << " ms." << endl;
225+
tm.reset();
226+
tm.start();
227+
ed->detectEllipses(ellipses);
228+
tm.stop();
229+
cout << "detectEllipses() (OpenCV) : " << tm.getTimeMilli() << " ms." << endl;
230+
231+
found_circles = colorCircle.getCircles();
232+
found_ellipses = colorCircle.getEllipses();
233+
234+
ellipsImg0 = colorImg.clone();
235+
ellipsImg1 = colorImg.clone();
236+
for (int i = 0; i < found_circles.size(); i++)
237+
{
238+
Point center((int)found_circles[i].center.x, (int)found_circles[i].center.y);
239+
Size axes((int)found_circles[i].r, (int)found_circles[i].r);
240+
double angle(0.0);
241+
Scalar color = Scalar(0, 255, 0);
242+
243+
ellipse(ellipsImg0, center, axes, angle, 0, 360, color, 2, LINE_AA);
244+
}
245+
246+
for (int i = 0; i < found_ellipses.size(); i++)
247+
{
248+
Point center((int)found_ellipses[i].center.x, (int)found_ellipses[i].center.y);
249+
Size axes((int)found_ellipses[i].axes.width, (int)found_ellipses[i].axes.height);
250+
double angle = found_ellipses[i].theta * 180 / CV_PI;
251+
Scalar color = Scalar(255, 255, 0);
252+
253+
ellipse(ellipsImg0, center, axes, angle, 0, 360, color, 2, LINE_AA);
254+
}
255+
256+
for (size_t i = 0; i < ellipses.size(); i++)
257+
{
258+
Point center((int)ellipses[i][0], (int)ellipses[i][1]);
259+
Size axes((int)ellipses[i][2] + (int)ellipses[i][3], (int)ellipses[i][2] + (int)ellipses[i][4]);
260+
double angle(ellipses[i][5]);
261+
Scalar color = ellipses[i][2] == 0 ? Scalar(255, 255, 0) : Scalar(0, 255, 0);
262+
263+
ellipse(ellipsImg1, center, axes, angle, 0, 360, color, 2, LINE_AA);
264+
}
265+
266+
imwrite("EllipsImageColor-Original.png", ellipsImg0);
267+
imwrite("EllipsImageColor-OpenCV.png", ellipsImg1);
191268
}
192269
return 0;
193270
}

0 commit comments

Comments
 (0)