在OpenCV中查找点的轮廓。

问题描述 投票:5回答:3

我试图通过OpenCV的MSER-detection来寻找图像上的对象。但是函数 cvExtractMSER 返回的不是等高线,而是点的集合(CvSeq),创造出图形。

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

Area created by set of points

但我只需要轮廓点

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

Highlight needed contour points

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

我想,最简单的(但不是最快的)方法是。

  • 把所有的点都画成bw图像(怎么画? 逐点画?)
  • findContours 用于在新图像上查找轮廓
opencv computer-vision contour mser
3个回答
1
投票

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

CV_CHAIN_APPROX_SIMPLE 会压缩水平、垂直和对角线段,只留下它们的端点。例如,一个向上向右的矩形轮廓被编码为 4 个点。

http:/opencv.itseez.commodulesimgprocdocstructural_analysis_and_shape_descriptors.html?highlight=findcontours#findcontours。


0
投票

如果我理解正确的话,你是在寻找检测到的对象的角。

你可以在你的轮廓列表中迭代,然后写一个简单的 检测4个角的逻辑 通过做简单的坐标比较。


0
投票

对于任何形状来说,要想得到这些点,最通用的方法就是在等高线上使用凸壳。(船体教程)

但是,如果你只想寻找每个方向上的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寻找等高线中的极限点"

© www.soinside.com 2019 - 2024. All rights reserved.