繁体   English   中英

从openCV轮廓创建路径

[英]Create path from openCV contour

嗨,我想在这部影片中做类似的事情。 在V-rep系统中使用python API,现在我的机器人可以工作了,只需要处理要绘制的图像即可。

为此,我需要一个笔路径的(x,y)坐标向量。 所以我正在尝试使用OpenCV findContours函数。 这是我的代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.jpg', 3)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

edges,contours,hierarchy = cv2.findContours(gray, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)

xList = [x[0][0][0] for x in contours]
yList = [y[0][0][1] for y in contours]

#plot image
plt.subplot(121)
plt.imshow(img,cmap = 'gray')
plt.title('Original Image') 

#plot contour
plt.subplot(122)
plt.plot(xList,yList)
plt.title('Edge Image')

plt.show()

这是我的示例图片:

在此处输入图片说明

如果我使用散点图分别绘制每个点,则可以得到显示图像轮廓的结果。

在此处输入图片说明

好的,也许这不是我第一次使用OpenCV查找轮廓的最佳示例。

如果我使用绘图功能对点进行绘图,则可以看到要遵循的路径:

在此处输入图片说明

所以我想要的是找到一种方法来对连续顺序路径上的所有点进行排序,以绘制图像轮廓。

这里的问题是该点没有排序,因此don与它的上一个和下一个点具有关系,它们只是点云。 所以我需要对它进行排序以构造路径。

关于如何执行此操作的任何想法?

我发现此线程使我有了使用matplotlib和contour函数的想法,我对其进行了调试,并在allsegs属性中找到了用于绘制的数据,这现在解决了我的问题,也许它不是最好的解决方案,但现在有用。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('img.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# gray = cv2.bilateralFilter(gray, 50, 50, 10)
edged = cv2.Canny(gray, 70, 250)

#plot image
plt.subplot(1,3,1)
plt.imshow(img, cmap='gray')

#plot contour
plt.subplot(1,3,2)
a = plt.contour(edged, levels=[255], colors='black', origin='image')

#plot separated contour
plt.subplot(1,3,3)
for i in range(len(a.allsegs[0])):
    x = a.allsegs[0][i][:,0]
    y = a.allsegs[0][i][:,1]
    plt.plot(x,y)

plt.show()

在此处输入图片说明

1.您要创建这样的内容:

基本步骤是:

  1. 阅读并转换为灰色,
  2. 二进制图像的阈值
  3. 在二进制图像上查找findContours
  4. 然后drawContours ,您将得到它。

2.如果您想这样想:

在此处输入图片说明

基本步骤是:

  1. 读取并转换为灰色
  2. 模糊并执行Canny
  3. connectedComponents查找
  4. 然后将标签设置为不同的颜色
  5. 你会得到这样的。

在此处输入图片说明


生成最后一张图片的代码:

#!/usr/bin/python3
# 2018.01.23 11:25:35 CST
# 2018.01.23 11:45:22 CST

import numpy as np
import cv2
import myutils

colors = [(0, 0, 255), (0, 43, 255), (0, 85, 255), (0, 128, 255), (0, 170, 255), (0, 213, 255), (0, 255, 255), (0, 255, 212), (0, 255, 170), (0, 255, 127), (0, 255, 85), (0, 255, 42), (0, 255, 0), (43, 255, 0), (85, 255, 0), (128, 255, 0), (170, 255, 0), (213, 255, 0), (255, 255, 0), (255, 212, 0), (255, 170, 0), (255, 127, 0), (255, 85, 0), (255, 42, 0), (255, 0, 0)]

img = cv2.imread("leaf.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(img, 3)
edged = cv2.Canny(gray, 50, 200)

## Find connected edges
ret, labels = cv2.connectedComponents(edged)

## Draw(set to different colors)
canvas = np.zeros_like(img, np.uint8)
for i in range(1,ret):
    pts = labels == i
    canvas[pts] = colors[i%len(colors)]

## Display
cv2.imshow("res", canvas);cv2.waitKey();cv2.destroyAllWindows()
cv2.imwrite("res.png", canvas)

但是Notice ,我为边缘设置了不同的颜色,而不同颜色the points of different colors maybe not the real path

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM