Python OpenCv FindOntours
我尝试在二值图像中查找轮廓,但当尝试执行cvFindContours时,它会给我错误消息 回溯(最近一次调用last):文件“convert.py”,第30行,在 contour=cvFindContours(img2,存储,cv.cv\u RETR\u CCOMP,cv.cv\u CHAIN\u近似\u SIMPLE)文件 “/usr/lib/pymodules/python2.7/opencv/cv.py”,第580行,在 cvFindContours count,seq=cvfindcontoursontyped(*args)文件“/usr/lib/pymodules/python2.7/opencv/cv.py”,第6521行,在 cvFindContoursUntyped return _cv.cvFindConteursUntyped(*args)运行时错误:openCV错误: 状态=输入数组的大小不正确 函数名=cvStartFindContours 错误消息= 文件名=/build/buildd/opencv-2.1.0/src/cv/cvcontours.cpp 行=205 我使用新安装的Ubuntu 11.10和Opencv 2.3.1 这是我的源代码Python OpenCv FindOntours,python,image-processing,opencv,Python,Image Processing,Opencv,我尝试在二值图像中查找轮廓,但当尝试执行cvFindContours时,它会给我错误消息 回溯(最近一次调用last):文件“convert.py”,第30行,在 contour=cvFindContours(img2,存储,cv.cv\u RETR\u CCOMP,cv.cv\u CHAIN\u近似\u SIMPLE)文件 “/usr/lib/pymodules/python2.7/opencv/cv.py”,第580行,在 cvFindContours count,seq=cvfindcon
from opencv.cv import *
from opencv.highgui import *
image = cvLoadImage('test.png')
def getthresholdedimg(image):
size = cvSize(640, 480)
imghsv=cvCreateImage(cvGetSize(image),8,3)
cvCvtColor(image,imghsv,cv.CV_BGR2HSV)
imgblue=cvCreateImage(cvGetSize(image),8,1)
imgblue2=cvCreateImage(cvGetSize(image),8,1)
imgthreshold=cvCreateImage(cvGetSize(image),8,1)
cvInRangeS(imghsv,cvScalar(100,100,100),cvScalar(120,255,255),imgblue)
cvInRangeS(imghsv,cvScalar(100,100,100),cvScalar(120,255,255),imgblue2)
cvAdd(imgblue,imgblue,imgthreshold)
return imgthreshold
cvFlip(image,image,1)
cvSmooth(image, image, CV_GAUSSIAN, 3, 0)
imgthresh=getthresholdedimg(image)
cvErode(imgthresh,imgthresh,None,3)
cvDilate(imgthresh,imgthresh,None,10)
storage = cvCreateMemStorage(0)
img2=cvCloneImage(imgthresh)
contour = cvFindContours(img2, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
我的原始图像和二进制图像
原始图像
和蓝色滤波二值图像
我认为这种风格的API已经从OpenCV中停止了。目前有两个API,旧的API是由
>>> import cv2.cv as cv
第二个也是新的一个是cv2
,提供如下功能:
>>> import cv2
关于错误:
将导入语句替换为cv2.cv import*中的
然后删除所有cv
前缀,它应该可以正常工作
注意:
我想你是在尝试物体的颜色跟踪
但是既然您有OpenCV 2.3.1,为什么要使用非常旧的Python API呢
新的Python API是cv2
版本,它简单、快速、灵活。此外,与新API相比,在旧API中使用各种对象也很困难。因此,我建议您更新到新的cv2
API。在旧API中调试错误甚至很困难
您可以在此链接中找到带有新的cv2
API的颜色跟踪代码:
或者,如果您确定要使用旧的API,下面是代码:在python cv2中查找轮廓 import numpy as np import cv2 img = cv2.imread('sample_image.jpg') imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(imgray,127,255,0) _, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img, contours, -1, (0,255,0), 3) cv2.imshow('img',img) cv2.waitKey(0) 将numpy作为np导入 进口cv2 img=cv2.imread('sample_image.jpg')) imgray=cv2.CVT颜色(img,cv2.COLOR\U BGR2GRAY) ret,thresh=cv2。阈值(imgray,127255,0) _,等高线,层次=cv2.findContours(阈值,cv2.RETR\u树,cv2.CHAIN\u近似值\u简单) cv2.等高线图(img,等高线-1,(0255,0),3) cv2.imshow(“img”,img)
cv2.waitKey(0)如果该错误消息已完成,则不会显示任何内容(为什么输入数组的大小不正确?)。只需将您的导入从cv导入更改为
*
,并从函数名和常量中删除前缀“cv”,该示例就可以工作。如果我在具有多个通道的图像上强制使用FindContours
,则得到:cv2.error:[Start]FindContours仅支持8uC1和32sC1图像
。如果OpenCV仍然支持您正在使用的API,请填写错误报告。