Skip to content

Commit 5b51f61

Browse files
committed
add FastHoughTransform test
1 parent 9b153fc commit 5b51f61

File tree

2 files changed

+103
-2
lines changed

2 files changed

+103
-2
lines changed

src/OpenCvSharpExtern/ximgproc_FastHoughTransform.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ CVAPI(void) ximgproc_FastHoughTransform(cv::_InputArray *src, cv::_OutputArray *
99
cv::ximgproc::FastHoughTransform(*src, *dst, dstMatDepth, angleRange, op, makeSkew);
1010
}
1111

12-
CVAPI(CvVec4i) ximgproc_HoughPoint2Line(CvPoint houghPoint, cv::_InputArray *srcImgInfo,
12+
CVAPI(CvVec4i) ximgproc_HoughPoint2Line(MyCvPoint houghPoint, cv::_InputArray *srcImgInfo,
1313
int angleRange, int makeSkew, int rules)
1414
{
15-
return c(cv::ximgproc::HoughPoint2Line(houghPoint, *srcImgInfo, angleRange, makeSkew, rules));
15+
return c(cv::ximgproc::HoughPoint2Line(cpp(houghPoint), *srcImgInfo, angleRange, makeSkew, rules));
1616
}
1717

1818
#endif

test/OpenCvSharp.Tests/ximgproc/FastHoughTransformTest.cs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
24
using OpenCvSharp.XImgProc;
35
using Xunit;
46

@@ -38,6 +40,105 @@ private static void Rescale(Mat src, Mat dst,
3840
(double)maxHeight / src.Rows), 1.0);
3941
Cv2.Resize(src, dst, new Size(), scale, scale, InterpolationFlags.Linear);
4042
}
43+
44+
/// <summary>
45+
/// https://github.com/opencv/opencv_contrib/blob/master/modules/ximgproc/samples/fast_hough_transform.cpp
46+
/// </summary>
47+
[Fact]
48+
public void FHTSample()
49+
{
50+
const string imPath = @"_data\image\building.jpg";
51+
using (var image = new Mat(imPath, ImreadModes.GrayScale))
52+
using (var hough = new Mat())
53+
using (var canny = new Mat())
54+
{
55+
Cv2.Canny(image, canny, 50, 200, 3);
56+
57+
CvXImgProc.FastHoughTransform(canny, hough, MatType.CV_32S/*C1*/, AngleRangeOption.ARO_315_135, HoughOP.FHT_ADD, HoughDeskewOption.DESKEW);
58+
59+
var lines = new List<Vec4i>();
60+
GetLocalExtr(lines, canny, hough, 255f * 0.3f * Math.Min(canny.Rows, canny.Cols), 50);
61+
62+
var cannyColor = new Mat();
63+
Cv2.CvtColor(canny, cannyColor, ColorConversionCodes.GRAY2BGR);
64+
for (var i = 0; i < lines.Count; i++)
65+
{
66+
var line = lines[i];
67+
Cv2.Line(cannyColor, new Point(line.Item0, line.Item1), new Point(line.Item2, line.Item3), Scalar.Red);
68+
}
69+
//cannyColor.SaveImage("cannycolor.png");
70+
71+
ShowImagesWhenDebugMode(image, canny, cannyColor);
72+
}
73+
74+
bool GetLocalExtr(List<Vec4i> lines, Mat src, Mat fht, float minWeight, int maxCount)
75+
{
76+
const int MAX_LEN = 10_000;
77+
var weightedPoints = new List<KeyValuePair<int, Point>>();
78+
for (var y = 0; y < fht.Rows; ++y)
79+
{
80+
if (weightedPoints.Count > MAX_LEN)
81+
break;
82+
83+
var fhtMat = new MatOfInt(fht);
84+
var fhtIndexer = fhtMat.GetIndexer();
85+
86+
var pLineY = Math.Max(y - 1, 0);
87+
var cLineY = y;
88+
var nLineY = Math.Min(y + 1, fht.Rows - 1);
89+
90+
for (var x = 0; x < fht.Cols; ++x)
91+
{
92+
if (weightedPoints.Count > MAX_LEN)
93+
break;
94+
95+
var value = fhtIndexer[cLineY, x];
96+
if (value >= minWeight)
97+
{
98+
var isLocalMax = 0;
99+
var start = Math.Max(x - 1, 0);
100+
var end = Math.Min(x + 1, fht.Cols - 1);
101+
for (var xx = start; xx < end; ++xx)
102+
{
103+
var pLine = fhtIndexer[pLineY, xx];
104+
var cLine = fhtIndexer[cLineY, xx];
105+
var nLine = fhtIndexer[nLineY, xx];
106+
if (!incIfGreater(value, pLine, ref isLocalMax) ||
107+
!incIfGreater(value, cLine, ref isLocalMax) ||
108+
!incIfGreater(value, nLine, ref isLocalMax))
109+
{
110+
isLocalMax = 0;
111+
break;
112+
}
113+
}
114+
if (isLocalMax > 0)
115+
weightedPoints.Add(new KeyValuePair<int, Point>(value, new Point(x, y)));
116+
}
117+
}
118+
}
119+
120+
if (weightedPoints.Count == 0)
121+
return true;
122+
123+
// Sort WeightedPoints
124+
weightedPoints = weightedPoints.OrderByDescending(x => x.Key).ToList();
125+
weightedPoints = weightedPoints.Take(maxCount).ToList();
126+
127+
for (var i = 0; i < weightedPoints.Count; i++)
128+
lines.Add(CvXImgProc.HoughPoint2Line(weightedPoints[i].Value, src));
129+
130+
return true;
131+
}
132+
133+
bool incIfGreater(int a, int b, ref int value)
134+
{
135+
if (/*value == 0 || */a < b)
136+
return false;
137+
if (a > b)
138+
++(value);
139+
return true;
140+
}
141+
}
41142
}
42143
}
43144

0 commit comments

Comments
 (0)