2015-07-25 2 views
0

Я пытаюсь найти 2 круга в поле и пометить их из живых данных, которые я получаю с камеры. Проблема в том, что функция houghCircles() не всегда может обнаружить эти круги, даже если их позиция не изменяется. Вот код:Найти круги в реальном времени с openCV и python

import cv2 
import numpy as np 
import time 
wait = 5                   
st = time.clock() 

on=0 
arka=0 
def circleS(): 
    circles = cv2.HoughCircles(img_grs, cv2.HOUGH_GRADIENT, 1, 20, 
       param1=150, 
       param2=35, 
       minRadius=5, 
       maxRadius=30) 
    on=0 
    arka=0 


    if(circles[0,0,2]>circles[0,1,2]): 
     on=(circles[0,0,0],circles[0,0,1]) 
     arka=(circles[0,1,0],circles[0,1,1]) 
    if(circles[0,0,2]<circles[0,1,2]): 
     on=(circles[0,1,0],circles[0,1,1]) 
     arka=(circles[0,0,0],circles[0,0,1]) 
    cv2.circle(img_bgr,on,2,(0,255,0),3) 
    cv2.circle(img_bgr,arka,2,(0,0,255),3) 
    return on,arka 

def takePic(): 
    ret, frame = camera.read() 
    img_bgr = np.copy(frame)               
    frame = None 
    return img_bgr 

camera = cv2.VideoCapture(1) 
while((time.clock()-st)<=wait):             
ret, frame = camera.read()             # Capture a frame 
    #cv2.imshow('Camera Stream',frame)           # Display the captured frame in a window named Camera Stream 
    cv2.waitKey(1) 
cv2.destroyAllWindows() 
while(1):  
    img_bgr=takePic() 
    img_grs = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) 
    ret,img_bin = cv2.threshold(img_grs,220,255,cv2.THRESH_BINARY) 
    corners = cv2.goodFeaturesToTrack(img_bin,9,0.03,3) 
    corners = np.int0(corners) 
    on,arka=np.int0(circleS()) 
    for i in corners: 
     x,y = i.ravel() 
     if(x>=arka[0]+15 or x<=arka[0]-15 or y>=arka[1]+15 or y<=arka[1]-15): 
      cv2.circle(img_grs,(x,y),3,255,-1) 
    cv2.imshow("Camera Stream",img_bgr) 
    cv2.waitKey(10) 
    img_bgr = None 
    img_grs= None 
    time.sleep(5) 


camera.release() 
cv2.imshow("bin",img_bgr) 

cv2.waitKey(0) 
cv2.destroyAllWindows() 

Ошибка, которую я получаю, является индексом из-за границ из-за массива кругов. Что случилось?

ответ

0

Ошибка индекса за пределами окружности в том, что cv2.HoughCircles() может возвращать пустой массив кругов, когда он не находит ни одного круга (как вы упомянули).

Put дополнительной проверки после cv2.HoughCircles() вызов:

if len(circles) > 0: 
    # your circle stuff 
Смежные вопросы