2013-05-05 4 views
1

Я пытаюсь использовать OpenCV и Python для обнаружения круговых фигур в захвате веб-камеры. Im используя преобразование Hough для обнаружения круга, которое в нем заняло несколько часов для меня, чтобы выяснить (и который я до сих пор не уверен, действительно ли у меня есть). В любом случае, моя текущая проблема заключается в использовании правильного типа объектов в разных вызовах функций. Я отправил свой код ниже для справки. Когда я запускаю этот код я получаю следующую ошибкуTypeError: ожидается односегментный объект буфера

Traceback (most recent call last): File "test1.py", line 19, in <module> cv.Canny(gray, edges, 50, 200, 3) TypeError: expected a single-segment buffer object

Что это значит? Я попытался посмотреть вокруг разных потоков, чтобы понять это, но я не могу найти подходящего объяснения.

Я новичок в 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) 

ответ

0

Неполный ответ, но ошибка означает, что функция cv.Canny() ожидает один из первых двух аргументов, чтобы быть «одного сегмента буфера», который является неясным название означает «часть памяти, которая смежный». Это может означать, что один из аргументов должен быть, например, просто строкой. Это также может означать, что в изображениях, созданных с помощью cv.CreateImage(), вполне нормально, но только до тех пор, пока на линиях нет прокладки (если есть отступы, он не может быть представлен как единый непрерывный фрагмент памяти). Попробуйте с шириной изображения, кратной некоторой мощности 2, например. a кратное 16.