首页 > 解决方案 > Opencv findCountours 函数

问题描述

我正在尝试学习opencv。在网上我发现,用opencv,我可以得到一些图像的轮廓。所以我试过了。这是脚本:

import cv2
import numpy as np

def getC(imagine):
    global imgContour
    c,h = cv2.findContours(imagine,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    for cnt in c:
        a = cv2.contourArea(cnt)
        print(area)
        if area>500:
            cv2.drawContour(imgContour,cnt,-1,(255,0,0),3)

img = cv2.imread("a3.jpg")
imgContour = img.copy()
imgG = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgB = cv2.GaussianBlur(imgG,(7,7),1)
imgC = cv2.Canny(imgB,50,50)

getC(imgContour)

cv2.imshow("",img)
cv2.imshow("g",imgG)
cv2.imshow("b",imgB)
cv2.imshow("l",imgContour)
cv2.waitKey(0)

我认为全局变量存在问题,格式也存在问题。a3.jpg 就是那个图像

我现在不知道现在该做什么,以及如何解决这个问题。

谢谢您的帮助

标签: python-3.xopencvcomputer-vision

解决方案


  1. 您将该区域保存为变量a,但将其与名称一起使用,area您可以通过将变量名称更改为来解决此a问题area
area = cv2.contourArea(cnt)
  1. 有错字cv2.drawContour你应该这样写cv2.drawContours

  2. cv2.drawContours方法期望您要绘制的轮廓是列表列表,因此您需要像这样调用它

cv2.drawContours(imgContour,[cnt],-1,(255,0,0),3)
  1. 当您将图像传递给getC方法时,您给了它一个图像,而无需预处理此图像并使用 canny 将其转换为阈值图像,因此您需要像这样调用它
getC(imgC)

最终剧本


import cv2
import numpy as np


def getC(imagine):

    global imgContour
    print(imgContour.shape)
    c,h = cv2.findContours(imagine,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    for cnt in c:
        area = cv2.contourArea(cnt)
        print(area)
        if area>500:
            cv2.drawContours(imgContour,[cnt],-1,(255,0,0),3)


img = cv2.imread("./a3.jpg")
imgContour = img.copy()

imgG = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgB = cv2.GaussianBlur(imgG,(7,7),1)
imgC = cv2.Canny(imgB,50,50)

getC(imgC)

cv2.imshow("",img)
cv2.imshow("g",imgG)
cv2.imshow("b",imgB)
cv2.imshow("l",imgContour)
cv2.waitKey(0)

推荐阅读