回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我想可视化用<code>cv2.approxPolyDP()</code>提取的多边形曲线。以下是我正在使用的图像:</p>
<p><a href="https://i.stack.imgur.com/k8PVG.png" rel="noreferrer"><img src="https://i.stack.imgur.com/k8PVG.png" alt="map of UK"/></a></p>
<p>我的代码试图隔离主岛,并定义和绘制等高线近似和等高线外壳。我绘制了绿色的轮廓,红色的近似值:</p>
<pre><code>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()
</code></pre>
<p>以下是生成的图像:</p>
<p><a href="https://i.stack.imgur.com/b0RQd.png" rel="noreferrer"><img src="https://i.stack.imgur.com/b0RQd.png" alt="enter image description here"/></a></p>
<p>第一幅图像以绿色绘制轮廓。第二个以红色绘制近似值-如何将此近似值绘制为连续闭合曲线</p>
<p><a href="http://docs.opencv.org/3.0-beta/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#approxpolydp" rel="noreferrer">documentation</a>不是很清楚,<a href="http://docs.opencv.org/3.2.0/dd/d49/tutorial_py_contour_features.html" rel="noreferrer">tutorial</a>也不是很清楚,但我的理解是<code>cv2.approxPolyDP()</code>应该定义一条连续的闭合曲线,我应该能够用<code>cv2.drawContours()</code>绘制它。对吗?如果是,我做错了什么</p>