Python TypeError:应为单段缓冲区对象

Python TypeError:应为单段缓冲区对象,python,opencv,typeerror,hough-transform,Python,Opencv,Typeerror,Hough Transform,我正在尝试使用OpenCV和Python在网络摄像头捕获中检测圆形。我使用Hough变换来检测圆,我自己花了几个小时才弄明白(我仍然不确定我是否真的弄明白了)。无论如何,我当前的问题在于在不同的函数调用中使用正确类型的对象。我已经在下面发布了我的代码以供参考。当我运行这段代码时,我得到以下错误 回溯(最近一次呼叫最后一次): 文件“test1.py”,第19行,在 坎尼等高线(灰色,边缘,50,200,3) TypeError:应为单段缓冲区对象 这是什么意思?我试着环顾不同的线程来找出这个问题

我正在尝试使用OpenCV和Python在网络摄像头捕获中检测圆形。我使用Hough变换来检测圆,我自己花了几个小时才弄明白(我仍然不确定我是否真的弄明白了)。无论如何,我当前的问题在于在不同的函数调用中使用正确类型的对象。我已经在下面发布了我的代码以供参考。当我运行这段代码时,我得到以下错误

回溯(最近一次呼叫最后一次):
文件“test1.py”,第19行,在
坎尼等高线(灰色,边缘,50,200,3)
TypeError:应为单段缓冲区对象

这是什么意思?我试着环顾不同的线程来找出这个问题,但我似乎找不到一个好的解释

我是OpenCV新手,非常感谢您对我的问题原因进行简单的阐述。提前谢谢

import cv
import cv2
import numpy as np

#Starting camera capture
capture = cv.CaptureFromCAM(0)

while True:
    img = cv.QueryFrame(capture)

    #Allocating grayscale- and edge-images
    gray = cv.CreateImage(cv.GetSize(img), 8, 1)
    edges = cv.CreateImage(cv.GetSize(img), 8, 1)

    #Transforming frame to grayscale image
    cv.CvtColor(img, gray, cv.CV_BGR2GRAY)

    #Preprocessing and smoothing
    cv.Erode(gray, gray, None, 2)
    cv.Dilate(gray, gray, None, 2)
    cv.Smooth(gray, gray, cv.CV_GAUSSIAN, 9, 9)

    #Edge detection (I believe this is where the exception is thrown)
    cv.Canny(gray, edges, 50, 200, 3)

    #Transforming original frame and grayscale image to numpy arrays
    img = np.asarray(img[:,:])
    gray = np.asarray(gray[:,:])

    #Detecting circles and drawing them 
    circles = cv2.HoughCircles(gray,cv.CV_HOUGH_GRADIENT,1,10,100,30,5,20)
    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
        cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),1)  # draw the outer circle
        cv2.circle(img,(i[0],i[1]),2,(0,0,255),3)     # draw the center of the circle

    #Transforming original frame back to iplimage format for showing
    img = cv.fromarray(img)

    #Showing image and edge image
    cv.ShowImage("Camera", img)
    cv.ShowImage("Edges",edges)

回答不完整,但该错误意味着函数
cv.Canny()
希望其前两个参数中的一个是“单段缓冲区”,这是一个模糊的名称,表示“一段连续的内存”。例如,这可能意味着其中一个参数实际上应该只是一个字符串。这可能还意味着可以传入使用
cv.CreateImage()
创建的图像,但前提是行上没有填充(如果有填充,则不能表示为单个连续内存)。尝试将图像宽度设置为2的某些幂的倍数,例如16的倍数