Skip to content

Commit 5567d1b

Browse files
committedMar 9, 2020
Add RectangleDtection.cpp
1 parent f1556bb commit 5567d1b

File tree

2 files changed

+10
-14
lines changed

2 files changed

+10
-14
lines changed
 

‎README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
- FastDefoggingBasedOnSingleImage.cpp C++复现了《基于单幅图像的快速去雾》论文,原理请看:https://blog.csdn.net/just_sort/article/details/90205686
3737
- BoxSideWindowFilter.cpp C++复现了CVPR2019《Side Window Filter》论文(Box Filter),实现霸气的强制保边,原理请看:https://blog.csdn.net/just_sort/article/details/93664078
3838
- MedianSideWindowFilter.cpp C++复现了CVPR2019《Side Window Filter》论文(Median Filter),实现霸气的强制保边,原理请看:https://blog.csdn.net/just_sort/article/details/93664078
39+
- RectangleDetection.cpp C++复现了StackOverFlow上面的一个有趣的矩形检测算法,并且配合Side Window Filter可以取得更好的效果,原理请看:https://blog.csdn.net/just_sort/article/details/104754937
3940

4041

4142

‎RectangleDetection.cpp

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ Mat MedianSideWindowFilter(Mat src, int radius = 1) {
106106
for (int x = -radius; x <= radius; x++) {
107107
for (int y = -radius; y <= radius; y++) {
108108
//if (x == 0 && y == 0) continue;
109-
if(filter[pos][id]) now.push_back(src.at<uchar>(i + x, j + y) * filter[pos][id]);
109+
if (filter[pos][id]) now.push_back(src.at<uchar>(i + x, j + y) * filter[pos][id]);
110110
id++;
111111
//val += src.at<uchar>(i + x, j + y) * filter[k][id++];
112112
}
@@ -186,15 +186,15 @@ static double angle(Point pt1, Point pt2, Point pt0)
186186
}
187187

188188
//寻找矩形
189-
static void findSquares(const Mat& image, vector<vector<Point> >& squares, int N=5, int thresh=50)
189+
static void findSquares(const Mat& image, vector<vector<Point> >& squares, int N = 5, int thresh = 50)
190190
{
191191

192192
//滤波可以提升边缘检测的性能
193193
Mat timg(image);
194194
// 普通中值滤波
195-
medianBlur(image, timg, 9);
195+
//medianBlur(image, timg, 9);
196196
// SideWindowFilter的中值滤波
197-
// timg = MedianSideWindowFilter(image, 4);
197+
timg = MedianSideWindowFilter(image, 4);
198198
Mat gray0(timg.size(), CV_8U), gray;
199199
// 存储轮廓
200200
vector<vector<Point> > contours;
@@ -213,8 +213,8 @@ static void findSquares(const Mat& image, vector<vector<Point> >& squares, int N
213213
// 第一个输入矩阵的通道标记范围为:0 ~src[0].channels() - 1,第二个输入矩阵的通道标记范围为:src[0].channels() ~src[0].channels() + src[1].channels() - 1,
214214
// 以此类推;其次输出矩阵也用同样的规则标记,第一个输出矩阵的通道标记范围为:0 ~dst[0].channels() - 1,第二个输入矩阵的通道标记范围为:dst[0].channels()
215215
// ~dst[0].channels() + dst[1].channels() - 1, 以此类推;最后,数组fromTo的第一个元素即fromTo[0]应该填入输入矩阵的某个通道标记,而fromTo的第二个元素即
216-
// fromTo[1]应该填入输出矩阵的某个通道标记,这样函数就会把输入矩阵的fromTo[0]通道里面的数据复制给输出矩阵的fromTo[1]通道。fromTo后面的元素也是这个
217-
// 道理,总之就是一个输入矩阵的通道标记后面必须跟着个输出矩阵的通道标记.
216+
// fromTo[1]应该填入输出矩阵的某个通道标记,这样函数就会把输入矩阵的fromTo[0]通道里面的数据复制给输出矩阵的fromTo[1]通道。fromTo后面的元素也是这个
217+
// 道理,总之就是一个输入矩阵的通道标记后面必须跟着个输出矩阵的通道标记.
218218
// npairs: 即参数fromTo中的有几组输入输出通道关系,其实就是参数fromTo的数组元素个数除以2.
219219
mixChannels(&timg, 1, &gray0, 1, ch, 1);
220220

@@ -260,7 +260,7 @@ static void findSquares(const Mat& image, vector<vector<Point> >& squares, int N
260260
// bool closed:表示输出的多边形是否封闭
261261

262262
// arcLength 计算图像轮廓的周长
263-
approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);
263+
approxPolyDP(Mat(contours[i]), approx, 20, true);
264264

265265
// 近似后,方形轮廓应具有4个顶点
266266
// 相对较大的区域(以滤除嘈杂的轮廓)并且是凸集。
@@ -301,17 +301,12 @@ void drawSquares(Mat &image, const vector<vector<Point> >& squares) {
301301
}
302302

303303
int main() {
304-
Mat src = imread("F:\\1.jpg");
305-
for (int i = 0; i < 10; i++) {
306-
src = MedianSideWindowFilter(src, 3);
307-
}
308-
imwrite("F:\\res.jpg", src);
309-
/*Mat src = cv::imread("F:\\manyStickies.jpg");
304+
Mat src = cv::imread("F:\\stone.jpg");
310305
vector<vector<Point> > squares;
311306
findSquares(src, squares, 5, 50);
312307
drawSquares(src, squares);
313308
imshow("result", src);
314309
imwrite("F:\\res2.jpg", src);
315-
waitKey(0);*/
310+
waitKey(0);
316311
return 0;
317312
}

0 commit comments

Comments
 (0)