簡體   English   中英

如何找到線和輪廓之間的交點

[英]How to find intersection points between lines and contours

考慮下圖,其中輪廓以綠色顯示,直線以紅色顯示

在此處輸入圖像描述

我們如何找到直線切割輪廓的交點

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

# Read image img

# Binarize
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)

# Find Contours
_, contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# Draw Contours
blank_mask = np.zeros((thresh.shape[0],thresh.shape[1],3), np.uint8)
cv2.drawContours(blank_mask, contours, -1, (0, 255, 0), 1) 

# Define lines coordinates
line1 = [x1, y1, x2, y2]
line2 = [x1, y1, x2, y2]
line3 = [x1, y1, x2, y2]

# Draw Lines over Contours
cv2.line(blank_mask, (line1[0], line1[1]), (line1[2], line1[3]), (255, 0, 0), thickness=1)
cv2.line(blank_mask, (line2[0], line2[1]), (line2[2], line2[3]), (255, 0, 0), thickness=1)
cv2.line(blank_mask, (line3[0], line3[1]), (line3[2], line3[3]), (255, 0, 0), thickness=1)

# Show Image
fig = plt.figure()
ax  = fig.add_subplot(111)
ax.imshow(blank_mask)

示例圖像

您可以逐個像素檢查它們重疊的位置。 在繪制線條之前,您必須保留輪廓所在像素的副本,因為這會用線條的顏色覆蓋重疊的像素。 在您的代碼中添加幾行

# Draw Contours
blank_mask = np.zeros((thresh.shape[0],thresh.shape[1],3), np.uint8)
cv2.drawContours(blank_mask, contours, -1, (0, 255, 0), 1)
contours_idx = blank_mask[...,1] == 255

# Define lines coordinates
line1 = [x1, y1, x2, y2]
line2 = [x1, y1, x2, y2]
line3 = [x1, y1, x2, y2]

# Draw Lines over Contours
cv2.line(blank_mask, (line1[0], line1[1]), (line1[2], line1[3]), (255, 0, 0), thickness=1)
cv2.line(blank_mask, (line2[0], line2[1]), (line2[2], line2[3]), (255, 0, 0), thickness=1)
cv2.line(blank_mask, (line3[0], line3[1]), (line3[2], line3[3]), (255, 0, 0), thickness=1)
lines_idx = blank_mask[...,0] == 255

接着

overlap = np.where(contours_idx * lines_idx)

這會給你類似於以下的東西(我不得不猜測你的線坐標和圖像調整大小的形狀,所以我可能有點偏離)

(array([ 90, 110, 110, 140, 140], dtype=int64), array([ 80,  40, 141,  27, 156], dtype=int64))

如果你想要它們在像素坐標的元組中

list(zip(*overlap))

編輯:對於輪廓/線條的顏色在多個平面上的更通用的解決方案,您可以在每次繪制后檢查每個像素的全色。 例如

# Change these
contours_idx = blank_mask[...,1] == 255
lines_idx = blank_mask[...,0] == 255

# To this
contours_idx = np.all(blank_mask == (0, 255, 0), axis=-1)
lines_idx = np.all(blank_mask == (255, 0, 0), axis=-1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM