Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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_Image Processing - Fatal编程技术网

Python 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"

我正在尝试创建一种算法,用于检测从机器人摄像头采集的OpenCV中的矩形。因此,由于机器人的移动,我自然会得到相当多的变化。使用此代码:

    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%的时间都有效。这幅图像的问题是反射的亮度与实际的旗帜差不多