Opencv,结合了色度键校正和轮廓检测,产生了意想不到的结果

Opencv,结合了色度键校正和轮廓检测,产生了意想不到的结果,opencv,Opencv,我在一张色度键校正过的图像上做轮廓检测。当我滤除蓝色时,一切都很好,但是当我试图通过滤除红色来获得更好的色度校正时,突然我的轮廓无法被检测到了。有什么建议吗 使用蓝色过滤器: img = cv2.imread('yellowcropped.jpg', 1) lower_blue = np.array([0, 0, 15]) ##[R value, G value, B value] upper_blue = np.array([255, 255, 60]) mask = cv2.inRange

我在一张色度键校正过的图像上做轮廓检测。当我滤除蓝色时,一切都很好,但是当我试图通过滤除红色来获得更好的色度校正时,突然我的轮廓无法被检测到了。有什么建议吗

使用蓝色过滤器:

img = cv2.imread('yellowcropped.jpg', 1)
lower_blue = np.array([0, 0, 15])  ##[R value, G value, B value]
upper_blue = np.array([255, 255, 60])
mask = cv2.inRange(image_copy, lower_blue, upper_blue)

使用蓝色和红色过滤器:

lower_blue = np.array([180, 0, 15])  ##[R value, G value, B value]
upper_blue = np.array([255, 255, 60])
(注意左上角的图像变得更加清晰,但不再检测到轮廓。)

下面是我的轮廓查找代码:

imgContour = image_original.copy()
imgBlur = cv2.GaussianBlur(img, (7, 7), 1)
imgGray = imgBlur
imgCanny = cv2.Canny(imgGray,threshold1,threshold2)
kernel = np.ones((5, 5))
imgDil = cv2.dilate(imgCanny, kernel, iterations=1)
getContours(imgDil,imgContour)


def getContours(img,imgContour):

""" DRAWS AND FINDS CONTOURS, THEN RETURNS a list of lists incl x0, y0, w, h"""

contour_list = []
contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# print('contours:', contours)
for cnt in contours:
    area = cv2.contourArea(cnt)
    areaMin = cv2.getTrackbarPos("Area", "Parameters")
    if area > areaMin and area < 5000:
        cv2.drawContours(imgContour, cnt, -1, (255, 0, 0), 7)
        peri = cv2.arcLength(cnt, True)
        approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
        # print(len(approx))
        x , y , w, h = cv2.boundingRect(approx)
        print('contour bounding:', x,y,w,h)
        center_x = int(x + w/2)
        center_y = int(y + h/2)

        cv2.circle(imgContour,(center_x, center_y), 5, (0, 0, 255), 5)
        cv2.rectangle(imgContour, (x , y ), (x + w , y + h ), (0, 255, 0), 5)

        cv2.putText(imgContour, "Points: " + str(len(approx)), (x + w + 20, y + 20), cv2.FONT_HERSHEY_COMPLEX, .7,
                    (0, 255, 0), 2)
        cv2.putText(imgContour, "Area: " + str(int(area)), (x + w + 20, y + 45), cv2.FONT_HERSHEY_COMPLEX, 0.7,
                    (0, 255, 0), 2)

        if area < 3500:
            cv2.putText(imgContour, "THIS IS A SMALL PART" , (x + w + 20, y + 70), cv2.FONT_HERSHEY_COMPLEX, 0.7,
                        (0, 255, 0), 2)

        contour_list.append([x,y,w,h])

return contour_listenter code here
imgContour=image\u original.copy()
imgBlur=cv2.高斯模糊(img,(7,7,1)
imgGray=imgBlur
imgCanny=cv2.Canny(imgGray,threshold1,threshold2)
内核=np.one((5,5))
imgDil=cv2.deflate(imgCanny,内核,迭代次数=1)
获取等高线(imgDil、imgContour)
def getContours(img、imgContour):
“”“绘制并查找轮廓,然后返回包含x0、y0、w、h的列表”“”
轮廓列表=[]
轮廓,层次=cv2.查找轮廓(img,cv2.RETR\u外部,cv2.CHAIN\u近似值\u无)
#打印('等高线:',等高线)
对于轮廓中的cnt:
面积=cv2。轮廓面积(cnt)
areaMin=cv2.getTrackbarPos(“区域”、“参数”)
如果面积>面积最小值且面积<5000:
cv2.绘制等高线(imgContour,cnt,-1,(255,0,0),7)
peri=cv2.弧长(cnt,真)
近似值=cv2.近似聚合度(cnt,0.02*peri,真)
#打印(透镜(近似值))
x,y,w,h=cv2.边界矩形(近似值)
打印('轮廓边界:',x,y,w,h)
中心x=int(x+w/2)
中心y=int(y+h/2)
cv2.圆(imgContour,(中心x,中心y),5,(0,0,255),5)
cv2.矩形(imgContour,(x,y),(x+w,y+h),(0,255,0),5)
cv2.putText(imgContour),要点:“+str(len(近似)),(x+w+20,y+20),cv2.FONT\U HERSHEY\U COMPLEX,.7,
(0, 255, 0), 2)
cv2.putText(imgContour,“面积:”+str(int(面积)),(x+w+20,y+45),cv2.FONT\u HERSHEY\u复合体,0.7,
(0, 255, 0), 2)
如果面积小于3500:
cv2.putText(imgContour,“这是一个小部分)”,(x+w+20,y+70),cv2.FONT\u HERSHEY\u COMPLEX,0.7,
(0, 255, 0), 2)
等高线列表。追加([x,y,w,h])
在此处返回轮廓线列表输入代码

因此,我仍然不完全知道这里出了什么问题,但我为将来的任何人找到了一个解决方案,他们希望先纠正色度键(删除背景),然后进行轮廓检测:

我放弃了高斯滤镜,放大和canny,而是使用以下方法反转图像的颜色(轮廓检测仅检测黑色背景上的白色部分):

然后,我将轮廓检测从cv2.RETR_EXTERNAL更改为cv2.RETR_LIST

不知怎么的,它修复了,结果现在真的很好

mask = cv2.bitwise_not(mask)