5

我尝试通过 OpenCV 的 MSER 检测在图像上找到对象。但函数cvExtractMSER返回的不是轮廓,而是CvSeq创建图形的点集 ( ):

(1, 4), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 1), (4, 2), (4, 3), (4, 4), ...

由一组点创建的区域

但我只需要轮廓点:

(1, 4), (8, 4), (8, 1), (4, 1)

突出显示所需的轮廓点

我怎样才能找到这个轮廓?

我认为,最简单(但不是最快)的方法是:

  • 用所有点绘制黑白图像(如何?逐点绘制?)
  • 用于findContours在新图像上查找轮廓
4

3 回答 3

1

findContours() 中的一个选项是传递一个参数,该参数将删除除水平、垂直或对角直线上的端点之外的所有点。如果您创建一个图像并绘制您列出的点,那么 findContours() 可以为您完成其余的工作。

CV_CHAIN_APPROX_SIMPLE 压缩水平、垂直和对角线段,只留下它们的端点。例如,一个直立的矩形轮廓用 4 个点进行编码。

http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#findcontours

于 2012-04-29T22:57:10.977 回答
1

获得任何形状的这些点的最通用方法是在轮廓上使用凸包。(船体教程

但是,如果您只在每个方向上寻找 4 个极值点,您可以简单地将轮廓视为 NumPy 数组(它们是):

如果c是轮廓:

extLeft = tuple(c[c[:, :, 0].argmin()][0])
extRight = tuple(c[c[:, :, 0].argmax()][0])
extTop = tuple(c[c[:, :, 1].argmin()][0])
extBot = tuple(c[c[:, :, 1].argmax()][0])

更多信息可以在这里找到:pyimagesearch.com“使用 OpenCV 寻找轮廓中的极值点”

于 2020-06-08T12:42:35.867 回答
0

如果我理解正确,您正在寻找检测到的物体的角落。

您可以遍历您的计数列表并编写一个简单的逻辑来通过进行简单的坐标比较来检测 4 个角。

于 2012-04-24T21:01:57.330 回答