DrawContours() not working opencv python



我正在研究在opencv python中查找和绘制轮廓的示例。但是当我运行代码时,我只看到一个没有绘制轮廓的深色窗口。我不知道我哪里做错了。代码是:

import numpy as np
import cv2
im = cv2.imread('test.png')
imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy =     cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img=cv2.drawContours(image,contours,0,(0,255,0),3)
cv2.imshow('draw contours',img)
cv2.waitKey(0)

test.png只是一个黑色背景的白色矩形。

如有任何帮助,不胜感激。

编辑:我使用的是Opencv 3.0.0和Python 2.7

我认为问题出在drawContours命令上。如目前所写,图像目的地是imageimg。您还试图在单通道8位图像上绘制彩色框。此外,值得注意的是,findContours函数实际上在查找轮廓的过程中修改了输入图像,因此最好不要在以后的代码中使用该图像。

我还建议创建一个新的图像副本,设置为drawContours函数的目标,如果你打算对你的图像做进一步的分析,这样你就不会重写你的程序目前可以访问的唯一副本。

import numpy as np
import cv2
im = cv2.imread('test.png')
imCopy = im.copy()
imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy =  cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(imCopy,contours,-1,(0,255,0))
cv2.imshow('draw contours',imCopy)
cv2.waitKey(0)

这两个快速修复对我来说很有效,在一个类似的图像中,黑色的正方形和白色的背景。

确保image在这里是3通道:

img = cv2.drawContours(image, contours, -1, (0, 255, 0), 3)

检查图像形状:

print(image.shape)
# (400, 300)    -> Error
# (400, 300, 3) -> Works

如果你的图像只有一个通道,你不能在它上面画颜色,因为它是灰度的。

正如@Scott提到的,检查你的图像形状是个好主意:

print(image.shape)

所以如果你想绘制彩色轮廓,你必须将1通道灰度图像转换为3通道图像:

import cv2
# read image as grayscale, so I don't have to use cv2.cvtColor
gray = cv2.imread("test.png", cv2.IMREAD_GRAYSCALE)
# threshold image
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# find contours
cnts, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# this does the magic
# convert 1 channel grayscale image to 3 channel colored image
color = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB)
# draw contours on it
cv2.drawContours(color, cnts, -1, (0, 255, 0), -1)
cv2.imshow("contours", color)
cv2.waitKey(0)
cv2.destroyAllWindows()

或者如果你只想绘制灰度颜色,你不必将其转换为3通道图像:

import cv2
# read image as grayscale, so I don't have to use cv2.cvtColor
gray = cv2.imread("test.png", cv2.IMREAD_GRAYSCALE)
# threshold image
_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# find contours
cnts, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# draw black contours on it
cv2.drawContours(color, cnts, -1, (0,), -1)
cv2.imshow("contours", color)
cv2.waitKey(0)
cv2.destroyAllWindows()

相关内容

  • 没有找到相关文章

最新更新