在python中从opencv中分离多个canny边缘检测的坐标

Posted

技术标签:

【中文标题】在python中从opencv中分离多个canny边缘检测的坐标【英文标题】:Separating the coordinates of multiple canny edge detections from opencv in python 【发布时间】:2021-03-01 15:09:48 【问题描述】:

我目前正在运行精巧的边缘检测,并且正在检测两个方形物体。我检测边缘并使用

列出坐标
colourMap = cv2.imread('Colour_Map_Generated2.jpg',0)
edges = cv2.Canny(colourMap,10,20) 

cv2.imwrite('/home/pi/Desktop/edgesDetected.jpg',edges)

indices = np.where(edges != [0])
coordinates = zip(indices[0], indices[1])

但是这种方法将所有坐标放在一个列表中,我如何将每个正方形的坐标放在一个单独的数组中?

到目前为止,我已经尝试确定 2 个 ROI,但是当我尝试检测整个图像时没有成功,此外,如果我要硬设置 ROI 的数量,它也不会工作,因为该系统可能检测到不同的数量的正方形。我也尝试使用斑点检测,但这似乎需要我填写检测到的方块,当我已经有了坐标时,这似乎是浪费时间。

编辑

Here is an example image with the edge detections in

【问题讨论】:

你能贴出你正在使用的图片吗?我相当肯定 findContours 会做你想做的事,但没有图像我不能确定。 【参考方案1】:

我正在使用 findContours 来获取每个矩形的点。由于 findContours 将给出空心形状的内部和外部轮廓,因此我们必须通过检查相似的周长来删除重复项。

import cv2
import numpy as np

# load image
img = cv2.imread("rectangles.png");

# make a mask
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
mask = cv2.inRange(gray, 100, 255);

# get contours # OpenCV 3.4, if you're using OpenCV 2 or 4, it returns (contours, _)
_, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE);
print(len(contours));

# remove contours with very similar perimeters (we get back inner and outer contours)
cutoff_percent = 0.05;
no_dupes = [];
for con in contours:
    perim = cv2.arcLength(con, closed = True);
    # check for duplicate
    dupe_flag = False;
    for dupe in no_dupes:
        dupe_perim = cv2.arcLength(dupe, closed = True);
        if abs(dupe_perim - perim) < cutoff_percent * perim:
            dupe_flag = True;
            break;

    # add to list
    if not dupe_flag:
        no_dupes.append(con);
print(len(no_dupes));

# draw each one sequentially
blank = np.zeros_like(img);
cv2.imwrite("blank.png", blank);
for a in range(len(no_dupes)):
    cv2.drawContours(blank, [no_dupes[a]], -1, (200, 200, 0), 1);
    cv2.imshow("blank", blank);
    cv2.waitKey(0);

# show
cv2.imshow("Image", img);
cv2.waitKey(0);

【讨论】:

这不是检查欺骗的好方法。如果其他正方形的周长相同,它会将它们过滤掉。您必须检查它们是否处于同一位置。但我不认为它是骗子。

以上是关于在python中从opencv中分离多个canny边缘检测的坐标的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL PHP 中从多行结果中分离行

Python+OpenCV图像处理之直线检测

在iOS App(制作卡拉OK)中从音频文件中分离语音和音乐[关闭]

Python+OpenCV图像处理(十四)—— 直线检测

OpenCV 从网络摄像头流中分离出剪影

python-opencv-Canny边缘检测