Python OpenCV - 可视化使用 cv2.approxPolyDP() 提取的多边形曲线
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/41879315/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
OpenCV - visualize polygonal curve(s) extracted with cv2.approxPolyDP()
提问by Aidenhjj
I want to visualize polygonal curve(s) extracted with cv2.approxPolyDP()
. Here's the image I am using:
我想可视化使用cv2.approxPolyDP()
. 这是我正在使用的图像:
My code attempts to isolate the main island and define and plot the contour approximation and contour hull. I have plotted the contour found in green, the approximation in red:
我的代码尝试隔离主岛并定义和绘制轮廓近似值和轮廓船体。我已经绘制了绿色的轮廓,红色的近似值:
import numpy as np
import cv2
# load image and shrink - it's massive
img = cv2.imread('../data/UK.png')
img = cv2.resize(img, None,fx=0.25, fy=0.25, interpolation = cv2.INTER_CUBIC)
# get a blank canvas for drawing contour on and convert img to grayscale
canvas = np.zeros(img.shape, np.uint8)
img2gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# filter out small lines between counties
kernel = np.ones((5,5),np.float32)/25
img2gray = cv2.filter2D(img2gray,-1,kernel)
# threshold the image and extract contours
ret,thresh = cv2.threshold(img2gray,250,255,cv2.THRESH_BINARY_INV)
im2,contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# find the main island (biggest area)
cnt = contours[0]
max_area = cv2.contourArea(cnt)
for cont in contours:
if cv2.contourArea(cont) > max_area:
cnt = cont
max_area = cv2.contourArea(cont)
# define main island contour approx. and hull
perimeter = cv2.arcLength(cnt,True)
epsilon = 0.01*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
hull = cv2.convexHull(cnt)
# cv2.isContourConvex(cnt)
cv2.drawContours(canvas, cnt, -1, (0, 255, 0), 3)
cv2.drawContours(canvas, approx, -1, (0, 0, 255), 3)
## cv2.drawContours(canvas, hull, -1, (0, 0, 255), 3) # only displays a few points as well.
cv2.imshow("Contour", canvas)
k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
Here are the resulting images:
以下是生成的图像:
The first image plots the contour in green. The second plots the approximation in red - how do I plot this approximation as a continuous closed curve?
第一个图像以绿色绘制轮廓。第二个以红色绘制近似值 - 如何将此近似值绘制为连续闭合曲线?
The documentationisn't terribly clear and neither is the tutorial, but my understanding is that cv2.approxPolyDP()
should define a continuous, closed curve, which I should be able to plot with cv2.drawContours()
. Is that correct? If so, what am I doing wrong?
该文件是不是非常清楚,无论是教程,但我的理解是,cv2.approxPolyDP()
应该定义一个连续,封闭的曲线,这是我应该能够绘制cv2.drawContours()
。那是对的吗?如果是这样,我做错了什么?
回答by avtomaton
The problem is in visualization only: drawContours
expects array (list in case of python) of contours, not just one numpy array (which is returned from approxPolyDP
).
问题仅在于可视化:drawContours
需要轮廓数组(python 中的列表),而不仅仅是一个 numpy 数组(从 返回approxPolyDP
)。
Solution is the following: replacing
解决方法如下:更换
cv2.drawContours(canvas, approx, -1, (0, 0, 255), 3)
to
到
cv2.drawContours(canvas, [approx], -1, (0, 0, 255), 3)