Warm tip: This article is reproduced from serverfault.com, please click

Error when performing Hough circle transformation on OpenCV-python

发布于 2020-11-27 21:07:59

The code below is intended to perform a Hough Circle transformation on a video. The code works as intended when a frame from the video is extracted and an Hough Circle transformation is performed. However, when I try to replicate the similar method to produce a video I get this error loop of ufunc does not support argument 0 of type NoneType which has no callable rint method. The cause of this error seems to be below the while loop. What could be the cause of this issue?

Many thanks in advance.

Update: I have changed my blurred = cv2.medianBlur(dframe, 25) to blurred = cv2.GaussianBlur(dframe,(11,11),0). This seem to work for a moment but then the code crashes to give me the same error.

import numpy as np 
import cv2 
import matplotlib.pyplot as plt 

np.random.seed(42)

def fixColor(image):
    return(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))
    
video = cv2.VideoCapture("video.wmv")

#randomly select frames in an array 
frameIds = video.get(cv2.CAP_PROP_FRAME_COUNT) *np.random.uniform(size = 55)

#store selected frames in an array 
frames = []
for fid in frameIds:
    video.set(cv2.CAP_PROP_FRAME_COUNT,fid)
    ret, frame = video.read()
    frames.append(frame)
    
video.release()

#calculate the median frame
medianFrame = np.median(frames,axis=0).astype(dtype=np.uint8)

#random sample 
sample_frame = frames[0]

#convert to grayscale
grayMedianFrame = cv2.cvtColor(medianFrame, cv2.COLOR_BGR2GRAY)
graySample = cv2.cvtColor(sample_frame, cv2.COLOR_BGR2GRAY)

#subtract grayscale frames between sample and median
dframe = cv2.absdiff(graySample, grayMedianFrame)

blurred = cv2.medianBlur(dframe, 25)
#plt.imshow(fixColor(blurred))

#Hough circle 
circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT,1,120,param1= 50, param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))

for i in circles[0, :]:   
    # draw outer circle
    cv2.circle(sample_frame, (i[0], i[1]), i[2], (0, 255, 0), 2)
    # draw center of circle
    cv2.circle(sample_frame, (i[0], i[1]), 2, (0, 255, 0), 9)

plt.imshow(sample_frame,cmap="gray") #outputs image from sample frame with Hough circle

#write in new video
writer = cv2.VideoWriter("output_hough.mp4",cv2.VideoWriter_fourcc(*"MP4V"),30,(512,512))

video = cv2.VideoCapture("video.wmv")
total_frames = video.get(cv2.CAP_PROP_FRAME_COUNT)

frameCnt = 0
 
########## CODE WORKS FINE UNTIL THIS POINT ##############

while(frameCnt < total_frames-1):
    frameCnt +=1  
    ret, frame = video.read()  #read frame 1 by 1 
    
    gframe = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #grayscale frame
    dframe = cv2.absdiff(gframe, grayMedianFrame)  #remove background
    blurred = cv2.medianBlur(dframe, 25)  #blur
  
    #Hough transformation
    circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT,1,120,param1= 50, param2=30,minRadius=0,maxRadius=0)
    circles = np.uint16(np.around(circles))
    
    for i in circles[0, :]:   
        # draw outer circle
        cv2.circle(frame, (i[0], i[1]), i[2], (0, 255, 0), 2)
        # draw center of circle
        cv2.circle(frame, (i[0], i[1]), 2, (0, 255, 0), 9)

    writer.write(cv2.resize(frame,(512,512))) #write frame into output vid
    
video.release()
writer.release()
Questioner
GitGoodCodes
Viewed
0
Lior Cohen 2020-11-29 02:52:39

You did not show the full stack and the exact line that is throwing the error. But, looking at your code I guess the problem lies in:

circles = np.uint16(np.around(circles))

What happens is that cv2.HoughCircles can return None if it can not find circles, then np.around is not working with None.

What you should do is check first that you got your circles by if circles is not None: