Python OpenCv FindOntours

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

我尝试在二值图像中查找轮廓,但当尝试执行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

这是我的源代码

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,请填写错误报告。