使用模糊 & 门槛的简单组合,我设法得到这样的结果(调整以便查看):
之后,应用侵蚀 & the squares.cpp technique(这是来自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);
EDIT:
的find_squares()
函数返回与所述图像中找到的所有方块的矢量。因为它在图像的每个通道上迭代,所以在您的示例中,它成功检测到每个通道中的矩形区域,因此打印squares.size()
输出3
。
作为正方形可以看作是4(X,Y)坐标的矢量,OpenCV的表达这一概念作为vector<Point>
允许您访问X和Y部分的坐标。
现在,印刷squares
revelead在逆时针方向检测点:
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;
}
}
@Karlphilip wow..Thats Great..Thanks很多关于您的HEL对于较暗的图像,我也得到了期望的结果,但硬编码阈值(约80)。如果它远离该区域,我找不到这些方块。所以我使用了Otsu阈值,但我必须添加30才能满意检测。任何其他方式来检测较暗和较亮的图像 – ShivShambo
这是我能想到的唯一一个。 – karlphillip
@ Karlphilip ..使用这种算法,我只想找到原始图中矩形区域中心的坐标。任何想法,我可以接近。 – ShivShambo