我有一张包含正方形的图片,需要提取该正方形包含的区域。应用 OpenCV 发行版中每个示例都可用的 squares.c 脚本后,我获得了一个正方形向量,然后需要为它们保存图像。
用户 karlphillip 建议如下:
为了为原始图像中检测到的所有正方形生成一个名为subimage的新Mat。
正如卡尔提醒我的那样,图像中检测到的点可能并不代表一个完美的正方形(正如你在上面的图像中看到的)。但是,我刚才向您建议的代码假定它们是这样的。
事实上,我得到了这个错误:
建议让脚本也接受非完美平方数?
用户 karlphillip 建议如下:
for (size_t x = 0; x < squares.size(); x++)
{
Rect roi(squares[x][0].x, squares[x][0].y,
squares[x][1].x - squares[x][0].x,
squares[x][3].y - squares[x][0].y);
Mat subimage(image, roi);
}
为了为原始图像中检测到的所有正方形生成一个名为subimage的新Mat。
正如卡尔提醒我的那样,图像中检测到的点可能并不代表一个完美的正方形(正如你在上面的图像中看到的)。但是,我刚才向您建议的代码假定它们是这样的。
事实上,我得到了这个错误:
OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width &&
roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height &&
roi.y + roi.height <= m.rows) in Mat, file /usr/include/opencv/cxmat.hpp,
line 187
terminate called after throwing an instance of 'cv::Exception'
what(): /usr/include/opencv/cxmat.hpp:187: error: (-215) 0 <= roi.x &&
0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y &&
0 <= roi.height && roi.y + roi.height <= m.rows in function Mat
Aborted
建议让脚本也接受非完美平方数?
squares[i][j]
中,i将代表向量中的一个正方形,而j将用作设置构成正方形的点集的索引,范围从0到3。如果你理解了这一点,那么你是正确的。 - karlphillipCanny()
之后调用imshow()
或将结果保存到磁盘进行进一步分析,并尝试调整Canny的参数以改善检测效果,或者像我使用medianBlur()
和dilate()
那样添加/删除滤波器。例如,如果你正在寻找的正方形在Canny中没有显示出来,可能需要更多地模糊它。 - karlphillip