我是OpenCV的新手,我正在尝试在特定轮廓内绘制外部轮廓。这是我用来澄清的图像(已经是灰度,阈值等)
我想要的是在外部矩形内找到所有圆的轮廓(共120个)。
RETR_EXTERNAL
所以我基本上使用RETR_TREE
,但是它只返回外部矩形。我尝试使用RETR_EXTERNAL
,但由于某种原因,我不了解,因此返回的轮廓比圆形多。需要说明的是:我只想每个圆1个轮廓。
如何使用{{1}}并忽略外部轮廓(矩形),使其仅返回圆?
答案 0 :(得分:1)
我按区域过滤了轮廓,以隔离圆。我认为您可能需要对thresholding图像进行更多处理,以帮助从图像的边界描绘出圆圈。我使用了以下代码:
override func viewDidLoad() {
super.viewDidLoad()
if let nav = self.navigationController {
nav.navigationBar.setBackgroundImage(UIImage(), for: .default)
nav.navigationBar.shadowImage = UIImage()
nav.navigationBar.isTranslucent = true
}
}
如果您只想使用import cv2
import numpy as np
img = cv2.imread("/your/path/C03eN.jpg")
def find_contours_and_centers(img_input):
img_gray = cv2.cvtColor(img_input, cv2.COLOR_BGR2GRAY)
img_gray = cv2.bilateralFilter(img_gray, 3, 27,27)
#(T, thresh) = cv2.threshold(img_input, 0, 100, 0)
_, contours_raw, hierarchy = cv2.findContours(img_gray, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contours = [i for i in contours_raw if cv2.contourArea(i) > 20]
contour_centers = []
for idx, c in enumerate(contours):
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
samp_bounds = cv2.boundingRect(c)
contour_centers.append(((cX,cY), samp_bounds))
print("{0} contour centers and bounds found".format(len(contour_centers)))
contour_centers = sorted(contour_centers, key=lambda x: x[0])
return (contours, contour_centers)
conts, cents = find_contours_and_centers(img.copy())
circles = [i for i in conts if np.logical_and((cv2.contourArea(i) > 650),(cv2.contourArea(i) < 4000))]
cv2.drawContours(img, circles, -1, (0,255,0), 2)
cv2.imwrite("/your/path/tester.jpg", img)
提取较大的外部矩形内的图像部分,则可以专注于内部圆,可以执行以下操作:
cv2.RETR_EXTERNAL