gpt4 book ai didi

python - 有没有类似于OpenCV findContours的功能,检测曲线,用样条代替点?

转载 作者:太空狗 更新时间:2023-10-30 02:53:54 25 4
gpt4 key购买 nike

我正在尝试拍摄下图,描绘白色形状,并将生成的路径导出为 pdf。我遇到的问题是 findContours 似乎只能找到形状边缘的点。有没有类似于 findContours 的解决方案,可以检测形状中的曲线并在有曲线的地方用样条线替换它的点?如果我使用 scipy.interpolate 它会忽略直线并将整个轮廓变成一个大的曲线形状,这也不好。我需要同时具备这两种功能的东西。

import numpy as np
import cv2
from scipy.interpolate import splprep, splev
from pyx import *
import matplotlib.pyplot as plt

#read in image file
original = cv2.imread('test.jpg')

#blur the image to smooth edges
im = cv2.medianBlur(original,5)

#threshold the image
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,170,255,cv2.THRESH_BINARY)

#findContours
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_\
APPROX_SIMPLE)

#drawContours
cv2.drawContours(original, [approx], -1, (0,255,0), 3)
cv2.imshow("Imageee", original)
cv2.waitKey(0)

最佳答案

除了使用带有标记cv2.CHAIN_APPROX_SIMPLEcv2.findContours来逼近轮廓外,我们可以手动完成。

  1. 使用带有标志 cv2.CHAIN_APPROX_NONEcv2.findContours 来查找轮廓。
  2. 使用cv2.arcLength计算轮廓长度。
  3. 使用 cv2.approxPoolyDP 通过 epsilon = eps * arclen 手动逼近轮廓。

这是 eps=0.005 时的结果之一:

enter image description here

更多结果:

enter image description here


#!/usr/bin/python3
# 2018.01.04 13:01:24 CST
# 2018.01.04 14:42:58 CST

import cv2
import numpy as np
import os
img = cv2.imread("test.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,threshed = cv2.threshold(gray,170,255,cv2.THRESH_BINARY)

# find contours without approx
cnts = cv2.findContours(threshed,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)[-2]

# get the max-area contour
cnt = sorted(cnts, key=cv2.contourArea)[-1]

# calc arclentgh
arclen = cv2.arcLength(cnt, True)

# do approx
eps = 0.0005
epsilon = arclen * eps
approx = cv2.approxPolyDP(cnt, epsilon, True)

# draw the result
canvas = img.copy()
for pt in approx:
cv2.circle(canvas, (pt[0][0], pt[0][1]), 7, (0,255,0), -1)

cv2.drawContours(canvas, [approx], -1, (0,0,255), 2, cv2.LINE_AA)

# save
cv2.imwrite("result.png", canvas)

关于python - 有没有类似于OpenCV findContours的功能,检测曲线,用样条代替点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47936474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com