[英]Detection of rectangular bright area in a Image using OpenCv
我之前曾问过一个问题,使用c ++在图像中标记兴趣点 。 我使用相同的解决方案,并使用自适应阈值和斑点检测算法 (增长区域)获得了要求的点。 我有原始源图,我想在其中检测矩形区域
但是,在使用算法后,我得到了这样的信息(如果在新选项卡中打开它的细节可见)
除了矩形区域,还可以看到明亮的日光照明点。 我已经使用了双边过滤,但仍然无法检测到矩形区域,但是该算法适用于夜景图像,该夜景的背景比预期的要暗。
有人可以建议我使用相同的算法进行一些修改是否足够,或者是否可以使用其他有效方式。
谢谢
使用模糊和阈值的简单组合,我设法得到了这个结果(调整大小以供查看):
之后,应用腐蚀和squares.cpp技术 (来自OpenCV的示例)输出:
这几乎是您要寻找的结果:成功检测到矩形的底部。 您需要做的就是增加检测到的矩形(红色正方形) 的高度 ,以适合您的关注区域。
码:
Mat img = imread(argv[1]);
// Blur
Mat new_img = img.clone();
medianBlur(new_img, new_img, 5);
// Perform threshold
double thres = 210;
double color = 255;
threshold(new_img, new_img, thres, color, CV_THRESH_BINARY);
imwrite("thres.png", new_img);
// Execute erosion to improve the detection
int erosion_size = 4;
Mat element = getStructuringElement(MORPH_CROSS,
Size(2 * erosion_size + 1, 2 * erosion_size + 1),
Point(erosion_size, erosion_size) );
erode(new_img, new_img, element);
imwrite("erode.png", new_img);
vector<vector<Point> > squares;
find_squares(new_img, squares);
std::cout << "squares: " << squares.size() << std::endl;
draw_squares(img, squares);
imwrite("area.png", img);
编辑 :
find_squares()
函数返回一个向量,其中包含图像中找到的所有平方。 因为它在图像的每个通道上进行迭代,所以在您的示例中,它成功检测到每个图像中的矩形区域,因此打印squares.size()
输出3
。
由于正方形可以看作是4个(X,Y)坐标的vector<Point>
,因此OpenCV将此概念表示为vector<Point>
使您可以访问X和Y部分的坐标。
现在,打印squares
表明已在逆时针方向上检测到这些点:
1st ------ 4th
| |
| |
| |
2nd ------ 3rd
在此示例之后,很明显,如果您需要增加矩形的高度,则需要更改第一点和第四点的Y:
for (int i = 0; i < squares.size(); i++)
{
for (int j = 0; j < squares[i].size(); j++)
{
// std::cout << "# " << i << " " << squares[i][j].x << ","<< squares[i][j].y << std::endl;
if (j == 0 || j == 3)
squares[i][j].y = 0;
}
}
在上面显示的图像中,我建议
正常的阈值操作应该效果很好,或者
逐行链式代码“计算”或
在直方图中查找渐变。
会有很多其他解决方案。 如果这是一致的,我会考虑减去背景阴影。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.