<h3>概念</h3>
<p>一种简单的检测图像中是否存在形状交叉点的方法,假设每个形状必须是不同的颜色,您可以为每种颜色定义一个遮罩,并且在图像的颜色都被遮罩(形状除外)的情况下,检测为形状轮廓找到的轮廓量</p>
<p>如果发现多个轮廓<em>(大于过滤噪声的指定量的区域)</em>,这意味着另一个形状的轮廓与该形状的轮廓相交,在其轮廓中留下间隙,从而产生多个轮廓</p>
<h3>代码</h3>
<pre><code>import cv2
import numpy as np
def intersected(img, masks):
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
for lower, upper in masks:
mask = cv2.inRange(img_hsv, np.array(lower), np.array(upper))
blur = cv2.GaussianBlur(mask, (5, 5), 0)
canny = cv2.Canny(blur, 0, 0)
contours, _ = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
count = 0
for cnt in contours:
if cv2.contourArea(cnt) > 50:
cv2.drawContours(img, [cnt], -1, (0, 255, 0), 1)
cv2.imshow("Test", img)
count += 1
if count == 2:
return True
img = cv2.imread("shapes.png")
blue_mask = [1, 0, 0], [178, 255, 255]
red_mask = [0, 1, 0], [179, 254, 255]
if intersected(img, (blue_mask, red_mask)):
print("Intersection detected!")
else:
print("No intersection detected.")
</code></pre>
<h3>输出</h3>
<pre><code>Intersection detected!
</code></pre>
<hr/>
<h3>解释</h3>
<ol>
<li>导入必要的库:</li>
</ol>
<pre><code>import cv2
import numpy as np
</code></pre>
<ol start=“2”>
<li>定义一个包含2个参数的函数;我们将检测的图像是否存在形状交叉点,以及每个形状颜色的HSV遮罩阵列:</li>
</ol>
<pre><code>def intersected(img, masks):
</code></pre>
<ol start=“3”>
<li>以HSV形式获取图像,并循环通过每个HSV遮罩:</li>
</ol>
<pre><code> img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
for lower, upper in masks:
mask = cv2.inRange(img_hsv, np.array(lower), np.array(upper))
</code></pre>
<ol start=“4”>
<li>模糊遮罩以去除噪声,使用canny边缘检测器检测其边缘,并找到canny边缘的轮廓:</li>
</ol>
<pre><code> blur = cv2.GaussianBlur(mask, (5, 5), 0)
canny = cv2.Canny(blur, 0, 0)
contours, _ = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
</code></pre>
<ol start=“5”>
<li>定义一个变量<code>count</code>,以存储到目前为止发现的面积大于<code>50</code>的等高线数量。如果<code>count</code>变量达到<code>2</code>,我们将知道至少找到了一个交点,这足以确认图像中存在交点:</li>
</ol>
<pre><code> count = 0
for cnt in contours:
if cv2.contourArea(cnt) > 50:
cv2.drawContours(img, [cnt], -1, (0, 255, 0), 1)
cv2.imshow("Test", img)
count += 1
if count == 2:
return True
</code></pre>
<ol start=“6”>
<li>最后,我们可以利用图像上的功能:</li>
</ol>
<pre><code>img = cv2.imread("shapes.png")
blue_mask = [1, 0, 0], [178, 255, 255]
red_mask = [0, 1, 0], [179, 254, 255]
if intersected(img, (blue_mask, red_mask)):
print("Intersection detected!")
else:
print("No intersection detected.")
</code></pre>