Python OpenCV-反射图像中的矩形检测
我正在尝试创建一种算法,用于检测从机器人摄像头采集的OpenCV中的矩形。因此,由于机器人的移动,我自然会得到相当多的变化。使用此代码:Python OpenCV-反射图像中的矩形检测,python,opencv,image-processing,Python,Opencv,Image Processing,我正在尝试创建一种算法,用于检测从机器人摄像头采集的OpenCV中的矩形。因此,由于机器人的移动,我自然会得到相当多的变化。使用此代码: def original_settings(img): gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #cv.imshow("Gray", gray) blur = cv.medianBlur(gray,5) #cv.imshow("Blur"
def original_settings(img):
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#cv.imshow("Gray", gray)
blur = cv.medianBlur(gray,5)
#cv.imshow("Blur", blur)
sharpen = cv.filter2D(blur, -1, sharpen_kernel)
#cv.imshow("Sharpen", sharpen)
return sharpen
def find_square(img):
thresh = cv.threshold(img, 160, 255, cv.THRESH_BINARY_INV)[1]
#cv.imshow("Threshhold", thresh)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
close = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel, iterations=2)
#cv.imshow("Morphology Search", close)
close = cv.bitwise_not(close)
#cv.imshow("Invert Search", close)
cnts = cv.findContours(close, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
min_area = 3500
max_area = 5000
image_number = 0
for c in cnts:
area = cv.contourArea(c)
#print(area)
if area > min_area and area < max_area:
x, y, w, h = cv.boundingRect(c)
cv.rectangle(image, (x, y), (x + w, y + h), (36, 255, 12), 2)
print("Width: {}, Height: {}, x: {}, y: {}".format(w,h,x,y))
image_number += 1
#print((x, y))
return True
return False
find_square(original_settings(image))
def原始设置(img):
灰色=cv.CVT颜色(img,cv.COLOR\u bgr2灰色)
#cv.imshow(“灰色”,灰色)
模糊=cv.中间模糊(灰色,5)
#cv.imshow(“模糊”,模糊)
锐化=cv.filter2D(模糊,-1,锐化内核)
#cv.imshow(“锐化”,锐化)
回磨
def查找方格(img):
thresh=cv.阈值(img,160,255,cv.thresh\u BINARY\u INV)[1]
#cv.imshow(“脱粒”,脱粒)
kernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3))
close=cv.morphologyEx(thresh,cv.MORPH\u close,kernel,迭代次数=2)
#cv.imshow(“形态搜索”,关闭)
关闭=cv.按位\u非(关闭)
#cv.imshow(“反向搜索”,关闭)
cnts=cv.findContours(闭合、cv.RETR\u外部、cv.CHAIN\u近似值\u简单值)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
最小面积=3500
最大面积=5000
图像编号=0
对于碳纳米管中的碳:
面积=等高线面积(c)
#打印(面积)
如果面积>最小面积和面积<最大面积:
x、 y,w,h=cv.boundingRect(c)
cv.矩形(图像,(x,y),(x+w,y+h),(36255,12),2)
打印(“宽度:{},高度:{},x:{},y:{}”。格式(w,h,x,y))
图像编号+=1
#打印((x,y))
返回真值
返回错误
查找方形(原始设置(图像))
我对自己的照片基本上是成功的,但有一种情况我不能很准确地指出。当我处理这个由于反射而看起来有一个额外的矩形时,我的算法捕捉到了整个过程。而不仅仅是更大的矩形,如
如何让OpenCV忽略这个额外的矩形块?看看你的阈值图像。一个阈值(160)可能不适用于所有图像。你试过大津阈值吗?我发现使用大津阈值有时会决定使用我的一些图像的错误部分。如果我的算法根本找不到矩形,我会在预处理时尝试使图像变亮或变暗。到目前为止,98%的时间都有效。这幅图像的问题是反射的亮度与实际的旗帜差不多