【问题标题】:Python-OpenCv FindContoursPython-OpenCv FindContours
【发布时间】:2012-12-14 16:24:28
【问题描述】:

我尝试在二进制图像中查找轮廓,但是当尝试执行 cvFindContours 时,它给了我错误消息

Traceback(最近一次调用最后一次):文件“convert.py”,第 30 行,在 轮廓= cvFindContours(img2,存储,cv.CV_RETR_CCOMP,cv.CV_CHAIN_APPROX_SIMPLE)文件 “/usr/lib/pymodules/python2.7/opencv/cv.py”,第 580 行,在 cvFindContours 计数,序列 = cvFindContoursUntyped(*args)文件“/usr/lib/pymodules/python2.7/opencv/cv.py”,第 6521 行,在 cvFindContoursUntyped 返回 _cv.cvFindContoursUntyped(*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)

我的原始和二值图像

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

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

【问题讨论】:

  • 如果该错误消息是完整的,那么它什么也没说(为什么输入数组的大小不正确?)。只需将您的导入更改为from cv import *,并从函数名称和常量中删除前缀“cv”,该示例就可以工作。如果我在具有多个通道的图像上强制使用FindContours,那么我得到:cv2.error: [Start]FindContours support only 8uC1 and 32sC1 images。如果 OpenCV 仍然支持您使用的 API,请填写错误报告。

标签: python image-processing opencv


【解决方案1】:

在 python cv2 中查找轮廓

将 numpy 导入为 np 导入简历2 img = cv2.imread('sample_image.jpg') imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,thresh = cv2.threshold(imgray,127,255,0) _,轮廓,层次结构 = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img, 轮廓, -1, (0,255,0), 3) cv2.imshow('img',img) cv2.waitKey(0)

【讨论】:

    【解决方案2】:

    我认为这种 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

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2020-12-21
      • 2016-07-06
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多