Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python opencv检测记号_Python_Opencv_Rectangles_Edge Detection - Fatal编程技术网

用python opencv检测记号

用python opencv检测记号,python,opencv,rectangles,edge-detection,Python,Opencv,Rectangles,Edge Detection,所以我得到一个盒子的图像,盒子里有许多大小不一的记号,就像一把尺子。如下图所示: 到目前为止,我所处的位置是,通过边缘检测,我只能将外部矩形检测为矩形,而不能检测矩形内的任何记号。代码如下所示: import numpy as np import cv2 image = cv2.imread('images\Ruler.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (3,

所以我得到一个盒子的图像,盒子里有许多大小不一的记号,就像一把尺子。如下图所示:

到目前为止,我所处的位置是,通过边缘检测,我只能将外部矩形检测为矩形,而不能检测矩形内的任何记号。代码如下所示:

import numpy as np
import cv2


image = cv2.imread('images\Ruler.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3, 3), 0)
edges = cv2.Canny(blur, 50, 200)
cnts, hierarchy = cv2.findContours(edges, cv2.RETR_LIST, 
cv2.CHAIN_APPROX_SIMPLE)

corner_points = []


for index, cnt_points in enumerate(cnts):
    perimeter = cv2.arcLength(cnts[index], True)
    approx = cv2.approxPolyDP(cnts[index], 0.02 * perimeter, True)
    corner_points.append(approx)


    x, y, w, h = cv2.boundingRect(corner_points[index])
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

print(corner_points)
cv2.imshow("Contour", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
我希望生成的图像与下图类似:

正如您所看到的,勾号(红色轮廓)和外部矩形(绿色轮廓)不仅被检测到,而且您能够区分勾号和外部矩形。我还试图获得记号点的角点的像素位置,以及在我的代码中看到的,我将角点存储到“角点=[]”中

此外,我不确定勾号是否被视为粗线或矩形。因此,位置角点可以是记号“线”的2个端点,也可以是记号“矩形”的4个顶点 img=cv2.imread('images/Ruler.png',cv2.imread\u灰度) h、 w,ug=img.shape bw=img>128 角点=[] #如果行的像素长度高于此阈值 #将起点和终点添加到角点 可接受长度=10 对于范围(0,h)内的i: 开始=-1#行中的第一个真像素 停止=-1#开始后的第一个错误像素 对于范围(0,w)内的j: 如果bw(i,j)和start为-1: 开始=j 如果start不是-1且不是bw(i,j): 停止=j #我在这里添加了50,以避免添加地板和天花板线条 如果停止-启动>接受的长度且停止-启动<50: 角点。追加([开始-结束]) 持续
导入cv2
img=cv2.imread('images/Ruler.png',cv2.imread\u灰度)
h、 w,ug=img.shape
bw=img>128
角点=[]
#如果行的像素长度高于此阈值
#将起点和终点添加到角点
可接受长度=10
对于范围(0,h)内的i:
开始=-1#行中的第一个真像素
停止=-1#开始后的第一个错误像素
对于范围(0,w)内的j:
如果bw(i,j)和start为-1:
开始=j
如果start不是-1且不是bw(i,j):
停止=j
#我在这里添加了50,以避免添加地板和天花板线条
如果停止-启动>接受的长度且停止-启动<50:
角点。追加([开始-结束])
持续

我试图运行您的代码,但似乎无法运行compile@1acle我没有测试它。这里的想法是将每个水平线添加到
角点
,除了顶部和底部。如果水平线的长度在某个阈值之间(此处为10和50,可以更改),这意味着它不是垂直线的端点,也不是顶部或底部边缘。如果你能编译它,请提出编辑请求以更正错误。如果这不是您想要的,但您想要一种通用方法,我建议您使用。我尝试运行您的代码,但似乎没有compile@1acle我没有测试它。这里的想法是将每个水平线添加到
角点
,除了顶部和底部。如果水平线的长度在某个阈值之间(此处为10和50,可以更改),这意味着它不是垂直线的端点,也不是顶部或底部边缘。如果你能编译它,请提出编辑请求以更正错误。如果这不是你想要的,但你想要一个通用的方法,我建议你使用。