Python-OpenCv FindContours

时间:2012-12-29 20:56:16

标签: python image-processing opencv

我尝试在二进制图像中找到轮廓但是当尝试执行cvFindContours时它会给我错误信息

  

回溯(最近一次呼叫最后一次):文件" convert.py",第30行,in          contour = cvFindContours(img2,storage,cv.CV_RETR_CCOMP,cv.CV_CHAIN_APPROX_SIMPLE)文件   " /usr/lib/pymodules/python2.7/opencv/cv.py" ;,第580行,在   cvFindContours       count,seq = cvFindContoursUntyped(* args)File" /usr/lib/pymodules/python2.7/opencv/cv.py" ;, line 6521,in   cvFindContoursUntyped       return _cv.cvFindContoursUntyped(* args)RuntimeError:openCV错误:           Status =输入数组的大小不正确           function name = cvStartFindContours           错误消息=           FILE_NAME = /建造/ 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)

我的原始和二进制图像

原始图片 http://tinypic.com/r/34rul9x/6

和蓝色过滤的二进制图像 http://tinypic.com/r/ifbotx/6

2 个答案:

答案 0 :(得分:1)

在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)

答案 1 :(得分:0)

我认为这种API风格已从OpenCV中停止。目前有两个API,旧的cv

获得
>>> import cv2.cv as cv

第二个和新的cv2可用:

>>> import cv2

关于错误:

将导入语句替换为from cv2.cv import *

然后删除所有cv前缀,它应该可以正常工作。

注意:

我认为您正在尝试对象进行颜色跟踪。

但是既然你有OpenCV 2.3.1,为什么要使用非常古老的Python API?

新的Python API是cv2版本,简单,快速和灵活。此外,与新API相比,在旧API中很难使用各种对象。因此,我建议您更新到新的cv2 API。旧API中的调试错误甚至很难。

您可以在此链接中找到包含新cv2 API的颜色跟踪代码:http://goo.gl/db2KW

或者,如果您确定使用旧API,则代码为:http://goo.gl/AFEmv